我从 pandas Dataframe 开始并保存为 parquet 格式,如下所示:
import pandas as pd
df = pd.DataFrame([
{'abc': 1.231, 'xyz':2, 'jkl': False, 'idx': 'first row', 'date': '2023-12-01'},
{'abc': 9.123, 'xyz':5, 'jkl': True, 'idx': '2nd row', 'date': '2023-12-04'}
])
df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d')
df.to_parquet('x.parq')
当我使用
parquet-cli
检查架构时,它显示:
parq x.parq --schema
[出]:
# Schema
<pyarrow._parquet.ParquetSchema object at 0x7f9f4b365400>
required group field_id=-1 schema {
optional double field_id=-1 abc;
optional int64 field_id=-1 xyz;
optional boolean field_id=-1 jkl;
optional binary field_id=-1 idx (String);
optional int64 field_id=-1 date (Timestamp(isAdjustedToUTC=false, timeUnit=microseconds, is_from_converted_type=false, force_set_converted_type=false));
}
然后将 parquet 文件保存到
s3://mybucket/
,当我尝试在 AWS Athena 中创建表时,例如
CREATE EXTERNAL TABLE IF NOT EXISTS `mydb`.`table1` (
abc float,
xyz int,
jkl boolean,
idx string,
date date
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.paruqet.MapredParquetOutputFormat'
LOCATION 's3://mybucket/'
TBLPROPERTIES ('classification' = 'parquet');
查询运行成功并且没有显示错误。然后当我尝试查询该表时,
SELECT * from mydb.table1;
显示错误:
HIVE_CURSOR_ERROR: Failed to read Parquet file s3://mybucket/x.parq
CTAS 查询是否写错了?类型定义错误?
如何正确将 parquet 文件转换为可以查询的 Athena 表?
是否有更简单的方法将 pandas 数据框写入 parquet 或任何其他格式,以便可以轻松地将其读取为 athena 表?
您可以改用适用于 Pandas 的 AWS 开发工具包。
wr.s3.to_parquet(
df=df,
path="s3://bucket/dataset/",
dataset=True,
database="my_db",
table="my_table"
)
然后
wr.athena.read_sql_query(
"SELECT * FROM my_table",
database="my_db",
ctas_approach=False
)
参考:https://aws-sdk-pandas.readthedocs.io/en/stable/tutorials/006%20-%20Amazon%20Athena.html