使用 Athena 查询ApacheHudi数据集 - Amazon Athena
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

使用 Athena 查询ApacheHudi数据集

ApacheHudi(奥沙特) 是一个开源数据管理框架,可简化增量数据处理。记录级别的插入、更新、追加和删除操作将进行更细致的处理,从而减少开销。Upsert 是指如果记录不存在,则能够将其插入现有数据集中,或者可以更新。

Hudi在处理数据插入和更新事件时不会创建许多可能导致分析性能问题的小文件。ApacheHudi自动跟踪更改并合并文件,使其保持最佳大小。这避免了构建可监控并将许多小文件重新写入到较少大文件中的自定义解决方案的需要。

Hudi数据集适用于以下使用案例:

由Hudi管理的数据集使用开放存储格式存储在S3中。目前, Athena 可以读取压缩的Hudi数据集,但不能写入Hudi数据。 Athena 使用ApacheHudi版本0.5.2-Unubing,但可能会更改。有关此Hudi版本的详细信息,请参阅 apache/hudi版本-0.5.2 GitHub.com上。

Hudi数据集存储类型

Hudi数据集可以是以下类型之一:

  • 写入副本(CoW) –数据以柱状格式(Parquet)存储,每次更新都会在写入期间创建新版本文件。

  • 读取时合并(MoR) –数据使用柱状图(Parquet)和基于行的(Avro)格式组合存储。更新记录到基于行 delta 并根据需要压缩,以创建新版本的列文件。

对于 CoW 数据集,每次更新记录时,包含该记录的文件都会使用更新后的值进行重写。对于MoR数据集,每次出现更新时,Hudi仅写入更改记录的行。MoR 更适合写入或更改繁重而读取量较少的工作负载。CoW更适合对不常变化的数据进行读取工作负荷测试。

Hudi 为访问数据提供三个逻辑视图:

  • 读取优化视图 –提供来自CoW表的最新承诺数据集和来自MoR表的最新压缩数据集。

  • 增量视图 –提供CoW数据集中两个操作之间的变更流,以输出下游作业以及提取、转换、加载(ETL)工作流。

  • 实时视图 –通过合并基于列的和行的文件来提供MoR表的最新提交数据。

目前, Athena 仅支持其中第一个:读取优化视图。读取优化视图上的查询可返回所有压缩数据,提供良好的性能,但不包括最新的增量提交。有关存储类型之间权衡的更多信息,请参阅 存储类型和视图 ApacheHudi文档。

注意事项和限制

  • Athena 仅支持读取Hudi数据的压缩视图。

    • 对于在写作时复制(CoW), Athena 支持快照查询。

    • 读取时合并(MoR), Athena 支持读取优化查询。

  • Athena 并不支持 CTASINSERT INTO Hudi数据。如果您希望 Athena 支持编写Hudi数据集,将反馈发送给 .

    有关编写Hudi数据的更多信息,请参阅以下资源:

  • 在的Hudi桌子上使用MSCK维修表 Athena 不被支持。如果您需要加载一个未创建的Hudi表, AWS Glue,使用 ALTER TABLE ADD PARTITION.

创建Hudi表格

本节提供CREATETABLE语句的示例 Athena 用于Hudi数据的分区和非分区表。

如果您已经创建Hudi表, AWS Glue,您可以直接在 Athena. 创建Hudi咖啡桌时, Athena,您必须在查询Hudi数据之前运行ALTERTABLEADDPARTION以加载Hudi数据。

复制撰写(CoW)创建表格示例

未参与CoW表

以下示例在中创建未分区CoW表 Athena.

CREATE EXTERNAL TABLE `non_partition_cow`( `_hoodie_commit_time` string, `_hoodie_commit_seqno` string, `_hoodie_record_key` string, `_hoodie_partition_path` string, `_hoodie_file_name` string, `event_id` string, `event_time` string, `event_name` string, `event_guests` int, `event_type` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://bucket/folder/non_partition_cow'

分区CoW表

以下示例在中创建分区CoW表 Athena.

CREATE EXTERNAL TABLE `partition_cow`( `_hoodie_commit_time` string, `_hoodie_commit_seqno` string, `_hoodie_record_key` string, `_hoodie_partition_path` string, `_hoodie_file_name` string, `event_id` string, `event_time` string, `event_name` string, `event_guests` int) PARTITIONED BY ( `event_type` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://bucket/folder/partition_cow'

以下内容 ALTER TABLE ADD PARTITION 示例向示例添加两个分区 partition_cow 表。

ALTER TABLE partition_cow ADD PARTITION (event_type = 'one') LOCATION 's3://bucket/folder/partition_cow/one/' PARTITION (event_type = 'two') LOCATION 's3://bucket/folder/partition_cow/two/'

读取时合并(MoR)创建表格示例

Hudi在MoR的Hive元库中创建两个表:一个表具有您指定的名称,这是一个读取优化视图,另一个表具有与 _rt,这是实时视图。但是,当您在 Athena,您只能查询已读优化视图。

读取时未分区合并(MoR)表

以下示例在 Athena.

CREATE EXTERNAL TABLE `nonpartition_mor`( `_hoodie_commit_time` string, `_hoodie_commit_seqno` string, `_hoodie_record_key` string, `_hoodie_partition_path` string, `_hoodie_file_name` string, `event_id` string, `event_time` string, `event_name` string, `event_guests` int, `event_type` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://bucket/folder/nonpartition_mor'

读取时分区合并(MoR)表

以下示例在中创建分区的MoR表 Athena.

CREATE EXTERNAL TABLE `partition_mor`( `_hoodie_commit_time` string, `_hoodie_commit_seqno` string, `_hoodie_record_key` string, `_hoodie_partition_path` string, `_hoodie_file_name` string, `event_id` string, `event_time` string, `event_name` string, `event_guests` int) PARTITIONED BY ( `event_type` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://bucket/folder/partition_mor'

以下内容 ALTER TABLE ADD PARTITION 示例向示例添加两个分区 partition_mor 表。

ALTER TABLE partition_mor ADD PARTITION (event_type = 'one') LOCATION 's3://bucket/folder/partition_mor/one/' PARTITION (event_type = 'two') LOCATION 's3://bucket/folder/partition_mor/two/'