上下文
我已经在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查询它。
我找不到任何方法让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