一文彻底掌握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,则配置值可以是逗号分隔的字段名称,例如:col1或col3,col4。
2.6 NonPartitionedKeyGenerator
如果你的Hudi数据集未分区,则可以使用NonPartitionedKeyGenerator,它将为所有记录返回一个空分区。换句话说,所有记录都写入到同一个分区(为空"")
3. 总结
本博客介绍了Apache Hudi中不同的record key生成器及其配置,希望可以让你对Apache Hudi中可用的不同类型的Key生成器有一个很好的了解,感谢一直以来对Hudi社区的支持。
一文彻底掌握Apache Hudi的主键和分区配置的更多相关文章
- 一文彻底理解Apache Hudi的多版本清理服务
Apache Hudi提供了MVCC并发模型,保证写入端和读取端之间快照级别隔离.在本篇博客中我们将介绍如何配置来管理多个文件版本,此外还将讨论用户可使用的清理机制,以了解如何维护所需数量的旧文件版本 ...
- 一文彻底掌握Apache Hudi异步Clustering部署
1. 摘要 在之前的一篇博客中,我们介绍了Clustering(聚簇)的表服务来重新组织数据来提供更好的查询性能,而不用降低摄取速度,并且我们已经知道如何部署同步Clustering,本篇博客中,我们 ...
- MyBatis在insert插入操作时返回主键ID的配置
在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:如果业务层需要得到记录的主键时,可以通过Mapper.XML配置的方式来完成这个功能. 在 INSER ...
- Apache Hudi重磅特性解读之存量表高效迁移机制
1. 摘要 随着Apache Hudi变得越来越流行,一个挑战就是用户如何将存量的历史表迁移到Apache Hudi,Apache Hudi维护了记录级别的元数据以便提供upserts和增量拉取的核心 ...
- Apache Hudi在Hopworks机器学习的应用
Hopsworks特征存储库统一了在线和批处理应用程序的特征访问而屏蔽了双数据库系统的复杂性.我们构建了一个可靠且高性能的服务,以将特征物化到在线特征存储库,不仅仅保证低延迟访问,而且还保证在服务时间 ...
- 基于Apache Hudi 的CDC数据入湖
作者:李少锋 文章目录: 一.CDC背景介绍 二.CDC数据入湖 三.Hudi核心设计 四.Hudi未来规划 1. CDC背景介绍 首先我们介绍什么是CDC?CDC的全称是Change data Ca ...
- 基于 Apache Hudi 构建增量和无限回放事件流的 OLAP 平台
1. 摘要 在本博客中,我们将讨论在构建流数据平台时如何利用 Hudi 的两个最令人难以置信的能力. 增量消费--每 30 分钟处理一次数据,并在我们的组织内构建每小时级别的OLAP平台 事件流的无限 ...
- 详解Apache Hudi如何配置各种类型分区
1. 引入 Apache Hudi支持多种分区方式数据集,如多级分区.单分区.时间日期分区.无分区数据集等,用户可根据实际需求选择合适的分区方式,下面来详细了解Hudi如何配置何种类型分区. 2. 分 ...
- Cassandra开发入门文档第二部分(timeuuid类型、复合主键、静态字段详解)
timeuuid类型 timeuuid具有唯一索引和日期时间的综合特性,可以与日期和时间函数联合使用,常用的关联函数: dateOf() now() minTimeuuid() and maxTime ...
随机推荐
- 宝塔部署Nestjs
1. 在宝塔上下载pm2 2. 打包你的服务端代码 "npm run build && cp ./package.json ./dist/" 3. 在宝塔文件&qu ...
- 没想到即将上线的NGK生态应用这么厉害?!
话说这即将上线的NGK公链可不是闹着玩的,这条公链的蛰伏时间长达两年,恐怕这个准备时间,连最初的区块链1.0时代的项目都无法比拟,现在的话那都差太远了. 编程一段代码并不难,难的是耐得住赚快钱的心.人 ...
- Masterboxan INC 下半年将聚焦超高净值和家族全权委托客户
"投资是一个没有终点的奋斗.我们不能简单的预测市场,而是应对市场做出正确的反应.这需要我们不断反思.总结.提升,找到自己的投资哲学,然后用一生的时间去坚守."Masterboxan ...
- JVM必不可少的知识
1.Java垃圾回收机制 对象被判断为垃圾的标准:没有被其他对象引用 2.判断对象是否可被回收 (1)引用计数算法 判断对象的引用数量 通过判断对象的引用数量来决定对象是否可以被回收 每个对象实例都有 ...
- SpringBoot Test 多线程报错:dataSource already closed
1:前言 最近在项目中使用多线程对大任务拆分处理时,进行数据库操作的时候报错了. 业务代码大概是这样的: @Service public calss TestServiceImpl implement ...
- 第七届蓝桥杯JavaB组——第7题剪邮票
题目: 剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所示 ...
- Autocad中使用命令来调用python对Autocad二次开发打包后的exe程序
在Autocad中直接调用Python二次开发程序是有必要的,下面介绍一种方法来实现这个功能: 其基本思路是:先将二次开发的程序打包为可执行程序exe,然后编写lsp文件,该文件写入调用exe程序的语 ...
- 后端程序员之路 37、Akka、Actor、Scala初窥
Akkahttp://akka.io/ Akka 是一个用 Scala 编写的库,用于简化编写容错的.高可伸缩性的 Java 和 Scala 的 Actor 模型应用,是一个广泛运用的分布式应用框架. ...
- monkey稳定性测试的步骤及策略
1.adb的作用是什么?adb的全称:android debug bridge 安卓调试桥梁,包含在 Android SDK 平台工具软件包中.通过该命令与设备进行通信,以便进行调试adb可以同时管理 ...
- 对String Intern()方法的理解
今天重新看了一点周志明大佬的<深入理解Java虚拟机>,发现这个地方讲的不是很透彻,在网络上看到一些博客基本也都是在搬运原文,搞得一头雾水.弄了半天算是彻底明白了,做一下笔记. 搬运一下原 ...