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,即要联接的列名。这一点在本文中有很好的描述