Google cloud dataflow 我如何执行一个“任务”;“差别”;在两个源代码上使用ApacheBeam Python SDK提供密钥?

Google cloud dataflow 我如何执行一个“任务”;“差别”;在两个源代码上使用ApacheBeam Python SDK提供密钥?,google-cloud-dataflow,dataflow,apache-beam,Google Cloud Dataflow,Dataflow,Apache Beam,我一般性地提出了这个问题,因为这可能是一个一般性的答案。但一个具体的例子是比较两个具有相同模式但可能不同数据的BigQuery表。我需要一个diff,即关于复合键添加、删除、修改的内容,例如前两列 Table A C1 C2 C3 ----------- a a 1 a b 1 a c 1 Table B C1 C2 C3 # Notes if comparing B to A ------------------------------------

我一般性地提出了这个问题,因为这可能是一个一般性的答案。但一个具体的例子是比较两个具有相同模式但可能不同数据的BigQuery表。我需要一个diff,即关于复合键添加、删除、修改的内容,例如前两列

Table A
C1  C2  C3
-----------
a   a   1
a   b   1
a   c   1

Table B     
C1  C2  C3  # Notes if comparing B to A
-------------------------------------
a   a   1   # No Change to the key a + a
a   b   2   # Key a + b Changed from 1 to 2
            # Deleted key a + c with value 1
a   d   1   # Added key a + d
我基本上希望能够制作/报告对比说明。
或者从光束的角度来看,我可能只想输出多达4个带标签的PCollections:Unchanged、Changed、Added、Deleted。我该怎么做?PCollections会是什么样子?

基本上,这里要做的是连接两个表并比较结果,对吗?您可以查看连接两个表的两种方式(Side input或CoGroupByKey)

我还将使用
CoGroupByKey
为您的问题编写一个解决方案。我用Python编写代码是因为我更熟悉Python SDK,但您可以用Java实现类似的逻辑:

def make_kv_线对(x):
“”“输出添加了x[0]+x[1]键的记录。”“”
返回((x[0],x[1]),x)
表a=(p |‘ReadTableA’>>beam.Read(beam.io.BigQuerySource(..)
|'SetKeysA'>>beam.Map(制作千伏对)
表b=(p |‘ReadTableB’>>beam.Read(beam.io.BigQuerySource(..)
|'SetKeysB'>>beam.Map(制作千伏对))
联接的_表=({'table_a':table_a,'table_b':table_b}
|beam.CoGroupByKey())
输出类型=[“已更改”、“已添加”、“已删除”、“未更改”]
过滤等级DoFn(beam.DoFn):
def过程((键、值)):
表a\u值=列表(值['table\u a'])
table_b_值=列表(值['table_b'])
如果表_a_值==表_b_值:
收益率pvalue.TaggedOutput('unchanged',key)
elif len(表a值)len(表b值):
生成pvalue.TaggedOutput('removed',key)
elif表格a_值!=表格b_值:
生成pvalue.TaggedOutput('changed',key)
键集合=(已联接的表)
|beam.ParDo(FilterDoFn())。带有输出(*输出类型))
#现在您可以处理每个输出
key_collections.unchanged | WriteToText(…)
key_collections.changed | WriteToText(…)
key_collections.added | WriteToText(…)
key_collections.removed | WriteToText(…)