基本上我们希望根据特定列(不是日期)的值将一个大的(数十亿行)bigquery表拆分成一个大的(可以是大约100k)小表。我无法弄清楚如何在bigquery中有效地做到这一点,所以我正在考虑使用数据流。
使用数据流,我们可以先加载数据,然后为每条记录创建一个键值对,键是我们要拆分表的特定列的所有可能值,然后我们可以按以下顺序对记录进行分组键。所以在这个操作之后,我们有PCollection(key,[records])。然后我们需要将PCollection写回bigquery表,表名可以是key_table。
所以操作将是:p | beam.io.Read(beam.io.BigQuerySource())| beam.map(lambda record:(record ['splitcol'],record))| beam.GroupByKey()| beam.io.Write(beam.io.BigQuerySink)
现在的关键问题是如何根据PCollection中每个元素的值在最后一步中写入不同的表。
这个问题与另一个问题有某种关系: Writing different values to different BigQuery tables in Apache Beam。但我是一个python人,不确定在Python SDK中是否也可以使用相同的解决方案。
答案 0 :(得分:0)
目前,此功能(取决于值BigQueryIO.write()
)仅在Beam Java中受支持。遗憾的是,我无法想到使用Beam Python模拟它的简单方法,而不是重新实现相应的Java代码。请随时打开JIRA功能请求。
我想最简单的想法是使用BigQuery streaming insert API(而不是Beam BigQuery连接器)编写DoFn
来手动将行写入相应的表中,但请记住流式插入更昂贵,并且受批量导入(在编写有界PCollection
时由Java BigQuery连接器使用)的更严格的配额策略。
在Beam中还有一些工作允许跨语言重用变换 - 正在https://s.apache.org/beam-mixed-language-pipelines讨论设计。完成该工作后,您将能够使用Python管道中的Java BigQuery连接器。