Python 我可以在多个键(连接条件)上连接Dataflow(Apache Beam)中的两个表吗?

Python 我可以在多个键(连接条件)上连接Dataflow(Apache Beam)中的两个表吗?,python,join,google-cloud-dataflow,apache-beam,Python,Join,Google Cloud Dataflow,Apache Beam,我有两张桌子,像: ID Name Age 1 Alex 20 2 Sarah 21 and so on ..................... ID Name Marks 1 Alex 80 2 Sarah 78 and so on ..................... 我想在多个键连接条件I上使用云数据流apachebeam连接这两个表。EID和Name都是公共列。我怎样才能做到 我曾尝试使用一个键一个公共列连接它,但我不知道如何使用多个键 我将此代码用作参考:

我有两张桌子,像:

ID Name  Age
1  Alex  20
2  Sarah 21 and so on
.....................
ID Name  Marks
1  Alex  80
2  Sarah 78 and so on
.....................
我想在多个键连接条件I上使用云数据流apachebeam连接这两个表。EID和Name都是公共列。我怎样才能做到

我曾尝试使用一个键一个公共列连接它,但我不知道如何使用多个键

我将此代码用作参考:

类连接表: def添加密钥详细信息自身,行,密钥详细信息: 结果=行。复制 尝试: result.updatekey_详细信息[行['name']] 除KeyError作为错误外: traceback.print\u exc logging.errorName找不到错误:%s,错误 返回结果 def runargv=无: 连接表=连接表 表1=p |“从BigQuery中读取表1详细信息”>>beam.io.Read beam.io.BigQuerySource query='SELECT*来自'dataset.table1`, 使用标准sql=True |“关键详细信息1'>>beam.Maplambda行:行['name',行 表2=p |“从BigQuery中读取表2详细信息”>>beam.io.Read beam.io.BigQuerySource query='SELECT*来自'dataset.table2`, 使用标准sql=True |“使用侧面输入1连接数据”>>beam.Mapjointables.add_key_详细信息,如表1所示 TLDR:您需要使用元组键ID、名称映射table1,然后使用这两个值访问行

使用元组映射 |'Key Details 1'>>beam.Maplambda行:行['id'],行['name'],行 使用元组访问 result.updatekey_详细信息[行['id'],行['name']] 说明:

加入这里基本上是:

将表1转换为KV对,其中K为字段,V为行 beam.Maplambda行:行['name',行 通过表1 beam.Mapjointables.add_key_详情,如表1所示 对于table2的每一行,使用相同的键和 result.updatekey_详细信息[行['name']] 返回包含新字段的新行。 在这里,您在步骤1和3中使用的字段是“name”。如果您想使用其他名称,只需调用其他名称,例如:row['id']。获取多个字段的技巧是使用元组作为键。这样,只需将您的行映射到第['id']行、第['name']行,并在add_key_details中使用它即可访问正确的table1行


希望这有帮助

是的,你能做到。一旦从两个BigQuery源获得两个PCollection,就需要进行一些预处理,使用CoGroupByKey,然后按照Rafael的回答取消对记录的测试。如果需要在多个位置执行类似类型的联接,还可以使用复合变换来抽象所有这些内容,只需传递PCollections,即要联接的列名。这一点在本文中有很好的描述