前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一文彻底掌握Apache Hudi的主键和分区配置

一文彻底掌握Apache Hudi的主键和分区配置

作者头像
ApacheHudi
发布2021-04-13 15:38:51
2.1K0
发布2021-04-13 15:38:51
举报
文章被收录于专栏:ApacheHudiApacheHudi
1. 介绍

Hudi中的每个记录都由HoodieKey唯一标识,HoodieKey由记录键和记录所属的分区路径组成。基于此设计Hudi可以将更新和删除快速应用于指定记录。Hudi使用分区路径字段对数据集进行分区,并且分区内的记录有唯一的记录键。由于仅在分区内保证唯一性,因此在不同分区之间可能存在具有相同记录键的记录。应该明智地选择分区字段,因为它可能影响摄取和查询延迟。

2. KeyGenerators(键生成器)

Hudi提供了一些开箱即用的键生成器,用户可以基于此满足大部分业务需求,或者自定义实现KeyGenerator,本篇博客将介绍所有不同类型的且可用的KeyGenerators。

KeyGenerator的接口定义在这里[1]

在介绍不同类型KeyGenerator之前,一些通用配置如下

配置

解释

hoodie.datasource.write.recordkey.field

指定record key字段

hoodie.datasource.write.partitionpath.field

指定分区字段

hoodie.datasource.write.keygenerator.class

指定KeyGenerator类全路径名

hoodie.datasource.write.partitionpath.urlencode

当设置为true,partitionPath将会使用url编码,默认值为false

hoodie.datasource.write.hive_style_partitioning

当设置为true,使用hive风格的分区,分区将为key=value格式,默认值为false

如果使用TimestampBasedKeyGenerator,还会有其他额外的配置

2.1 SimpleKeyGenerator[2]

指定一个字段为Record Key,分区字段也指定一个字段,大部分情况使用该配置,其会从数据中解析出值并转化为string类型。

2.2 ComplexKeyGenerator[3]

可以指定一个或多个字段作为Record key或者分区字段,多个字段使用逗号分割,如 hoodie.datasource.write.recordkey.field :col1,col4

2.3 GlobalDeleteKeyGenerator[4]

基于全局索引的删除不需要分区值,所以该生成器不需要使用分区值来生成HoodieKey。

2.4 TimestampBasedKeyGenerator[5]

该键生成器依赖timestamp分区字段,字段值将会被转化为timestamp,而不是string类型。Record key设置和前面一样,使用该键生成器时需要一些额外的配置项如下

配置

说明

hoodie.deltastreamer.keygen.timebased.timestamp.type

支持如下Timestamp类型(UNIX_TIMESTAMP, DATE_STRING, MIXED, EPOCHMILLISECONDS, SCALAR)

hoodie.deltastreamer.keygen.timebased.output.dateformat

输出日期类型

hoodie.deltastreamer.keygen.timebased.timezone

数据格式的时区

hoodie.deltastreamer.keygen.timebased.input.dateformat

输入日期类型

典型TimestampBasedKeyGenerator配置如下

2.4.1 Timestamp类型为GMT

配置

hoodie.deltastreamer.keygen.timebased.timestamp.type

“EPOCHMILLISECONDS”

hoodie.deltastreamer.keygen.timebased.output.dateformat

“yyyy-MM-dd hh”

hoodie.deltastreamer.keygen.timebased.timezone

“GMT+8:00”

输入字段值为1578283932000L

分区字段将为2020-01-06 12

如果一些行输入字段只为null

分区字段将为1970-01-01 08

2.4.2 Timestamp类型为DATE_STRING

Config field

hoodie.deltastreamer.keygen.timebased.timestamp.type

“DATE_STRING”

hoodie.deltastreamer.keygen.timebased.output.dateformat

“yyyy-MM-dd hh”

hoodie.deltastreamer.keygen.timebased.timezone

“GMT+8:00”

hoodie.deltastreamer.keygen.timebased.input.dateformat

“yyyy-MM-dd hh:mm:ss”

输入字段值为2020-01-06 12:12:12

分区字段将为2020-01-06 12

如果一些行输入字段只为null

分区字段将为1970-01-01 12:00:00

2.4.3 标量实例

Config field

Value

hoodie.deltastreamer.keygen.timebased.timestamp.type

“SCALAR”

hoodie.deltastreamer.keygen.timebased.output.dateformat

“yyyy-MM-dd hh”

hoodie.deltastreamer.keygen.timebased.timezone

“GMT”

hoodie.deltastreamer.keygen.timebased.timestamp.scalar.time.unit

“days”

输入字段值为20000L

分区字段将为2024-10-04 12

如果一些行输入字段只为null

分区字段将为1970-01-01 12

2.4.4 ISO8601 Z单输入格式

Config field

Value

hoodie.deltastreamer.keygen.timebased.timestamp.type

“DATE_STRING”

hoodie.deltastreamer.keygen.timebased.input.dateformat

“yyyy-MM-dd’T’HH:mm:ss.SSSZ”

hoodie.deltastreamer.keygen.timebased.input.dateformat.list.delimiter.regex

””

hoodie.deltastreamer.keygen.timebased.input.timezone

””

hoodie.deltastreamer.keygen.timebased.output.dateformat

“yyyyMMddHH”

hoodie.deltastreamer.keygen.timebased.output.timezone

“GMT”

输入字段值为2020-04-01T13:01:33.428Z

分区字段将为2020040113

2.4.5 ISO8601 Z多输入格式

Config field

Value

hoodie.deltastreamer.keygen.timebased.timestamp.type

“DATE_STRING”

hoodie.deltastreamer.keygen.timebased.input.dateformat

“yyyy-MM-dd’T’HH:mm:ssZ,yyyy-MM-dd’T’HH:mm:ss.SSSZ”

hoodie.deltastreamer.keygen.timebased.input.dateformat.list.delimiter.regex

””

hoodie.deltastreamer.keygen.timebased.input.timezone

””

hoodie.deltastreamer.keygen.timebased.output.dateformat

“yyyyMMddHH”

hoodie.deltastreamer.keygen.timebased.output.timezone

“UTC”

输入字段值为2020-04-01T13:01:33.428Z

分区字段将为2020040113

2.4.6 ISO8601多输入格式

Config field

Value

hoodie.deltastreamer.keygen.timebased.timestamp.type

“DATE_STRING”

hoodie.deltastreamer.keygen.timebased.input.dateformat

“yyyy-MM-dd’T’HH:mm:ssZ,yyyy-MM-dd’T’HH:mm:ss.SSSZ”

hoodie.deltastreamer.keygen.timebased.input.dateformat.list.delimiter.regex

””

hoodie.deltastreamer.keygen.timebased.input.timezone

””

hoodie.deltastreamer.keygen.timebased.output.dateformat

“yyyyMMddHH”

hoodie.deltastreamer.keygen.timebased.output.timezone

“UTC”

输入字段值为2020-04-01T13:01:33-05:00

分区字段将为2020-04-01T13:01:33-05:00

2.4.7 日期类型

Config field

Value

hoodie.deltastreamer.keygen.timebased.timestamp.type

“DATE_STRING”

hoodie.deltastreamer.keygen.timebased.input.dateformat

“yyyy-MM-dd’T’HH:mm:ssZ,yyyy-MM-dd’T’HH:mm:ss.SSSZ,yyyyMMdd”

hoodie.deltastreamer.keygen.timebased.input.dateformat.list.delimiter.regex

””

hoodie.deltastreamer.keygen.timebased.input.timezone

“UTC”

hoodie.deltastreamer.keygen.timebased.output.dateformat

“MM/dd/yyyy”

hoodie.deltastreamer.keygen.timebased.output.timezone

“UTC”

输入字段只为220200401

分区字段将为04/01/2020

2.5 CustomKeyGenerator[6]

CustomKeyGenerator是一种通用的KeyGenerator,综合了SimpleKeyGenerator、ComplexKeyGenerator和TImestampBasedKeyGenerator的特性,可以配置键和分区路径为单字段或组合字段,如果要定义基于常规字段和基于时间戳的字段的复杂分区路径,此keyGenerator非常有用,配置项hoodie.datasource.write.partitionpath.field的值对应格式应为field1:PartitionKeyType1,field2:PartitionKeyType2…

完整的分区路径创建为<field1的PartitionKeyType1的值>/<field2的PartitionKeyType2的值>,依此类推。每个分区键类型可以是SIMPLE或TIMESTAMP。

配置值示例:field_3:simple, field_5:timestamp

如果使用SimpleKeyGenerator,则RecordKey的配置值可以是单个字段,如果使用ComplexKeyGenerator,则配置值可以是逗号分隔的字段名称,例如:col1col3,col4

2.6 NonPartitionedKeyGenerator[7]

如果你的Hudi数据集未分区,则可以使用NonPartitionedKeyGenerator,它将为所有记录返回一个空分区。换句话说,所有记录都写入到同一个分区(为空"")

3. 总结

本博客介绍了Apache Hudi中不同的record key生成器及其配置,希望可以让你对Apache Hudi中可用的不同类型的Key生成器有一个很好的了解,感谢一直以来对Hudi社区的支持。

引用链接

[1] 在这里: https://github.com/apache/hudi/blob/master/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/keygen/KeyGenerator.java [2] SimpleKeyGenerator: https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/SimpleKeyGenerator.java [3] ComplexKeyGenerator: https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/ComplexKeyGenerator.java [4] GlobalDeleteKeyGenerator: https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/GlobalDeleteKeyGenerator.java [5] TimestampBasedKeyGenerator: https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/TimestampBasedKeyGenerator.java [6] CustomKeyGenerator: https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/CustomKeyGenerator.java [7] NonPartitionedKeyGenerator: https://github.com/apache/hudi/blob/master/hudi-client/hudi-spark-client/src/main/java/org/apache/hudi/keygen/NonpartitionedKeyGenerator.java

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ApacheHudi 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2. KeyGenerators(键生成器)
    • 2.1 SimpleKeyGenerator[2]
      • 2.2 ComplexKeyGenerator[3]
        • 2.3 GlobalDeleteKeyGenerator[4]
          • 2.4 TimestampBasedKeyGenerator[5]
            • 2.4.1 Timestamp类型为GMT
              • 2.4.2 Timestamp类型为DATE_STRING
                • 2.4.3 标量实例
                  • 2.4.4 ISO8601 Z单输入格式
                    • 2.4.5 ISO8601 Z多输入格式
                      • 2.4.6 ISO8601多输入格式
                        • 2.4.7 日期类型
                          • 2.5 CustomKeyGenerator[6]
                            • 2.6 NonPartitionedKeyGenerator[7]
                            • 3. 总结
                              • 引用链接
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档