Чтение секционированных файлов Parquet в DataFame на Python (в памяти), где тип столбца — массив массива

#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?