web-dev-qa-db-fra.com

Utilisation des prédicats pour filtrer des rangées de Pyarrow.Parquet.Parquet.ParquetTataSett

J'ai un jeu de données de parquet stocké sur S3 et je voudrais interroger des lignes spécifiques de l'ensemble de données. J'ai pu faire cela en utilisant petastorm mais maintenant je veux faire cela en utilisant uniquement pyarrow.

Voici ma tentative:

import pyarrow.parquet as pq
import s3fs

fs = s3fs.S3FileSystem()

dataset = pq.ParquetDataset(
    'analytics.xxx', 
    filesystem=fs, 
    validate_schema=False, 
    filters=[('event_name', '=', 'SomeEvent')]
)

df = dataset.read_pandas().to_pandas()

Mais cela renvoie A pandas Dataframe comme si le filtre n'a pas fonctionné, c'est-à-dire que j'ai des lignes avec différentes valeurs de event_name. Y a-t-il quelque chose qui me manque ou quelque chose que j'ai mal compris? Je pourrais filtrer après avoir obtenu le pandas Dataframe mais j'utiliserais beaucoup plus d'espace mémoire que nécessaire.

7
kluu

Pour python 3.6+ AWS a une bibliothèque appelée AWS-Data-Wrangler qui aide à l'intégration entre Pandas/S3/Parquet et vous permet de filtrer sur les touches S3 partitionnées.

installer faire;

pip install awswrangler

Pour réduire les données que vous avez lues, vous pouvez filtrer des lignes en fonction des colonnes partitionnées de votre fichier de parquet stocké sur S3. Pour filtrer les lignes de la colonne partitionnée event_name avec la valeur "SomeEvent" faire;

pour Awswrangler <1.0.0

import awswrangler as wr

df = wr.pandas.read_parquet(
         path="s3://my-bucket/my/path/to/parquet-file.parquet",
         columns=["event_name"], 
         filters=[('event_name', '=', 'SomeEvent')]
)

pour Awswrangler> 1.0.0 faire;

import awswrangler as wr

df = wr.s3.read_parquet(
         path="s3://my-bucket/my/path/to/parquet-file.parquet",
         columns=["event_name"], 
         filters=[('event_name', '=', 'SomeEvent')]
)
3
Vincent Claes