- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
在 Hudi 中可以根据业务场景为 Hudi 表配置负载类Payload,它用于在更新期间合并同一记录的两个版本。本文将深入了解有效负载类的用途以及可以使用的所有不同方式。 配置: hoodie.datasource.write.payload.class 。
注意:对于 新的记录合并API ,这些可能会发生变化。 因此此有效负载类详细信息适用于 Hudi 0.13.0 之前的所有版本。 未来的版本可能会弃用这一点.
Hudi 有一个有效负载类接口,它将确定如何将同一记录的两个版本合并在一起。 核心方法如下:
/**
* This methods lets you write custom merging/combining logic to produce new values as a function of current value on storage and whats contained
* in this object. Implementations can leverage properties if required.
* <p>
* eg:
* 1) You are updating counters, you may want to add counts to currentValue and write back updated counts
* 2) You may be reading DB redo logs, and merge them with current image for a database row on storage
* </p>
*
* @param currentValue Current value in storage, to merge/combine this payload with
* @param schema Schema used for record
* @param properties Payload related properties. For example pass the ordering field(s) name to extract from value in storage.
* @return new combined/merged value to be written back to storage. EMPTY to skip writing this record.
*/
Option<IndexedRecord> combineAndGetUpdateValue(IndexedRecord currentValue, Schema schema, Properties properties) throws IOException;
Hudi 在内部将一条记录表示为 HoodieRecord,它由一对 HoodieKey 和 HoodieRecordPayload 组成。 正如我们在之前的博客中看到的,HoodieKey 代表一条记录的主键(通常是分区路径和记录键)。 HoodieRecordPayload是用户实际传入的数据.
让我们来看一个典型的例子。 在 commit1 中摄取了 2 条记录,即 {HK1, payload1_1} 和 {HK2, payload2_1}。 在 commit2 中,假设摄取 {HK1, payload1_2} 和 {HK3, payload3_1}.
由于更新了 HK1,Hudi 将合并两个有效载荷(payload1_1 和 payload1_2 以产生 HK1 的最终输出。这就是上面显示的 combineAndGetUpdateValue() 发挥作用的地方.
本质上,HK1.payload1_2.combineAndGetUpdateValue(HK1.payload1_1) 在 commit2 结束时推导出 HK1 的最终值.
在这种情况下,让我们深入研究 Hudi 提供的一些有效负载实现。 默认负载类称为 OverwriteWithLatestAvroPayload.
正如 名称 所暗示的那样,当使用此有效负载类时,我们只需使用新的传入值覆盖任何现有值。 因此,在上述示例中,一旦 commit2 完成,payload1_2 将成为 HK1 的最终值。 这是 Hudi 提供的最简单的有效负载,并且对社区中的大多数用户来说效果很好.
我们还有一个名为 DefaultHoodieRecordPayload 的负载类。 与 Hudi 一开始就提供的 OverwriteWithLatestAvroPayload 相比,这个 DefaultHoodieRecordPayload 是在 1.5 年前引入的。 让我们深入了解一下这个负载类的特殊之处.
一般来说,Hudi表可以配置 preCombine 字段。 简而言之 preCombine 字段用于解决同一批次中同一记录的两个版本之间的优胜者。 例如,如果在写入 Hudi 时在同一批次中摄取 {HK1, payload1_1} 和 {HK1, payload1_2},Hudi 将在内部路由之前对传入记录进行去重。 因此在这种情况下,preCombine 字段值将决定多个版本中的获胜者.
例如可以在表schema中选择“updated_at”字段作为 preCombine 字段。 因此,如果传入批次中有超过 1 条具有相同 HoodieKey 的记录,则具有较高 preCombine 值的记录将优先.
尽管 OverwriteWithLatestAvroPayload 和 DefaultHoodieRecordPayload 可能看起来很相似,但有一个关键区别。 这是 combineAndGetUpdateValue() 的实现方式。 DefaultHoodieRecordPayload 在将传入记录与存储中的记录合并时也遵循 preCombine 值,而 OverwriteWithLatestAvroPayload 将盲目地选择传入而不是存储中的任何内容.
让我们添加带有插入记录(HK3,以及 HK1 的更新值)的 commit2.
OverwriteWithLatestAvroPayload 和 DefaultHoodieRecordPayload 都用 payload1_2 更新了 HK1。 OverwriteWithLatestAvroPayload 始终选择较新的传入,因此选择了 payload1_2。 DefaultHoodieRecordPayload 根据 preCombine 字段值推导。 由于 payload1_2 的预组合字段值(20)高于 payload1_1 的预组合字段值(10),DefaultHoodieRecordPayload 也选择 payload1_2 作为 HK1 的最终快照.
现在让我们使用 commit3,它使用较低的 preCombine 值更新 HK1 以模拟迟到的数据.
OverwriteWithLatestAvroPayload 选择新的传入有效负载而不考虑 preCombine 值,因此它选择 payload1_3 作为 HK1 的最终值。 但 DefaultHoodieRecordPayload 根据 preCombine 值选择最终获胜者,因此它选择 payload1_2 作为 HK1 的最终快照值.
社区有其他有效负载类供使用,如 OverwriteNonDefaultsWithLatestAvroPayload 、 AWSDmsAvroPayload 、 MySqlDebeziumAvroPayload 、 PostgresDebeziumAvroPayload 等.
还可以自定义合并两个版本的记录的负载类,为 lakehouse 用户提供了极大的灵活性。 如果不是 SparkSQL 写入(MERGE INTO),没有多少系统能给你这种灵活性,但 Hudi 用户从一开始就享受它 。
因为不同用例的场景不同,Hudi 支持Payload方式提供灵活性,有效负载类就是这样一种设计,可以根据自己的需求定义自己的 Payload 类,而不是局限于 Hudi 提供的 Payload。 希望这篇博客有助于理解有效负载类的用途、常用的有效负载实现.
最后此篇关于ApacheHudi负载类Payload使用案例剖析的文章就讲到这里了,如果你想了解更多关于ApacheHudi负载类Payload使用案例剖析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
概述 我想实现一个 Lucene 索引器/搜索器,它使用新的有效负载功能,允许向文本添加元信息。在我的具体情况下,我向概念标签添加权重(可以理解为 % 概率,介于 0 到 100 之间),以便使用它们
我正在分析一个 metasploit 漏洞 here我试图弄清楚 payload.encoded 中的 payload 来自第 358 行。我是开发开发的新手,但基本的编程规则说 payload 应该
我从我的 javascript 发送交易 Metamask 打开传输对话框 我确定 i get an error message in metamask (inpage.js:1 MetaMask -
action.payload 何时、何地以及为什么被调用?请任何人帮助我了解action.payload的实际用途是什么。我已经搜索了很多网站,但我不明白.. 最佳答案 当您处理请求时,例如单击我们需
我用 Angular 编写代码,在一种情况下,json 返回一个值(如有效负载),我需要对其进行解密。我有一个这样的有效载荷: 我需要解码它。像下面的方式:例如,$B 部分的值我只需要 14,$s 的
我正在编写一个进行服务调用的 Chrome 扩展。 当我发出同源 POST ajax 请求时,我的数据对象以 JSON 格式传递: $.ajax(sameOriginURL, { data
如何在连接语句的 lambda 中访问信号的“有效负载”? 假设信号看起来像这样: signals: void stateChanged(std::pair); 现在在 connect 语句中,我
我正在尝试使用 RestSharp 来使用查询 rest,但我总是收到 Bad Request 响应。代码: var url = "https://gql.tokopedia.com/graphql/
在 Android GCM 文档中,据说有效载荷最大为 4096 字节限制。 payload的4096字节是否包括registration_id长度?我发现我可以发送有效载荷为 16038 字节(包括
前言 做过前后端联调的小伙伴,可能有时会遇到一些问题。例如,我明明传递数据给后端了,后端为什么说没收到呢?这时候可能就会就会有小伙伴陷入迷茫,本文从chrome-dev-tools(F12调试器)中看
我将 JSON 提供给某个网络钩子(Hook)以触发通知 (M$ Teams)。这很好用。但是,我想扩展我的 Perl 脚本:我需要在特定条件下向我的“messagecard”构造添加一个新节点。 例
我有一个 Xamarin 项目(UWP 和 iOS)在 VS2015 中构建并运行良好。 该项目包含一些通用 Windows 和 iOS 项目,以及两个平台使用的许多 PCL(用于 View 模型、服
我正在使用 Hyperledger Fabric Java SDK 通过 txId 获取交易。返回对象包含交易信息。 TransactionInfo txInfo = channel.queryTra
我有以下代码,用于检查 token 并授权 Google 用户登录 GoogleIdToken.Payload tempPayload = token.getPayload(); if (!tempP
当我们使用 sqlmap ,它会自动执行查找网站的 sql 注入(inject) 的所有操作。我感兴趣的是我直接在我的浏览器中发送恶意查询并在其中获取结果,但是当我找不到任何东西时,我使用 sqlma
我正在使用 Redux 和 React 从 API 加载数据。尽管成功提取数据并将其应用到状态,但它会抛出错误: Uncaught TypeError: Cannot read property 'p
我对 python 的随机函数有一个问题。我不知道哪个随机函数适用于此代码: name=['toffla','rebecca','toff','becca'] if (parser.getPayloa
在阅读了 Heartbeat 的 RFC 6520 后,我有几个问题: https://www.rfc-editor.org/rfc/rfc6520 具体来说,我不明白为什么心跳需要包含任意有效负载甚
如何用php curl发送请求负载? 我正在尝试将一个文件上传到一个免费托管文件的服务器,当将文件发送到curl时,我不接受它,我重定向到一个错误页,当我从您的interfas中执行此操作时,我可以在
我有一个非 ARC 项目,现在我在成功迁移后使用 SDK 8.1 迁移了应用程序 Xcode 6,当我尝试将其存档时,*.ipa 文件已创建,但如果我尝试通过上传应用程序diawi 或 hokey 应
我是一名优秀的程序员,十分优秀!