从S3读取ORC文件到Pandas

问题描述 投票:0回答:2

我想把一个orc文件从s3读到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
2个回答
1
投票

试着将S3数据封装在一个 io.BytesIO:

import io

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

0
投票

这就是解决这个问题的函数,端到端。

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
© www.soinside.com 2019 - 2024. All rights reserved.