0

语境

我在 S3 中对 Parquet 文件进行了分区。我想读取它们并将它们连接到一个 DataFrame 中,以便我可以查询和查看数据(在内存中)。到目前为止我已经这样做了,但是类型为 (array<array< double >>)的列数据之一被转换为None其他列(如 str、int 数组等)被正确转换。我不确定我在这个过程中缺少什么。我想在这个转换过程中数据丢失了,或者数据在那里并且我的查询方法是错误的。

到目前为止我所做的步骤

import s3fs
import fastparquet as fp
import pandas as pd

key = 'MyAWSKey'
secret = 'MyAWSSecret'
token = 'MyAWSToken'

s3_file_system = s3fs.S3FileSystem(secret= secret, token=token, key=key)
file_names = s3_file_system.glob(path='s3://.../*.snappy.parquet')

# <class 'fastparquet.api.ParquetFile'>
fp_api_parquetfile_obj = fp.ParquetFile(files, open_with= s3_file_system.open) 

data = fp_api_parquetfile_obj.to_pandas()

查询结果

# column A type is array of array of doubles
print(pd.Series(data['A']).head(10))
# Prints 10 rows of None! [Incorrect]

# column B type is array of int
print(pd.Series(data['B']).head(10))
# Prints 10 rows of array of int values correctly

# column C type is string
print(pd.Series(data['C']).head(10))
# Prints 10 rows of str values correctly

请注意,文件中存在数据(双精度数组的数组),因为我可以使用 Athena 查询它。

4

1 回答 1

0

我找不到任何方法让fastparquet读取数组列的数组;相反,我使用了不同的库(pyarrow)并且它有效!

import s3fs
import pandas as pd
import pyarrow.parquet as pq

key = 'MyAWSKey'
secret = 'MyAWSSecret'
token = 'MyAWSToken'

s3_file_system = s3fs.S3FileSystem(secret= secret, token=token, key=key)
file_names = s3_file_system.glob(path='s3://.../*.snappy.parquet')

data_frames = [pq.ParquetDataset('s3://' + f, filesystem= s3_file_system).read_pandas().to_pandas() for f in files]

data = pd.concat(data_frames,ignore_index=True)

# column A type is array of array of doubles
print(pd.Series(data['A']).head(10))
# Prints 10 rows of array of arrays correctly
于 2020-09-06T18:20:25.347 回答