Hudi的precombine.field释疑

news/2024/11/19 23:22:12/

从不同资料,可看到四个让人迷惑的 precombine.field 配置项:

  • precombine.field

  • write.precombine.field

  • hoodie.table.precombine.field

  • hoodie.datasource.write.precombine.field

它们是完全相同,还是有什么关系了?

  • hoodie.datasource.write.precombine.field

HoodieWriteConfig.java

public class HoodieWriteConfig extends HoodieConfig {public static final ConfigProperty<String> PRECOMBINE_FIELD_NAME = ConfigProperty.key("hoodie.datasource.write.precombine.field").defaultValue("ts").withDocumentation("Field used in preCombining before actual write. When two records have the same key value, "+ "we will pick the one with the largest value for the precombine field, determined by Object.compareTo(..)");
}
  • hoodie.table.precombine.field

HoodieTableConfig.java

/*** Configurations on the Hoodie Table like type of ingestion,* storage formats, hive table name etc Configurations are loaded from hoodie.properties,* these properties are usually set during* initializing a path as hoodie base path and never changes during the lifetime of a hoodie table.** @see HoodieTableMetaClient* @since 0.3.0*/
public class HoodieTableConfig extends HoodieConfig {public static final ConfigProperty<String> PRECOMBINE_FIELD = ConfigProperty.key("hoodie.table.precombine.field").noDefaultValue().withDocumentation("Field used in preCombining before actual write. By default, when two records have the same key value, "+ "the largest value for the precombine field determined by Object.compareTo(..), is picked.");
}
  • precombine.field

这个是 FlinkSQL 专用的,不能在 SparkSQL 等上使用,write.precombine.field 也是如此。

FlinkOptions.java

/*** Hoodie Flink config options.** <p>It has the options for Hoodie table read and write. It also defines some utilities.*/
@ConfigClassProperty(name = "Flink Options",groupName = ConfigGroups.Names.FLINK_SQL,description = "Flink jobs using the SQL can be configured through the options in WITH clause."+ " The actual datasource level configs are listed below.")
public class FlinkOptions extends HoodieConfig {public static final String NO_PRE_COMBINE = "no_precombine";public static final ConfigOption<String> PRECOMBINE_FIELD = ConfigOptions.key("precombine.field").stringType().defaultValue("ts")// HoodieWriteConfig.PRECOMBINE_FIELD_NAME 为 hoodie.datasource.write.precombine.field.withFallbackKeys("write.precombine.field", HoodieWriteConfig.PRECOMBINE_FIELD_NAME.key()).withDescription("Field used in preCombining before actual write. When two records have the same\n"+ "key value, we will pick the one with the largest value for the precombine field,\n"+ "determined by Object.compareTo(..)");
}

从上面的 precombine.field 定义可以看到,precombine.field 同 write.precombine.field、hoodie.datasource.write.precombine.field 是一样的,最底层用的都是 hoodie.datasource.write.precombine.field 。

  • write.precombine.field

完全等同于 precombine.field

从上面还没看出 hoodie.table.precombine.field 同其它三个有和关系,实际上也是一样的,这从 HoodieTableFactory.java 的实现可以看到。

/*** Hoodie data source/sink factory.*/
public class HoodieTableFactory implements DynamicTableSourceFactory, DynamicTableSinkFactory {/*** Supplement the table config options if not specified.*/private void setupTableOptions(String basePath, Configuration conf) {StreamerUtil.getTableConfig(basePath, HadoopConfigurations.getHadoopConf(conf)).ifPresent(tableConfig -> {// HoodieTableConfig.RECORDKEY_FIELDS 为 hoodie.table.recordkey.fields// FlinkOptions.RECORD_KEY_FIELD 为 hoodie.datasource.write.recordkey.fieldif (tableConfig.contains(HoodieTableConfig.RECORDKEY_FIELDS)&& !conf.contains(FlinkOptions.RECORD_KEY_FIELD)) {conf.setString(FlinkOptions.RECORD_KEY_FIELD, tableConfig.getString(HoodieTableConfig.RECORDKEY_FIELDS));}// HoodieTableConfig.PRECOMBINE_FIELD 为 hoodie.table.precombine.field// FlinkOptions.PRECOMBINE_FIELD 为 precombine.field 和 write.precombine.field、hoodie.datasource.write.precombine.fieldif (tableConfig.contains(HoodieTableConfig.PRECOMBINE_FIELD)&& !conf.contains(FlinkOptions.PRECOMBINE_FIELD)) {conf.setString(FlinkOptions.PRECOMBINE_FIELD, tableConfig.getString(HoodieTableConfig.PRECOMBINE_FIELD));}if (tableConfig.contains(HoodieTableConfig.HIVE_STYLE_PARTITIONING_ENABLE)&& !conf.contains(FlinkOptions.HIVE_STYLE_PARTITIONING)) {conf.setBoolean(FlinkOptions.HIVE_STYLE_PARTITIONING, tableConfig.getBoolean(HoodieTableConfig.HIVE_STYLE_PARTITIONING_ENABLE));}});}
}
  • 总结

precombine.field 和 write.precombine.field 仅限 FLinkSQL 使用。

HoodieConfig.java

/*** This class deals with {@link ConfigProperty} and provides get/set functionalities.*/
public class HoodieConfig implements Serializable {public <T> String getString(ConfigProperty<T> configProperty) {Option<Object> rawValue = getRawValue(configProperty);return rawValue.map(Object::toString).orElse(null);}private <T> Option<Object> getRawValue(ConfigProperty<T> configProperty) {if (props.containsKey(configProperty.key())) {// 从 key 取到值return Option.ofNullable(props.get(configProperty.key()));}// 从 key 没有取到值,遍历所有的将废弃的 keysfor (String alternative : configProperty.getAlternatives()) {if (props.containsKey(alternative)) {LOG.warn(String.format("The configuration key '%s' has been deprecated "+ "and may be removed in the future. Please use the new key '%s' instead.",alternative, configProperty.key()));return Option.ofNullable(props.get(alternative));}}return Option.empty();}
}

http://www.ppmy.cn/news/63481.html

相关文章

PMP课堂模拟题目及解析(第6期)

51. 管理层将一个国际项目分配给一位新项目经理。这是该项目经理第一次与团队合作&#xff0c;团队成员位于两个国家&#xff0c;数量平均分布&#xff0c;一个团队由最合适作为个人工作的成员组成&#xff0c;另一个团队由最适合作为团队工作的成员组成。项目经理该怎么做&am…

双目测距--3 双目标定

目录 -1 流程说明&#xff1a; 0 几个重要 函数 1、calibrateCamera()函数 2、stereoCalibrate() 3、findChessboardCorners() 棋盘格角点检测 4、stereoRectify() 5、initUndistortRectifyMap() 6、remap() 1、用于标定的图像 2、标定前 3、OpenCV进行双目标定 单…

QT QFormLayout表单布局控件

本文详细的介绍了QFormLayout控件的各种操作&#xff0c;例如&#xff1a;新建界面、控件布局、添加控件、添加标签、标签插入、删除控件行、显示格式、总行数、列间距、行间距、行列间距、其它文章等等操作。 实际开发中&#xff0c;一个界面上可能包含十几个控件&#xff0c;…

对称加密与非对称加密、证书、SSL/TLS握手过程

文章目录 对称加密(Symmetrical Encryption)&#xff1a;非对称加密(Asymmetric Encryption)&#xff1a;区别&#xff1a;SSL证书TLS1.2握手过程 对称加密(Symmetrical Encryption)&#xff1a; 对称加密&#xff0c;是一种既简单速度又快的加密方式&#xff0c;加密与解密使用…

【MySQL】(5)聚合函数

文章目录 聚合函数COUNT 函数SUM 函数AVG 函数MAX 函数 MIN 函数 group by 子句简介示例&#xff1a;scott 数据库单列分组多列分组 having 子句总结 聚合函数 在 MySQL 中&#xff0c;聚合函数是用于计算多行数据的统计信息的函数&#xff0c;例如总和、平均值、最大值、最小…

C++之虚函数原理

对象数据和函数的存储方式 注意说的是对象。 C中的对象存储方式是 每个对象占用的存储空间只是该对象的数据部分&#xff08;虚函数指针和虚基类指针也属于数据部分&#xff09;&#xff0c;函数属于公共部分。 虚函数表 虚函数是通过虚函数表实现的。 C实现虚函数的方法是…

Android 原生播放音频有哪些方式

文章目录 使用 MediaPlayerMediaPlayer特点 关于 SoundPool关于 AudioTrack关于 AudioRecordAudioRecord 降噪 总结 之前一片文章简单讲述了通过TTS和Audio相关API控制文本输出语音的方法&#xff0c;接下来学习一下其他原生方式的语音播放功能。 使用 MediaPlayer 项目中除了…

轻量级的安卓百分比屏幕适配方案SimpleAutoSize

AutoSize是基于今日头条的适配方案&#xff0c;但它有一些缺点&#xff0c;比如代码侵入性较强&#xff0c;在使用第三方的View框架时&#xff0c;可能会出现不兼容的情况。 我目前的sdk项目不能使用这样的框架&#xff0c;于是自己做了一个简单的工具类&#xff0c;也能够满足…