簡體   English   中英

從 S3 讀取許多 parquet 文件到 pandas dataframe

[英]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

從生成器創建一個 pandas DataFrame?

我嘗試的另一個解決方案來自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無縫運行,我已經使用過它。

  • 通過 pip 或 conda 安裝。
  • 讀取多個 parquet 文件是一行代碼:請參見下面的示例。
  • Creds 會自動從您的環境變量中讀取。
# 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM