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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    如果觉得本文对您有帮助,您可以请我喝杯咖啡!

  • 相关阅读:
    PAT (Advanced Level) Practice 1055 The World's Richest (25 分) (结构体排序)
    PAT (Advanced Level) Practice 1036 Boys vs Girls (25 分)
    PAT (Advanced Level) Practice 1028 List Sorting (25 分) (自定义排序)
    PAT (Advanced Level) Practice 1035 Password (20 分)
    PAT (Advanced Level) Practice 1019 General Palindromic Number (20 分) (进制转换,回文数)
    PAT (Advanced Level) Practice 1120 Friend Numbers (20 分) (set)
    从零开始吧
    Python GUI编程(TKinter)(简易计算器)
    PAT 基础编程题目集 6-7 统计某类完全平方数 (20 分)
    PAT (Advanced Level) Practice 1152 Google Recruitment (20 分)
  • 原文地址:https://www.cnblogs.com/leesf456/p/14646801.html
Copyright © 2011-2022 走看看