前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >hudi 键的生成(Key Generation)

hudi 键的生成(Key Generation)

作者头像
从大数据到人工智能
发布2022-06-12 12:22:27
1.7K0
发布2022-06-12 12:22:27
举报
文章被收录于专栏:大数据-BigData

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的优点。可以将记录键和分区路径配置为单个字段或多个字段的组合。

代码语言:javascript
复制
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时为逗号分隔字段名称。例子:

代码语言:javascript
复制
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两个字段创建分区路径,其中后者具有基于时间戳的值,并且需要以给定的格式进行定制,您可以指定以下内容

代码语言:javascript
复制
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。

配置设置:

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/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 键生成器
  • SimpleKeyGenerator
  • ComplexKeyGenerator
  • GlobalDeleteKeyGenerator
  • NoPartitionedKeyGenerator
  • CustomKeyGenerator
  • 实现你自己的key generator
  • TimestampBasedKeyGenerator
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档