zoukankan      html  css  js  c++  java
  • 一文彻底掌握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社区的支持。

    PS:如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”,将会是我不竭的动力!
    作者:leesf    掌控之中,才会成功;掌控之外,注定失败。
    出处:http://www.cnblogs.com/leesf456/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    如果觉得本文对您有帮助,您可以请我喝杯咖啡!

  • 相关阅读:
    greenDao 学习之坑 "java-gen" 目录下的类不能引用
    fastboot 刷system.img 提示 sending 'system' (*KB)... FAILED (remote: data too large)
    AndroidStudio导入第三方开源库 --文件夹源码
    git 克隆项目 与 分支简单操作
    Jquery当选中后费用或什么信息会自增长
    Jquery中各种标签的含义集合
    Jquery判断是否重复(连接到后台数据库进行比较)
    Jquery按空格键选中复选框或单选框
    JS(JQuery)操作Array的相关方法
    前端知识点-人资相关知识点
  • 原文地址:https://www.cnblogs.com/leesf456/p/14646801.html
Copyright © 2011-2022 走看看