【问题标题】:Reading parquet file from AWS S3 using pandas使用 pandas 从 AWS S3 读取镶木地板文件
【发布时间】:2019-12-07 17:29:56
【问题描述】:

我尝试从 AWS S3 读取镶木地板文件。

同样的代码可以在我的 windows 机器上运行。

Google 搜索没有结果。

Pandas 应该使用 fastparquet 来构建数据框。 fastparquet 已安装。

代码:

import boto3
import pandas as pd


def get_parquet_from_s3(bucket_name, file_name):
    """
    :param bucket_name:
    :param file_name:
    :return:
    """
    df = pd.read_parquet('s3://{}/{}'.format(bucket_name, file_name))
    print(df.head())

get_parquet_from_s3('my_bucket_name','my_file_name')

我得到以下异常:

/home/ubuntu/.local/lib/python3.6/site-packages/numba/errors.py:131: UserWarning: Insufficiently recent colorama version found. Numba requires colorama >= 0.3.9
  warnings.warn(msg)
Traceback (most recent call last):
  File "test_pd_read_parq.py", line 15, in <module>
    get_parquet_from_s3('my_bucket_name','my_file_name')
  File "test_pd_read_parq.py", line 12, in get_parquet_from_s3
    df = pd.read_parquet('s3://{}/{}'.format(bucket_name, file_name))
  File "/home/ubuntu/.local/lib/python3.6/site-packages/pandas/io/parquet.py", line 294, in read_parquet
    return impl.read(path, columns=columns, **kwargs)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/pandas/io/parquet.py", line 192, in read
    parquet_file = self.api.ParquetFile(path, open_with=s3.s3.open)
AttributeError: 'S3File' object has no attribute 's3'

软件和操作系统版本

python        : 3.6  
pandas        : 0.25.0
s3fs          : 0.3.1
ubuntu        : 18.04
fastparquet   : 0.3.1
boto3         : 1.9.198
botocore      : 1.12.198

解决方法

import s3fs
from fastparquet import ParquetFile

def get_parquet_from_s3(bucket_name, file_name
    s3 = s3fs.S3FileSystem()
    pf = ParquetFile('{}/{}'.format(bucket_name, file_name), open_with=s3.open)
    df = pf.to_pandas()

【问题讨论】:

  • 我猜这与boto3botocorefastparquet 的版本有关——即使您拥有最新版本,它们也可能会发生冲突(这种情况在我身上经常发生在 fastparquet vs. botocore)。
  • 或者,您可以尝试使用s3fs 打开文件并将文件对象传递给pandas.read_parquet
  • 我已经用我找到的解决方法更新了帖子(感谢 michio1234)

标签: pandas amazon-s3 parquet fastparquet


【解决方案1】:

对于 python 3.6+,AWS 有一个名为 aws-data-wrangler 的库,它有助于 Pandas/S3/Parquet 之间的集成

安装做;

pip install awswrangler

从 s3 读取 parquet 做;

import awswrangler as wr
df = wr.pandas.read_parquet(path="s3://my-bucket/my/path/to/parquet-file.parquet")

【讨论】:

    【解决方案2】:

    您可以使用 s3fs 和 Pyarrow 从 S3 读取 parquet 文件,如下所示。

    import s3fs
    
    import pyarrow.parquet as pq
    
    s3 = s3fs.S3FileSystem()
    
    pandas_dataframe=pq.ParquetDataset('s3://bucket/file.parquet',filesystem=s3).read_pandas().to_pandas()
    

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 2017-01-22
      • 1970-01-01
      • 2020-01-07
      • 2019-10-27
      • 2018-08-13
      • 2018-05-06
      • 2021-10-20
      • 1970-01-01
      相关资源
      最近更新 更多