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.
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')]
)