当前位置: 首页 > 面试题库 >

如何使用pyarrow从S3中读取作为pandas数据框的实木复合地板文件列表?

夏季萌
2023-03-14
问题内容

我有一种使用boto3(1.4.4),pyarrow(0.4.1)和pandas(0.20.3)实现此目的的方法。

首先,我可以像这样在本地读取单个实木复合地板文件:

import pyarrow.parquet as pq

path = 'parquet/part-r-00000-1e638be4-e31f-498a-a359-47d017a0059c.gz.parquet'
table = pq.read_table(path)
df = table.to_pandas()

我还可以像这样在本地读取实木复合地板文件的目录:

import pyarrow.parquet as pq

dataset = pq.ParquetDataset('parquet/')
table = dataset.read()
df = table.to_pandas()

两者都像魅力。现在,我想使用存储在S3存储桶中的文件远程实现相同的目的。我希望这样的事情行得通:

dataset = pq.ParquetDataset('s3n://dsn/to/my/bucket')

但这不是:

OSError: Passed non-file path: s3n://dsn/to/my/bucket

在彻底阅读了pyarrow的文档之后,目前看来这是不可能的。因此,我提出了以下解决方案:

从S3读取单个文件并获取熊猫数据框:

import io
import boto3
import pyarrow.parquet as pq

buffer = io.BytesIO()
s3 = boto3.resource('s3')
s3_object = s3.Object('bucket-name', 'key/to/parquet/file.gz.parquet')
s3_object.download_fileobj(buffer)
table = pq.read_table(buffer)
df = table.to_pandas()

在这里,我的hacky尚未经过优化,但可以通过S3文件夹路径创建pandas数据框:

import io
import boto3
import pandas as pd
import pyarrow.parquet as pq

bucket_name = 'bucket-name'
def download_s3_parquet_file(s3, bucket, key):
    buffer = io.BytesIO()
    s3.Object(bucket, key).download_fileobj(buffer)
    return buffer

client = boto3.client('s3')
s3 = boto3.resource('s3')
objects_dict = client.list_objects_v2(Bucket=bucket_name, Prefix='my/folder/prefix')
s3_keys = [item['Key'] for item in objects_dict['Contents'] if item['Key'].endswith('.parquet')]
buffers = [download_s3_parquet_file(s3, bucket_name, key) for key in s3_keys]
dfs = [pq.read_table(buffer).to_pandas() for buffer in buffers]
df = pd.concat(dfs, ignore_index=True)

有没有更好的方法来实现这一目标?也许某种使用pyarrow的熊猫连接器?我想避免使用pyspark,但是如果没有其他解决方案,那么我会接受。


问题答案:

您应该使用yjk21s3fs建议的模块。但是,由于调用ParquetDataset的结果,您将获得pyarrow.parquet.ParquetDataset对象。要获取PandasDataFrame,您宁愿应用到它:.read_pandas().to_pandas()

import pyarrow.parquet as pq
import s3fs
s3 = s3fs.S3FileSystem()

pandas_dataframe = pq.ParquetDataset('s3://your-bucket/', filesystem=s3).read_pandas().to_pandas()


 类似资料:
  • 问题内容: 我正在寻找使用python从s3的多个分区目录中读取数据的方法。 data_folder / serial_number = 1 / cur_date = 20-12-2012 / abcdsd0324324.snappy.parquet data_folder / serial_number = 2 / cur_date = 27-12-2012 / asdsdfsd0324324.

  • 问题内容: 我需要从AWS S3读取实木复合地板数据。如果我为此使用aws sdk,则可以得到如下输入流: 但是apache木地板阅读器仅使用本地文件,如下所示: 所以我不知道如何解析实木复合地板文件的输入流。例如,对于csv文件,存在使用inputstream的CSVParser。 我知道使用Spark实现此目标的解决方案。像这样: 但是我不能使用火花。 谁能告诉我从s3读取镶木地板数据的任何解

  • 我正在尝试使用火花在S3文件中生成拼花文件,目的是稍后可以使用presto从拼花中查询。基本上,它看起来是这样的, <代码>Kafka- 我能够使用Spark在S3中生成拼花并且工作正常。现在,我正在查看presto,我想我发现它需要hive meta store才能从拼花中查询。即使拼花保存模式,我也无法让presto读取我的拼花文件。那么,这是否意味着在创建拼花文件时,火花作业还必须将元数据存

  • 问题内容: Spark解释实木复合地板的列的方式存在一些问题。 我有一个具有已确认架构的Oracle源(df.schema()方法): 然后将其另存为Parquet-df.write()。parquet()方法-具有相应的消息类型(由Spark确定): 然后,我的应用程序使用HashMap生成表DDL以进行类型转换,例如: 我的问题是Impala无法读取该表,因为它不接受LM_PERSON_ID作

  • 问题内容: 如何使用Pandas读取以下(两列)数据(来自.dat文件) 列分隔符(至少)为2个空格。 我试过了 但它打印 问题答案: 您可以将参数usecols与列顺序一起使用: 编辑: 您可以使用分隔符-2个或更多空格,然后添加,因为出现警告: ParserWarning:回退到“ python”引擎,因为“ c”引擎不支持正则表达式分隔符(分隔符> 1个字符且与“ \ s +”不同的分隔符被

  • 问题内容: 使用 在Pandas 0.25之前,此方法适用。 现在,已弃用警告。 骨髓如何运作?而且,我如何使pyarrow对象进出Redis。 问题答案: 这是一个使用pyarrow序列化熊猫数据帧以存储在Redis中的完整示例 然后在python中 我刚刚向熊猫提交了PR 28494,以便在文档中包含这个pyarrow示例。