一文徹底掌握Apache Hudi的主鍵和分區配置


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,則配置值可以是逗號分隔的字段名稱,例如:col1col3,col4

2.6 NonPartitionedKeyGenerator

如果你的Hudi數據集未分區,則可以使用NonPartitionedKeyGenerator,它將為所有記錄返回一個空分區。換句話說,所有記錄都寫入到同一個分區(為空"")

3. 總結

本博客介紹了Apache Hudi中不同的record key生成器及其配置,希望可以讓你對Apache Hudi中可用的不同類型的Key生成器有一個很好的了解,感謝一直以來對Hudi社區的支持。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM