hudi 键的生成(Key Generation)

Hudi中的每条记录都由一个主键唯一标识,主键是用于记录所属的记录键和分区路径的参数。使用主键,Hudi可以强制a)分区级唯一性完整性约束b)允许快速更新和删除记录。应该明智地选择分区模式,因为它可能是摄入和查询延迟的决定因素。

通常,Hudi支持分区索引和全局索引。对于具有分区索引(这是最常用的)的数据集,每条记录由一对记录键和分区路径唯一标识。但对于具有全局索引的数据集,每条记录仅由记录键唯一标识。分区之间不会有任何重复的记录键。

键生成器

Hudi提供了几个开箱即用的键生成器,用户可以根据自己的需要使用它们,同时还提供了一个可插入的实现,供用户实现和使用他们自己的KeyGenerator。这一页将介绍所有可以随时使用的不同类型的键生成器。

这里是KeyGenerator在Hudi的接口,供您参考。

在深入研究不同类型的键生成器之前,让我们先回顾一下键生成器需要设置的一些常见配置。

ConfigMeaning/purpose
hoodie.datasource.write.recordkey.fieldRefers to record key field. This is a mandatory field.
hoodie.datasource.write.partitionpath.fieldRefers to partition path field. This is a mandatory field.
hoodie.datasource.write.keygenerator.classRefers to Key generator class(including full path). Could refer to any of the available ones or user defined one. This is a mandatory field.
hoodie.datasource.write.partitionpath.urlencodeWhen set to true, partition path will be url encoded. Default value is false.
hoodie.datasource.write.hive_style_partitioningWhen set to true, uses hive style partitioning. Partition field name will be prefixed to the value. Format: “\<partition_path_field_name>=\<partition_path_value>”. Default value is false.

如果您正在查找TimestampBasedKeyGenerator,则需要进行更多的配置。我们会在各自的章节中介绍。

让我们来看看可以使用Hudi的不同键生成器。

SimpleKeyGenerator

记录键按名称表示一个字段(dataframe中的列),分区路径按名称表示一个字段(dataframe中的单列)。这是最常用的一种。值被解释为来自数据框架并转换为字符串。

ComplexKeyGenerator

记录键和分区路径都由名称(多个字段的组合)组成一个或多个字段。字段在配置值中使用逗号分隔。例如“Hoodie.datasource.write.recordkey。字段”:“col1 col4”

GlobalDeleteKeyGenerator

全局索引删除不需要分区值。所以这个键生成器避免使用分区值来生成HoodieKey。

NoPartitionedKeyGenerator

如果您的hudi数据集没有分区,您可以使用这个“NonPartitionedKeyGenerator”,它将为所有记录返回一个空分区。换句话说,所有记录都到相同的分区(它是空的” “)

CustomKeyGenerator

这是KeyGenerator的一个通用实现,用户可以同时利用SimpleKeyGenerator、ComplexKeyGenerator和TimestampBasedKeyGenerator的优点。可以将记录键和分区路径配置为单个字段或多个字段的组合。

hoodie.datasource.write.recordkey.field
hoodie.datasource.write.partitionpath.field
hoodie.datasource.write.keygenerator.class=org.apache.hudi.keygen.CustomKeyGenerator

如果您想定义包含常规字段和基于时间戳的字段的复杂分区路径,这个keyGenerator特别有用。它期望配置”hoodie.datasource.write.partitionpath.field”字段的格式。格式应该是“field1:PartitionKeyType1,field2:PartitionKeyType2…”

完整的分区路径被创建为\<value for field1 basis PartitionKeyType1>/\<value for field2 basis PartitionKeyType2>等等。每个分区键类型可以是SIMPLE或TIMESTAMP。

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

RecordKey配置值在SimpleKeyGenerator中为单个字段,在引用ComplexKeyGenerator时为逗号分隔字段名称。例子:

hoodie.datasource.write.recordkey.field=field1,field2

这将以field1:value1、field2:value2等格式创建记录键,否则在简单记录键的情况下只能指定一个字段。CustomKeyGenerator类定义了一个用于配置分区路径的enum PartitionKeyType。它可以取两个可能的值—SIMPLE和TIMESTAMP。对于分区表,需要以field1:PartitionKeyType1、field2:PartitionKeyType2等格式提供hoodie.datasource.write.partitionpath.field属性的值。例如,如果您希望使用country和date两个字段创建分区路径,其中后者具有基于时间戳的值,并且需要以给定的格式进行定制,您可以指定以下内容

hoodie.datasource.write.partitionpath.field=country:SIMPLE,date:TIMESTAMP

这将创建格式为\<country_name>/\<date>或country=\<country_name>/date=\<date>, 这取决于您是否需要hive风格的分区。

实现你自己的key generator

你可以通过扩展这里的公共API类来实现你自己的自定义键生成器:

https://github.com/apache/hudi/blob/master/hudi-common/src/main/java/org/apache/hudi/keygen/KeyGenerator.java

TimestampBasedKeyGenerator

这个键生成器依赖于分区字段的时间戳。在为记录生成分区路径值时,字段值被解释为时间戳,而不只是转换为字符串。记录键与以前通过字段名称选择的键相同。用户需要设置更多的配置来使用这个KeyGenerator。

配置设置:

ConfigMeaning/purpose
hoodie.deltastreamer.keygen.timebased.timestamp.typeOne of the timestamp types supported(UNIX_TIMESTAMP, DATE_STRING, MIXED, EPOCHMILLISECONDS, SCALAR)
hoodie.deltastreamer.keygen.timebased.output.dateformatOutput date format
hoodie.deltastreamer.keygen.timebased.timezoneTimezone of the data format
oodie.deltastreamer.keygen.timebased.input.dateformatInput date format

TimestampBasedKeyGenerator一些示例

Timestamp是GMT

Config fieldValue
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 “

如果某些行的输入字段值为空。
从密钥生成器生成的分区路径:” 1970-01-01 08 “

Timestamp是DATE_STRING

Config fieldValue
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 “

如果某些行的输入字段值为空。
由密钥生成器生成的分区路径:” 1970-01-01 12:00:00 “

Scalar示例

Config fieldValue
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 “

如果输入字段值为空。
由密钥生成器生成的分区路径:” 1970-01-02 12 “

ISO8601WithMsZ单输入格式

Config fieldValue
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″

具有多种输入格式的ISO8601WithMsZ

Config fieldValue
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″

使用多种输入格式的带有偏移量的iso8601NoMs

Config fieldValue
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”
由密钥生成器生成的分区路径:”2020040118″

以短日期字符串形式输入,并以日期格式期望日期

Config fieldValue
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”

输入字段值:“20200401”
由密钥生成器生成的分区路径:”04/01/2020″

5 1 投票
文章评分

本文为从大数据到人工智能博主「xiaozhch5」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://lrting.top/backend/bigdata/hudi/hudi-basic/5893/

(2)
上一篇 2022-06-07 14:04
下一篇 2022-06-07 16:07

相关推荐

订阅评论
提醒
guest

0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x