Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >hudi 键的生成(Key Generation)

hudi 键的生成(Key Generation)

作者头像
从大数据到人工智能
发布于 2022-06-12 04:22:27
发布于 2022-06-12 04:22:27
1.8K00
代码可运行
举报
文章被收录于专栏:大数据-BigData大数据-BigData
运行总次数:0
代码可运行

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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一文彻底掌握Apache Hudi的主键和分区配置
Hudi中的每个记录都由HoodieKey唯一标识,HoodieKey由记录键和记录所属的分区路径组成。基于此设计Hudi可以将更新和删除快速应用于指定记录。Hudi使用分区路径字段对数据集进行分区,并且分区内的记录有唯一的记录键。由于仅在分区内保证唯一性,因此在不同分区之间可能存在具有相同记录键的记录。应该明智地选择分区字段,因为它可能影响摄取和查询延迟。
ApacheHudi
2021/04/13
2.7K0
hudi中的写操作
在本节中,我们将介绍如何使用DeltaStreamer工具从外部数据源甚至其他Hudi表中获取新的更改,以及如何使用Hudi数据源通过upserts加速大型Spark作业。 然后可以使用各种查询引擎查询这些表。
从大数据到人工智能
2022/01/19
1.8K0
hudi中的写操作
实战 | 将Kafka流式数据摄取至Hudi
使用Hudi自带的DeltaStreamer工具写数据到Hudi,开启--enable-hive-sync 即可同步数据到hive表。
ApacheHudi
2021/04/13
2.3K0
Apache Hudi + Flink作业运行指南
近日Apache Hudi社区合并了Flink引擎的基础实现(HUDI-1327),这意味着 Hudi 开始支持 Flink 引擎。有很多小伙伴在交流群里咨询 Hudi on Flink 的使用姿势,三言两语不好描述,不如实操演示一把,于是有了这篇文章。
ApacheHudi
2021/04/13
3.3K1
详解Apache Hudi如何配置各种类型分区
Apache Hudi支持多种分区方式数据集,如多级分区、单分区、时间日期分区、无分区数据集等,用户可根据实际需求选择合适的分区方式,下面来详细了解Hudi如何配置何种类型分区。
ApacheHudi
2021/04/13
1.3K0
真香!PySpark整合Apache Hudi实战
Hudi支持Spark-2.x版本,你可以点击如下链接安装Spark,并使用pyspark启动
ApacheHudi
2021/04/13
1.9K0
基于Apache Hudi和Debezium构建CDC入湖管道
当想要对来自事务数据库(如 Postgres 或 MySQL)的数据执行分析时,通常需要通过称为更改数据捕获[4] CDC的过程将此数据引入数据仓库或数据湖等 OLAP 系统。Debezium 是一种流行的工具,它使 CDC 变得简单,其提供了一种通过读取更改日志[5]来捕获数据库中行级更改的方法,通过这种方式 Debezium 可以避免增加数据库上的 CPU 负载,并确保捕获包括删除在内的所有变更。现在 Apache Hudi[6] 提供了 Debezium 源连接器,CDC 引入数据湖比以往任何时候都更容易,因为它具有一些独特的差异化功能[7]。Hudi 可在数据湖上实现高效的更新、合并和删除事务。Hudi 独特地提供了 Merge-On-Read[8] 写入器,与使用 Spark 或 Flink 的典型数据湖写入器相比,该写入器可以显着降低摄取延迟[9]。最后,Apache Hudi 提供增量查询[10],因此在从数据库中捕获更改后可以在所有后续 ETL 管道中以增量方式处理这些更改下游。
ApacheHudi
2022/04/01
2.5K0
基于Apache Hudi和Debezium构建CDC入湖管道
Streaming与Hudi、Hive湖仓一体!
也就是,可以将HDFS和Hudi结合起来,提供对流处理的支持能力。例如:支持记录级别的更新、删除,以及获取基于HDFS之上的Change Streams。哪些数据发生了变更。
ApacheHudi
2021/07/05
3.5K0
Streaming与Hudi、Hive湖仓一体!
写入 Hudi 数据集
这一节我们将介绍使用DeltaStreamer工具从外部源甚至其他Hudi数据集摄取新更改的方法, 以及通过使用Hudi数据源的upserts加快大型Spark作业的方法。 对于此类数据集,我们可以使用各种查询引擎查询它们。
ApacheHudi
2021/04/13
1.6K0
「Hudi系列」Hudi查询&写入&常见问题汇总
2. 「Hudi系列」Apache Hudi入门指南 | SparkSQL+Hive+Presto集成
王知无-import_bigdata
2022/06/05
7.2K0
「Hudi系列」Hudi查询&写入&常见问题汇总
Apache Hudi 0.5.1版本重磅发布
历经大约3个月时间,Apache Hudi 社区终于发布了0.5.1版本,这是Apache Hudi发布的第二个Apache版本,该版本中一些关键点如下
大数据技术架构
2020/03/11
1.3K0
Apache Hudi 入门学习总结
学习和使用Hudi近一年了,由于之前忙于工作和学习,没时间总结,现在从头开始总结一下,先从入门开始
小明互联网技术分享社区
2022/10/31
1.6K0
ApacheHudi使用问题汇总(二)
Hudi Cleaner(清理程序)通常在 commit和 deltacommit之后立即运行,删除不再需要的旧文件。如果在使用增量拉取功能,请确保配置了清理项来保留足够数量的commit(提交),以便可以回退,另一个考虑因素是为长时间运行的作业提供足够的时间来完成运行。否则,Cleaner可能会删除该作业正在读取或可能被其读取的文件,并使该作业失败。通常,默认配置为10会允许每30分钟运行一次提取,以保留长达5(10 * 0.5)个小时的数据。如果以繁进行摄取,或者为查询提供更多运行时间,可增加 hoodie.cleaner.commits.retained配置项的值。
ApacheHudi
2021/04/13
1.9K0
Spark读取变更Hudi数据集Schema实现分析
Hudi支持上层Hive/Presto/Spark查询引擎,其中使用Spark读取Hudi数据集方法非常简单,在spark-shell或应用代码中,通过 spark.sqlContext.read.format("org.apache.hudi").load便可加载Hudi数据集,本篇文章分析具体的实现。
ApacheHudi
2021/04/13
2.8K0
Hudi内核分析之虚拟键(Virtual Keys)
Apache Hudi根据不同的表类型、配置参数来帮助您构建和管理数据湖,以满足每个人的需要。Hudi添加了每个记录的元数据字段,如_hoodie_record_key, _hoodie_partition path, _hoodie_commit_time,它有多种用途。它们有助于避免在合并、压缩和其他表操作期间重新计算记录键、分区路径,还有助于支持记录级增量查询(与仅跟踪文件的其他表格式相比)。此外,即使给定表的键字段在其生命周期内发生了更改,它也通过确保执行唯一的键约束来确保数据质量。但是对于不需要这些好处或关键更改非常少的简单用例,来自社区的反复要求之一是利用现有的字段,而不是添加额外的元字段。
从大数据到人工智能
2022/01/19
4990
解锁Apache Hudi删除记录新姿势
在0.5.1版本之前,用户若想删除某条记录,可以使用Spark DataSource,并将 DataSourceWriteOptions.PAYLOAD_CLASS_OPT_KEY设置为 EmptyHoodieRecordPayload.class.getName,便可删除指定记录,在Hudi新发布的0.5.1版本,可不使用上述配置项删除记录,而提供三种方式删除记录:Hudi API,Spark DataSource,DeltaStreamer,下面逐一介绍如何使用。
ApacheHudi
2021/04/13
2.1K0
数据湖(五):Hudi与Hive集成
Hudi与Hive集成原理是通过代码方式将数据写入到HDFS目录中,那么同时映射Hive表,让Hive表映射的数据对应到此路径上,这时Hudi需要通过JDBC方式连接Hive进行元数据操作,这时需要配置HiveServer2。
Lansonli
2022/05/31
3K0
数据湖(五):Hudi与Hive集成
触宝科技基于Apache Hudi的流批一体架构实践
当前公司的大数据实时链路如下图,数据源是MySQL数据库,然后通过Binlog Query的方式消费或者直接客户端采集到Kafka,最终通过基于Spark/Flink实现的批流一体计算引擎处理,最后输出到下游对应的存储。
ApacheHudi
2021/07/05
1.2K0
触宝科技基于Apache Hudi的流批一体架构实践
Apache Hudi 0.14.0版本重磅发布!
Apache Hudi 0.14.0 标志着一个重要的里程碑,具有一系列新功能和增强功能。其中包括引入Record Level Index、自动生成记录键 、用于增量读取的 hudi_table_changes函数等等。值得注意的是,此版本还包含对 Spark 3.4 的支持。在 Flink 方面,0.14.0 版本带来了一些令人兴奋的功能,例如一致哈希索引支持、支持Flink 1.17 以及支持更新和删除语句。此外此版本还升级了Hudi表版本,提示用户查阅下面提供的迁移指南。我们鼓励用户在采用 0.14.0 版本之前查看重大特性、重大变化和行为变更。
ApacheHudi
2023/10/09
2.2K0
Apache Hudi 0.14.0版本重磅发布!
hudi 异步clustering
在之前的一篇文章中,我们引入了一种新的名为clustering的表服务,它可以重组数据,从而在不影响写入速度的情况下提高查询性能。 我们学习了如何设置inline clustering。 在这篇文章中,我们将讨论自那以后发生的变化,并看看如何使用HoodieClusteringJob和DeltaStreamer实用工具来设置异步clustering。
从大数据到人工智能
2022/01/19
6630
相关推荐
一文彻底掌握Apache Hudi的主键和分区配置
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验