1. 介紹
Hudi中的每個記錄都由HoodieKey唯一標識,HoodieKey由記錄鍵
和記錄所屬的分割槽路徑
組成。基於此設計Hudi可以將更新和刪除快速應用於指定記錄。Hudi使用分割槽路徑
欄位對資料集進行分割槽,並且分割槽內的記錄有唯一的記錄鍵。由於僅在分割槽內保證唯一性,因此在不同分割槽之間可能存在具有相同記錄鍵的記錄。應該明智地選擇分割槽欄位,因為它可能影響攝取和查詢延遲。
2. KeyGenerators(鍵生成器)
Hudi提供了一些開箱即用的鍵生成器,使用者可以基於此滿足大部分業務需求,或者自定義實現KeyGenerator,本篇部落格將介紹所有不同型別的且可用的KeyGenerators。
KeyGenerator的介面定義在這裡
在介紹不同型別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
指定一個欄位為Record Key,分割槽欄位也指定一個欄位,大部分情況使用該配置,其會從資料中解析出值並轉化為string型別。
2.2 ComplexKeyGenerator
可以指定一個或多個欄位作為Record key或者分割槽欄位,多個欄位使用逗號分割,如 hoodie.datasource.write.recordkey.field
:col1,col4
2.3 GlobalDeleteKeyGenerator
基於全域性索引的刪除不需要分割槽值,所以該生成器不需要使用分割槽值來生成HoodieKey。
2.4 TimestampBasedKeyGenerator
該鍵生成器依賴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
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,則配置值可以是逗號分隔的欄位名稱,例如:col1
或col3,col4
。
2.6 NonPartitionedKeyGenerator
如果你的Hudi資料集未分割槽,則可以使用NonPartitionedKeyGenerator
,它將為所有記錄返回一個空分割槽。換句話說,所有記錄都寫入到同一個分割槽(為空"")
3. 總結
本部落格介紹了Apache Hudi中不同的record key生成器及其配置,希望可以讓你對Apache Hudi中可用的不同型別的Key生成器有一個很好的瞭解,感謝一直以來對Hudi社群的支援。