【问题标题】:Read ORC file from S3 to Pandas从 S3 读取 ORC 文件到 Pandas
【发布时间】:2020-09-21 10:40:35
【问题描述】:

我正在尝试将 s3 中的 orc 文件读入 Pandas 数据帧。在我的 pandas 版本中,没有 pd.read_orc(...)。

我尝试过这样做:

session = boto3.Session()
s3_client = session.client('s3')

s3_key = "my_object_key"


data = s3_client.get_object(
    Bucket='my_bucket',
    Key=s3_key
)

orc_bytes = data['Body'].read()

将对象读取为字节。

现在我尝试这样做:

orc_data = pyorc.Reader(orc_bytes)

但它失败了,因为:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-11-deaabe8232ce> in <module>
----> 1 data = pyorc.Reader(orc_data)

/anaconda3/envs/linear_opt_3.7/lib/python3.7/site-packages/pyorc/reader.py in __init__(self, fileo, batch_size, column_indices, column_names, struct_repr, converters)
     65             conv = converters
     66         super().__init__(
---> 67             fileo, batch_size, column_indices, column_names, struct_repr, conv
     68         )
     69 

TypeError: Parameter must be a file-like object, but `<class 'bytes'>` was provided

最终我想将它作为 .csv 或我可以读入 pandas 的内容。有没有更好的方法来做到这一点?

【问题讨论】:

    标签: python pandas amazon-s3 orc


    【解决方案1】:

    尝试将 S3 数据包装在 io.BytesIO 中:

    import io
    
    orc_bytes = io.BytesIO(data['Body'].read())
    orc_data = pyorc.Reader(orc_bytes)
    

    【讨论】:

    • 那行得通。所以现在我有一个有效的兽人阅读器,但我如何在熊猫中阅读呢?也许我应该开始一个新线程。
    【解决方案2】:

    这是端到端解决问题的函数:

    import boto3
    import pyorc
    import io
    import pandas as pd
    
    session = boto3.Session()
    s3_client = session.client('s3')
    
    def load_s3_orc_to_local_df(key, bucket):
        data = s3_client.get_object(Bucket=bucket, Key=key)
        orc_bytes = io.BytesIO(data['Body'].read())   
        reader = pyorc.Reader(orc_bytes)
        schema = reader.schema
        columns = [item for item in schema.fields]
        rows = [row for row in reader]   
        df = pd.DataFrame(data=rows, columns=columns)
        return df
    

    【讨论】:

      猜你喜欢
      • 2017-08-14
      • 1970-01-01
      • 2020-03-02
      • 2015-08-27
      • 2017-08-07
      • 2017-09-07
      • 2015-12-19
      • 2016-06-18
      • 2019-12-07
      相关资源
      最近更新 更多