将具有不合规字段名称的 Parquet 文件导入 AWS Athena

问题描述 投票:0回答:2

我需要从 Parquet 文件设置 Athena 表,其中某些列的名称不符合 Athena 的 SQL 方言,例如:

  • 超过128个字符
  • 多列的名称仅大小写不同

有没有办法调整 Parquet 文件字段映射到

CREATE EXTERNAL TABLE
语句中的 SQL 列名称的方式,而不更改底层文件,例如通过 SERDEPROPERTIES?

sql hive parquet amazon-athena presto
2个回答
0
投票

不幸的是,您可以采取一些措施来解决此问题。对我来说最可行的是额外的数据处理层。 如果可以,请创建一个 AWS Glue ETL 作业来读取 Parquet 文件,根据需要重命名列,并将数据写回具有合规架构的新位置中的 S3。然后,您可以创建一个指向这个新位置的 Athena 表。

此方法涉及额外的数据处理步骤和可能的重复存储(原始数据集和转换后的数据集),但它在模式管理方面提供了最大的灵活性。


0
投票

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 用户指南中。

© www.soinside.com 2019 - 2024. All rights reserved.