我需要从 Parquet 文件设置 Athena 表,其中某些列的名称不符合 Athena 的 SQL 方言,例如:
有没有办法调整 Parquet 文件字段映射到
CREATE EXTERNAL TABLE
语句中的 SQL 列名称的方式,而不更改底层文件,例如通过 SERDEPROPERTIES?
不幸的是,您可以采取一些措施来解决此问题。对我来说最可行的是额外的数据处理层。 如果可以,请创建一个 AWS Glue ETL 作业来读取 Parquet 文件,根据需要重命名列,并将数据写回具有合规架构的新位置中的 S3。然后,您可以创建一个指向这个新位置的 Athena 表。
此方法涉及额外的数据处理步骤和可能的重复存储(原始数据集和转换后的数据集),但它在模式管理方面提供了最大的灵活性。
Athena 可以配置为通过数字索引访问字段,从而完全忽略 Parquet 文件中给出的名称。为此,请设置 SerDes 属性
'parquet.column.index.access'='true'
。示例:
CREATE EXTERNAL TABLE `source_data_IDX`(
`0` string,
`1` bigint,
`2` double,
`3` bigint,
`4` string,
`5` string
)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
WITH SERDEPROPERTIES (
'parquet.column.index.access'='true')
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
's3://test-data/students_grades_dataset'
TBLPROPERTIES (
'classification'='parquet',
'compressionType'='none',
'projection.enabled'='false',
'typeOfData'='file')
然后可以使用列号和可选的别名来查询它们,这些别名不需要符合 Athena 对列名称的限制,例如:
SELECT "0" "NAME", "1" "age", "5" "name",
"2" "34gggggggggggggggHgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg"
FROM "test_database"."source_data_idx" limit 10;
此解决方案适用于 Parquet 和 ORC 文件,并记录在 Athena 用户指南中。