当前位置:网站首页>hudi 键的生成(Key Generation)
hudi 键的生成(Key Generation)
2022-06-12 12:49:00 【从大数据到人工智能】
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/
边栏推荐
- About paiwen
- Part of the fourth Zhejiang CTF finals
- 机器人雅可比求解
- 嵌入式系统概述2-嵌入式系统组成和应用
- MUI登录数据库完善与AJAX异步处理【MUI+Flask+MongoDB+HBuilderX】
- Async/await for ES6
- 移动应用出海的“新大陆”
- [database] Navicat -- Oracle database creation
- Attack and defense world re (New 1 hand zone) questions 1-12
- Overview of embedded system 1- definition, characteristics and development history of embedded system
猜你喜欢

Binary tree (program)

配准后图像对比函数itk::CheckerBoardImageFilter

Design virtual network to realize communication between virtual machine instance and external network

Uniapp wechat applet long press the identification QR code to jump to applet and personal wechat

Installation of pagoda

Improve pipeline efficiency: you need to know how to identify the main obstacles in ci/cd pipeline

实战 | 巧用位姿解算实现单目相机测距

嵌入式系統硬件構成-基於ARM的嵌入式開發板介紹

Microsoft Word tutorial, how to insert a header or footer in word?

一个ES设置操作引发的“血案”
随机推荐
Tuples, arrays, and as const of typescript
From simple to deep - websocket
提升管道效率:你需要知道如何识别CI/CD管道中的主要障碍
Brush questions [de1ctf 2019]shellshellshell
机器人雅可比求解
STM32F1与STM32CubeIDE编程实例-设备驱动-EEPROM-AT24C256驱动
VGA显示彩条和图片(FPGA)
配准后图像对比函数itk::CheckerBoardImageFilter
Examples of Cartesian product and natural connection of relational algebra
【vim】vim插件YouCompleteMe配置文件
2022 ARTS|Week 23
Openmax (OMX) framework
R language Visual facet chart, hypothesis test, multivariable grouping t-test, visual multivariable grouping faceting bar plot, adding significance level and jitter points
Advanced C language -- storage of deep anatomical data in memory (with exercise)
Buu question brushing record - 6
Numpy numerical calculation basis
Uniapp wechat applet long press the identification QR code to jump to applet and personal wechat
MUI登录数据库完善与AJAX异步处理【MUI+Flask+MongoDB+HBuilderX】
检测vector是否有交集
One line of code to implement shell if else logic