如何将表行PCollections转换为Python中的键值PCollections?

时间:2017-11-30 20:41:16

标签: python-3.x google-cloud-dataflow apache-beam dataflow

没有关于如何将pCollections转换为输入到.CoGroupByKey()

所需的pCollections的文档

上下文 基本上我有两个大的pCollections,我需要能够找到两者之间的差异,对于II型ETL更改(如果它不存在于pColl1中然后添加到pColl2中找到的嵌套字段),那么我就是能够从BigQuery保留这些记录的历史记录。

管道架构:

  1. 将BQ表读入2个pCollections:dwsku和product。
  2. 将CoGroupByKey()应用于两组以返回 - >结果
  3. 解析结果以查找dwsku中的所有更改并将其嵌套到产品中。
  4. 建议任何帮助。我在SO上发现了一个java链接,它完成了我需要完成的同样的事情(但是在Python SDK上没有任何内容)。

    Convert from PCollection<TableRow> to PCollection<KV<K,V>>

    是否有针对Apache Beam的文档/支持,尤其是Python SDK?

1 个答案:

答案 0 :(得分:7)

为了让CoGroupByKey()正常工作,您需要PCollections tuples,其中第一个元素是,第二个 - < strong>数据。

在你的情况下,你说你有BigQuerySource,它在当前版本的Apache Beam输出PCollection of dictionariescode)中,其中每个条目代表表格中的一行被读过。您需要将此PCollections映射到元组,如上所述。使用ParDo

很容易做到这一点
class MapBigQueryRow(beam.DoFn):
    def process(self, element, key_column):
        key = element.get(key_column)
        yield key, element


data1 = (p
            | "Read #1 BigQuery table" >> beam.io.Read(beam.io.BigQuerySource(query="your query #1"))
            | "Map #1 to KV" >> beam.ParDo(MapBigQueryRow(), key_column="KEY_COLUMN_IN_TABLE_1"))

data2 = (p
            | "Read #2 BigQuery table" >> beam.io.Read(beam.io.BigQuerySource(query="your query #2"))
            | "Map #2 to KV" >> beam.ParDo(MapBigQueryRow(), key_column="KEY_COLUMN_IN_TABLE_2"))

co_grouped = ({"data1": data1, "data2": data2} | beam.CoGroupByKey())

# do your processing with co_grouped here

BTW,可以找到用于Apache Beam的Python SDK文档here