Hudi中的每个记录都由HoodieKey唯一标识,HoodieKey由<code>记录键</code>和记录所属的<code>分区路径</code>组成。基于此设计Hudi可以将更新和删除快速应用于指定记录。Hudi使用<code>分区路径</code>字段对数据集进行分区,并且分区内的记录有唯一的记录键。由于仅在分区内保证唯一性,因此在不同分区之间可能存在具有相同记录键的记录。应该明智地选择分区字段,因为它可能影响摄取和查询延迟。
Hudi提供了一些开箱即用的键生成器,用户可以基于此满足大部分业务需求,或者自定义实现KeyGenerator,本篇博客将介绍所有不同类型的且可用的KeyGenerators。
KeyGenerator的接口定义在这里
在介绍不同类型KeyGenerator之前,一些通用配置如下
配置
解释
<code>hoodie.datasource.write.recordkey.field</code>
指定record key字段
<code>hoodie.datasource.write.partitionpath.field</code>
指定分区字段
<code>hoodie.datasource.write.keygenerator.class</code>
指定KeyGenerator类全路径名
<code>hoodie.datasource.write.partitionpath.urlencode</code>
当设置为true,partitionPath将会使用url编码,默认值为false
<code>hoodie.datasource.write.hive_style_partitioning</code>
当设置为true,使用hive风格的分区,分区将为key=value格式,默认值为false
如果使用<code>TimestampBasedKeyGenerator</code>,还会有其他额外的配置
指定一个字段为Record Key,分区字段也指定一个字段,大部分情况使用该配置,其会从数据中解析出值并转化为string类型。
可以指定一个或多个字段作为Record key或者分区字段,多个字段使用逗号分割,如 <code>hoodie.datasource.write.recordkey.field</code> :<code>col1,col4</code>
基于全局索引的删除不需要分区值,所以该生成器不需要使用分区值来生成HoodieKey。
该键生成器依赖timestamp分区字段,字段值将会被转化为timestamp,而不是string类型。Record key设置和前面一样,使用该键生成器时需要一些额外的配置项如下
说明
<code>hoodie.deltastreamer.keygen.timebased.timestamp.type</code>
支持如下Timestamp类型(UNIX_TIMESTAMP, DATE_STRING, MIXED, EPOCHMILLISECONDS, SCALAR)
<code>hoodie.deltastreamer.keygen.timebased.output.dateformat</code>
输出日期类型
<code>hoodie.deltastreamer.keygen.timebased.timezone</code>
数据格式的时区
<code>hoodie.deltastreamer.keygen.timebased.input.dateformat</code>
输入日期类型
典型<code>TimestampBasedKeyGenerator</code>配置如下
值
“EPOCHMILLISECONDS”
“yyyy-MM-dd hh”
“GMT+8:00”
输入字段值为<code>1578283932000L</code>
分区字段将为<code>2020-01-06 12</code>
如果一些行输入字段只为null
分区字段将为<code>1970-01-01 08</code>
Config field
“DATE_STRING”
“yyyy-MM-dd hh:mm:ss”
输入字段值为<code>2020-01-06 12:12:12</code>
分区字段将为<code>1970-01-01 12:00:00</code>
Value
“SCALAR”
“GMT”
<code>hoodie.deltastreamer.keygen.timebased.timestamp.scalar.time.unit</code>
“days”
输入字段值为<code>20000L</code>
分区字段将为<code>2024-10-04 12</code>
分区字段将为<code>1970-01-01 12</code>
“yyyy-MM-dd’T’HH:mm:ss.SSSZ”
<code>hoodie.deltastreamer.keygen.timebased.input.dateformat.list.delimiter.regex</code>
””
<code>hoodie.deltastreamer.keygen.timebased.input.timezone</code>
“yyyyMMddHH”
<code>hoodie.deltastreamer.keygen.timebased.output.timezone</code>
输入字段值为<code>2020-04-01T13:01:33.428Z</code>
分区字段将为<code>2020040113</code>
“yyyy-MM-dd’T’HH:mm:ssZ,yyyy-MM-dd’T’HH:mm:ss.SSSZ”
“UTC”
输入字段值为<code>2020-04-01T13:01:33-05:00</code>
分区字段将为<code>2020-04-01T13:01:33-05:00</code>
“yyyy-MM-dd’T’HH:mm:ssZ,yyyy-MM-dd’T’HH:mm:ss.SSSZ,yyyyMMdd”
“MM/dd/yyyy”
输入字段只为<code>220200401</code>
分区字段将为<code>04/01/2020</code>
CustomKeyGenerator是一种通用的KeyGenerator,综合了SimpleKeyGenerator、ComplexKeyGenerator和TImestampBasedKeyGenerator的特性,可以配置键和分区路径为单字段或组合字段,如果要定义基于常规字段和基于时间戳的字段的复杂分区路径,此keyGenerator非常有用,配置项<code>hoodie.datasource.write.partitionpath.field</code>的值对应格式应为<code>field1:PartitionKeyType1,field2:PartitionKeyType2…</code>
完整的分区路径创建为<code><field1的PartitionKeyType1的值>/<field2的PartitionKeyType2的值></code>,依此类推。每个分区键类型可以是SIMPLE或TIMESTAMP。
配置值示例:<code>field_3:simple, field_5:timestamp</code>
如果使用SimpleKeyGenerator,则RecordKey的配置值可以是单个字段,如果使用ComplexKeyGenerator,则配置值可以是逗号分隔的字段名称,例如:<code>col1</code>或<code>col3,col4</code>。
如果你的Hudi数据集未分区,则可以使用<code>NonPartitionedKeyGenerator</code>,它将为所有记录返回一个空分区。换句话说,所有记录都写入到同一个分区(为空"")
本博客介绍了Apache Hudi中不同的record key生成器及其配置,希望可以让你对Apache Hudi中可用的不同类型的Key生成器有一个很好的了解,感谢一直以来对Hudi社区的支持。
PS:如果您觉得阅读本文对您有帮助,请点一下<b>“推荐”</b>按钮,您的<b>“推荐”</b>,将会是我不竭的动力!
作者:<b>leesf</b> <b>掌控之中,才会成功;掌控之外,注定失败。</b>
出处:http://www.cnblogs.com/leesf456/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果觉得本文对您有帮助,您可以请我喝杯咖啡!
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5ibphXald3LcZTN0Y2clVGbvw1clxWam9CXt92YuM3ZvxmYuNmLjlGdhR3ctc2bsJ2Lc9CX6MHc0RHaiojIsJye.gif)