java - 如何在 Google Dataflow 中组合两组不同的标识符?
问题描述
我有两组相当大的数据,每组大约 600GB。
第一个签名是:
KV<String,String>
其中两者都String
表示来自Database A 的标识符。它实际上代表了它们之间的关系。KV<String,Long>
其中String
是来自数据库 A的标识符,Long
是来自数据库 B的标识符。此关系表示如何String
从Database A映射到Long
Database B。
我想收到一个带有签名的结果:KV<Long,Long>
它的大小与它的大小完全相同,KV<String,String>
但取自的值KV<String,Long>
实际上被视为一个巨大的HashMap
.
我可以想象这是许多 ETL 中非常常见的问题。有人可以提示我从哪里开始吗?
解决方案
给定标识符有多少个关系?
如果答案不是很多,您可以使用CoGroupByKey
https://beam.apache.org/documentation/programming-guide/#core-beam-transforms
CoGroupByKey
改变这个:
final List<KV<String, String>> emailsList =
Arrays.asList(
KV.of("amy", "amy@example.com"),
KV.of("carl", "carl@example.com"),
KV.of("julia", "julia@example.com"),
KV.of("carl", "carl@email.com"));
final List<KV<String, String>> phonesList =
Arrays.asList(
KV.of("amy", "111-222-3333"),
KV.of("james", "222-333-4444"),
KV.of("amy", "333-444-5555"),
KV.of("carl", "444-555-6666"));
进入这个:
final List<String> formattedResults =
Arrays.asList(
"amy; ['amy@example.com']; ['111-222-3333', '333-444-5555']",
"carl; ['carl@email.com', 'carl@example.com']; ['444-555-6666']",
"james; []; ['222-333-4444']",
"julia; ['julia@example.com']; []");
你可以做CoGroupByKey
两次,每个字符串一次一次KV<String,String>
。两次都将其与KV<String,Long>
.
但是,如果给定的标识符有大量的关系,默认CoGroupByKey
可能不是很有效,甚至可能会耗尽内存(因为KV<String,String>
数组的匹配数可能很大)。
听起来您可能需要编造自己的CoGroupByKey
/版本来GroupByKey
随时产生值,而不是在数组中构建它们。
如果您查看源代码,您会发现CoGroupByKey
&GroupByKey
只是PTransform
s。
推荐阅读
- c++ - 如何在 C++ 中输入 std::string_view?
- postgresql - 使用 TIMESTAMP 创建插入函数
- java - 你如何格式化数组来保存对象?
- javascript - Vue.js 中的静态道具验证
- c++ - 如何从动态数组中删除
- sharepoint - Power BI - 有条件地向值添加天数
- python - 我试图查看一个列表的任何值是否与另一个列表的任何值匹配,但我不能这样。请帮忙!..我不明白为什么
- excel - excel一个单元格中的数据想分成多个单元格
- kotlin - Dagger 2 组件保留旧参考
- html - 如何正确格式化我的导航栏,以便所有类别并排?