使用 Dataflow Java 代码加入嵌套结构表

Posted

技术标签:

【中文标题】使用 Dataflow Java 代码加入嵌套结构表【英文标题】:Join Nested Structure Table using Dataflow Java code 【发布时间】:2019-04-02 09:53:41 【问题描述】:

我的目标是连接两个表,其中第二个表是正常的,第一个是嵌套结构表。连接键在第一个表的嵌套结构中可用。在这种情况下,如何使用数据流 java 代码连接这两个表。 WithKeys (org.apache.beam.sdk.transforms.WithKeys) 接受直接列名,它不允许像firstTable.columnname。有人可以帮助解决这个问题。

【问题讨论】:

是否有理由在输出表中有这种嵌套结构?我们可以将输出扁平化为:Cusname、Custno、headerid、cr.date、lineid、item desc 吗?这会让事情变得更容易 tbh .. 我已经回答了同样的问题here,它在带有 apache Beam 的 python 中,可能对你有帮助。在 ParDo addkeysnested 函数中,我从嵌套字段中获取键值。通过使用此代码,您无需取消嵌套字段。所以我们不需要改变表的模式结构。 【参考方案1】:

如果两个表同样大,请考虑使用here 中描述的 CoGroupByKey 转换。在此操作之前,您必须将您的数据转换为两个由正确键键入的 PCollections。

如果一个表明显小于另一个表,则将较小的 PCollection 作为侧输入提供给 ParDo,而不是较大的 PCollection,如 here 所述。

【讨论】:

如果我们的集合具有 Unnest 类型,CoGroupByKey 将适用于连接两个集合,因为通用键可以通过 WithKey() 从非嵌套集合中读取。但是如果通用键在嵌套集合内,则 CoGbkResult具有空值,因为公共键出现在嵌套结构内部,所以它不匹配并且抛出集合是空的。在这种情况下,您认为我们每次加入集合之前都需要取消嵌套集合,还是我们有其他加入嵌套集合的想法?我附上屏幕截图以供参考。 是的,我相信您必须从元素中取消嵌套键并使用正确的键定义 PCollections 的 KV。 感谢您的回复。你能举个java的例子吗? 我只是按照下面的 *** 链接加入集合。 WithKeys 方法不能接受基于嵌套列的分组集合,如“firstTable.columnname”。您能否提供帮助,如何在 WithKeys 函数中加入嵌套列。 ***.com/questions/50175971/… 你想试试 BeamSQL 吗? BeamSQL 允许在嵌套类型的内部字段上进行 JOIN。

以上是关于使用 Dataflow Java 代码加入嵌套结构表的主要内容,如果未能解决你的问题,请参考以下文章

Dataflow SQL (GCP) 不支持使用 STRUCT 的嵌套行

如何在Apache Beam / Google Dataflow中使用ParseJsons?

java-if嵌套结构的一个作业

Java/Dataflow - 无法使用 ClassLoader 检测类路径元素

JAVA - Apache BEAM- GCP:GroupByKey 与 Direct Runner 一起工作正常,但与 Dataflow runner 一起失败

使用 Dataflow 和 Java 删除 Firestore 集合