#python #pandas #dataframe #parquet #fastparquet
#python #pandas #dataframe #parquet #fastparquet
Вопрос:
Контекст
У меня есть секционированные файлы Parquet в S3. Я хочу прочитать и объединить их в DataFrame, чтобы я мог запрашивать и просматривать данные (в памяти). Я делал это до сих пор, однако данные одного из столбцов с типом (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.
Ответ №1:
Я не смог найти никаких способов заставить 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
Комментарии:
1. Как вы также получаете секционированный столбец в качестве столбца в ur data?