[英]Read many parquet files from S3 to pandas dataframe
我已經研究這個話題幾天了,但還沒有想出一個可行的解決方案。 如果這個問題是重復的,我深表歉意(盡管我已經檢查過類似的問題,但還沒有找到正確的問題)。
我有一個 s3 桶,里面有大約 150 個鑲木地板文件。 我一直在尋找一種將所有這些文件引入一個 dataframe 的動態方法(如果計算效率更高,可以是多個)。 如果所有這些鑲木地板都附加到一個 dataframe,那將是一個非常大的數據量,所以如果解決這個問題只是我需要更多的計算能力,請告訴我。 我最終偶然發現了 awswrangler,並使用了下面的代碼,它一直按預期運行:
df = wr.s3.read_parquet(path="s3://my-s3-data/folder1/subfolder1/subfolder2/", dataset=True, columns = df_cols, chunked=True)
這段代碼一直在返回一個生成器 object,我不確定如何進入 dataframe。我已經嘗試了鏈接頁面(下面)的解決方案並返回了各種錯誤,例如文件路徑無效和長度不匹配。
https://newbedev.com/create-a-pandas-dataframe-from-generator
https://aws-data-wrangler.readthedocs.io/en/stable/stubs/awswrangler.s3.read_parquet.html
我嘗試的另一個解決方案來自https://www.py4u.net/discuss/140245 :
import s3fs
import pyarrow.parquet as pq
fs = s3fs.S3FileSystem()
bucket = "cortex-grm-pdm-auto-design-data"
path = "s3://my-bucket/folder1/subfolder1/subfolder2/"
# Python 3.6 or later
p_dataset = pq.ParquetDataset(
f"s3://my-bucket/folder1/subfolder1/subfolder2/",
filesystem=fs
)
df = p_dataset.read().to_pandas()
這導致錯誤“'AioClientCreator' object 沒有屬性'_register_lazy_block_unknown_fips_pseudo_regions'”
最后,我還嘗試了https://newbedev.com/how-to-read-a-list-of-parquet-files-from-s3-as-a-pandas-dataframe-using-pyarrow中的許多鑲木地板解決方案:
# Read multiple parquets from a folder on S3 generated by spark
def pd_read_s3_multiple_parquets(filepath, bucket, s3=None,
s3_client=None, verbose=False, **args):
if not filepath.endswith('/'):
filepath = filepath + '/' # Add '/' to the end
if s3_client is None:
s3_client = boto3.client('s3')
if s3 is None:
s3 = boto3.resource('s3')
s3_keys = [item.key for item in s3.Bucket(bucket).objects.filter(Prefix=filepath)
if item.key.endswith('.parquet')]
if not s3_keys:
print('No parquet found in', bucket, filepath)
elif verbose:
print('Load parquets:')
for p in s3_keys:
print(p)
dfs = [pd_read_s3_parquet(key, bucket=bucket, s3_client=s3_client, **args)
for key in s3_keys]
return pd.concat(dfs, ignore_index=True)
df = pd_read_s3_multiple_parquets('path/to/folder', 'my_bucket')
這個返回沒有在路徑中找到鑲木地板(我確定這是錯誤的,當我訪問實際的 s3 時鑲木地板都在那里),以及錯誤“沒有要連接的對象”
再次非常感謝您提供的任何指導。 對我的問題中的任何重復表示歉意。 先感謝您。
AWS data wrangler無縫運行,我已經使用過它。
# this is running on my laptop
import numpy as np
import pandas as pd
import awswrangler as wr
# assume multiple parquet files in 's3://mybucket/etc/etc/'
s3_bucket_uri = 's3://mybucket/etc/etc/'
df = wr.s3.read_parquet(path=s3_bucket_daily)
# df is a pandas DataFrame
包含您的用例的示例的 AWS 文檔位於: https://aws-data-wrangler.readthedocs.io/en/stable/stubs/awswrangler.s3.read_parquet.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.