Цель состоит в том, чтобы объединить несколько файлов паркета в одну таблицу Athena, чтобы я мог запрашивать их.
Я конвертировал два паркетных файла из csv:
pandas.read_csv('a.csv').to_parquet('a.parquet', index=False)
pandas.read_csv('b.csv').to_parquet('b.parquet', index=False)
CSV имеет формат id,name,age
, например:
1,john,20
2,mark,25
Я загружаю их в корзину S3: s3://my-test-bucket
, которая устроена так:
my-test-bucket
-> folder1
-> a.parquet
-> folder2
-> b.parquet
Затем создал таблицу в Афине через:
CREATE EXTERNAL TABLE `my_table`(
`id` int,
`name` string,
`age` int
)
STORED AS PARQUET
LOCATION 's3://my-test-bucket'
tblproperties ("parquet.compress" = "SNAPPY");
Однако, когда я пытаюсь запросить таблицу через:
SELECT * FROM my_table;
В качестве возврата я получаю пустые строки. Есть ли что-то, чего мне не хватает?
@Roberto Я пытался преобразовать в DF pyarrow, а затем в паркет. Но результат тот же.
Возможный обходной путь — использование Обработчик данных AWS:
import awswrangler as wr
path = 's3://my-test-bucket'
# Assume the data has been extracted in dict form from .csv
df = pd.DataFrame({
"id": [1, 2],
"name": ["John", "Jane"],
"age": [10, 11],
"folder": [1, 2]
})
wr.s3.to_parquet(
df=df,
path=path,
dataset=True,
mode = "overwrite",
partition_cols=["folder"]
)
Это сгенерирует в s3:
my-test-bucket
-> folder=1
-> <some hash>.parquet
-> folder=2
-> <some hash>.parquet
Похоже, проблема с вашим паркетным файлом. То, как вы делаете что-то после создания файла паркета (создание таблицы и т. д.), выглядит правильно. Честно говоря, я никогда не пытался использовать файл паркета, сгенерированный напрямую из pandas (я думаю, что это доставляло мне проблемы в прошлом). Вместо этого, когда у меня был pandas DF, я просто преобразовал его в pyarrow DF, а затем записал в паркет. Это сработало для меня, если вы хотите попробовать.