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的主键和分区配置的更多相关文章

  1. 一文彻底理解Apache Hudi的多版本清理服务

    Apache Hudi提供了MVCC并发模型,保证写入端和读取端之间快照级别隔离.在本篇博客中我们将介绍如何配置来管理多个文件版本,此外还将讨论用户可使用的清理机制,以了解如何维护所需数量的旧文件版本 ...

  2. 一文彻底掌握Apache Hudi异步Clustering部署

    1. 摘要 在之前的一篇博客中,我们介绍了Clustering(聚簇)的表服务来重新组织数据来提供更好的查询性能,而不用降低摄取速度,并且我们已经知道如何部署同步Clustering,本篇博客中,我们 ...

  3. MyBatis在insert插入操作时返回主键ID的配置

    在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:如果业务层需要得到记录的主键时,可以通过Mapper.XML配置的方式来完成这个功能. 在 INSER ...

  4. Apache Hudi重磅特性解读之存量表高效迁移机制

    1. 摘要 随着Apache Hudi变得越来越流行,一个挑战就是用户如何将存量的历史表迁移到Apache Hudi,Apache Hudi维护了记录级别的元数据以便提供upserts和增量拉取的核心 ...

  5. Apache Hudi在Hopworks机器学习的应用

    Hopsworks特征存储库统一了在线和批处理应用程序的特征访问而屏蔽了双数据库系统的复杂性.我们构建了一个可靠且高性能的服务,以将特征物化到在线特征存储库,不仅仅保证低延迟访问,而且还保证在服务时间 ...

  6. 基于Apache Hudi 的CDC数据入湖

    作者:李少锋 文章目录: 一.CDC背景介绍 二.CDC数据入湖 三.Hudi核心设计 四.Hudi未来规划 1. CDC背景介绍 首先我们介绍什么是CDC?CDC的全称是Change data Ca ...

  7. 基于 Apache Hudi 构建增量和无限回放事件流的 OLAP 平台

    1. 摘要 在本博客中,我们将讨论在构建流数据平台时如何利用 Hudi 的两个最令人难以置信的能力. 增量消费--每 30 分钟处理一次数据,并在我们的组织内构建每小时级别的OLAP平台 事件流的无限 ...

  8. 详解Apache Hudi如何配置各种类型分区

    1. 引入 Apache Hudi支持多种分区方式数据集,如多级分区.单分区.时间日期分区.无分区数据集等,用户可根据实际需求选择合适的分区方式,下面来详细了解Hudi如何配置何种类型分区. 2. 分 ...

  9. Cassandra开发入门文档第二部分(timeuuid类型、复合主键、静态字段详解)

    timeuuid类型 timeuuid具有唯一索引和日期时间的综合特性,可以与日期和时间函数联合使用,常用的关联函数: dateOf() now() minTimeuuid() and maxTime ...

随机推荐

  1. NGK Global首尔站:内存是未来获取数字财富的新模式

    近日,NGK路演在NGK韩国社区的积极举办下顺利落下帷幕.此次路演在首尔举行,在活动当天,NGK的核心团队成员.行业专家.投资银行精英.生态产业代表和数百名NGK韩国社区粉丝一起参加NGK Globa ...

  2. uniapp 滑动切换

    说明:本案例的样式基于colorui组件库 感兴趣的小伙伴可以看下教程 colorui组件库开发文档或者csdn的文档,顺便再分享下 colorui的群资源 最近项目中需要用到滑动切换的效果,自己懒得 ...

  3. 2021-02:Teams开发平台更新概述

    作为2021年工作计划的一部分,我会在每月的第三个星期五发布Teams开发平台的更新报告,给大家整理和讲解最新的平台功能,以及特色场景.这是第一篇文章,我会挑选截至到2月份一些重要的更新,以后每月的更 ...

  4. 第七届蓝桥杯JavaB组——第6题方格填数

    解决方案:利用全排列和递归 使用Java中的集合API:HashMap ArrayList package com.lzp.lanqiaoseven.p6; import java.util.*; / ...

  5. DRF 视图家族及路由层补充

    目录 视图家族 一.views视图类 1.APIView类 2.GenericAPIView类(generics中) 二.mixins类:视图辅助工具 1.RetrieveModelMixin 2.L ...

  6. 【函数分享】每日PHP函数分享(2021-3-1)

    array_filter - 使用回调函数过滤数组的元素 说明 array_filter ( array $array , callable|null $callback = null , int $ ...

  7. 剑指 Offer 58 - II. 左旋转字符串 + 简单题

    剑指 Offer 58 - II. 左旋转字符串 Offer_58_2 题目描述 java代码 package com.walegarrett.offer; /** * @Author WaleGar ...

  8. POJ-1087(最大流+EK算法)

    A Plug for UNIX POJ-1087 这一题也是最大流的应用,但是题目有点绕. 题目的意思就是有插座和插头,只不过这里使用设备取代了插头.只有插座和设备进行匹配了. 题目要注意的是那个适配 ...

  9. EurekaServer源码分析

    Eureka Server功能 接受服务注册 接受服务心跳 服务剔除 服务下线 集群同步 获取注册表中服务实例信息 需要注意的是,Eureka Server同时也是一个Eureka Client,在不 ...

  10. Java I/O流 03

    I/O流·字符流 字符流FileReader * A:字符流是什么 * 字符流是可以直接读写字符的 IO流 * 字符流读取字符,就要先读取到字节数据,然后转换为字符:如果要写出字符,需要把字符转换为字 ...