Hudi中的每条记录都由一个主键唯一标识,主键是用于记录所属的记录键和分区路径的参数。使用主键,Hudi可以强制a)分区级唯一性完整性约束b)允许快速更新和删除记录。应该明智地选择分区模式,因为它可能是摄入和查询延迟的决定因素。
通常,Hudi支持分区索引和全局索引。对于具有分区索引(这是最常用的)的数据集,每条记录由一对记录键和分区路径唯一标识。但对于具有全局索引的数据集,每条记录仅由记录键唯一标识。分区之间不会有任何重复的记录键。
键生成器
Hudi提供了几个开箱即用的键生成器,用户可以根据自己的需要使用它们,同时还提供了一个可插入的实现,供用户实现和使用他们自己的KeyGenerator。这一页将介绍所有可以随时使用的不同类型的键生成器。
这里是KeyGenerator在Hudi的接口,供您参考。
在深入研究不同类型的键生成器之前,让我们先回顾一下键生成器需要设置的一些常见配置。
Config | Meaning/purpose |
---|---|
hoodie.datasource.write.recordkey.field | Refers to record key field. This is a mandatory field. |
hoodie.datasource.write.partitionpath.field | Refers to partition path field. This is a mandatory field. |
hoodie.datasource.write.keygenerator.class | Refers 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.urlencode | When set to true, partition path will be url encoded. Default value is false. |
hoodie.datasource.write.hive_style_partitioning | When 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类来实现你自己的自定义键生成器:
TimestampBasedKeyGenerator
这个键生成器依赖于分区字段的时间戳。在为记录生成分区路径值时,字段值被解释为时间戳,而不只是转换为字符串。记录键与以前通过字段名称选择的键相同。用户需要设置更多的配置来使用这个KeyGenerator。
配置设置:
Config | Meaning/purpose |
---|---|
hoodie.deltastreamer.keygen.timebased.timestamp.type | One of the timestamp types supported(UNIX_TIMESTAMP, DATE_STRING, MIXED, EPOCHMILLISECONDS, SCALAR) |
hoodie.deltastreamer.keygen.timebased.output.dateformat | Output date format |
hoodie.deltastreamer.keygen.timebased.timezone | Timezone of the data format |
oodie.deltastreamer.keygen.timebased.input.dateformat | Input date format |
TimestampBasedKeyGenerator一些示例
Timestamp是GMT
Config field | Value |
---|---|
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 field | Value |
---|---|
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 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 “
如果输入字段值为空。
由密钥生成器生成的分区路径:” 1970-01-02 12 “
ISO8601WithMsZ单输入格式
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″
具有多种输入格式的ISO8601WithMsZ
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″
使用多种输入格式的带有偏移量的iso8601NoMs
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”
由密钥生成器生成的分区路径:”2020040118″
以短日期字符串形式输入,并以日期格式期望日期
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” |
输入字段值:“20200401”
由密钥生成器生成的分区路径:”04/01/2020″
本文为从大数据到人工智能博主「xiaozhch5」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://lrting.top/backend/bigdata/hudi/hudi-basic/5893/