嗨,在KV Pcollection上按键进行分组后,我需要: - 1)使该PCollection中的每个元素成为单独的PCollection。 2)将那些单独的PCollections中的记录插入BigQuery表中。 基本上我的目的是在BigQuery表中创建一个动态日期分区。 我怎样才能做到这一点? 一个例子真的会有所帮助。
答案 0 :(得分:1)
为了让Google Dataflow能够执行大规模并行化,使其成为同类产品之一(作为公共云上的服务),需要预先确定工作流程,然后再将其提交到Google云端控制台。每次执行包含您的pipleline代码的jar
文件(包括管道选项和转换)时,都会创建一个包含作业描述的json
文件并将其提交给Google云平台。然后托管服务使用它来执行您的工作。
对于问题中提到的用例,它要求将输入PCollection
拆分为与其唯一日期一样多的PCollection
。对于拆分,应该动态创建分割集合所需的元组标签,这在目前是不可能的。不允许动态创建元组标记,因为这对创建作业描述json
文件没有帮助,并且超过了构建数据流的整个设计/目的。
我可以想到这个问题的几个解决方案(两者都有自己的优点和缺点):
解决方案1(问题中确切用例的解决方法):
编写一个数据流转换,它接受输入PCollection
和输入中的每个元素 -
1. Checks the date of the element.
2. Appends the date to a pre-defined Big Query Table Name as a decorator (in the format yyyyMMDD).
3. Makes an HTTP request to the BQ API to insert the row into the table with the table name added with a decorator.
您必须考虑此方法中的成本角度,因为如果我们使用了BigQueryIO数据流sdk模块,则每个元素都有单个HTTP请求,而不是BQ加载作业。
解决方案2(在这些用例中应遵循的最佳做法):
1. Run the dataflow pipeline in the streaming mode instead of batch mode.
2. Define a time window with whatever is suitable to the scenario in which it is being is used.
3. For the `PCollection` in each window, write it to a BQ table with the decorator being the date of the time window itself.
您必须考虑重新架构数据源以实时将数据发送到数据流,但您将拥有一个动态日期分区大查询表,其数据处理结果接近实时。
参考文献 -
注意:请在评论中提及,如果需要,我会用代码片段详细说明答案。