【问题标题】:Split a KV<K,V> PCollection into multiple PCollections将一个 KV<K,V> PCollection 拆分为多个 PCollection
【发布时间】:2017-03-05 17:16:47
【问题描述】:

您好,在 KV Pcollection 上按键执行分组后,我需要:- 1) 使该 PCollection 中的每个元素成为单独的 PCollection。 2) 将这些单独的 PCollections 中的记录插入到 BigQuery 表中。 基本上我的目的是在 BigQuery 表中创建一个动态日期分区。 我怎样才能做到这一点? 举个例子真的很有帮助。

【问题讨论】:

  • 我尝试过分区,但无法从中生成 PCollection,我可以使用 Side Outputs 但由于我们必须预先声明元组标签,因此我没有考虑这样做,因为取决于数量数据源中的数据和其中记录的日期,可以有N个Tuple Tag。
  • 要非常具体,假设我有一个包含以下内容的文件:1 ABC 1991-07-18 2 DEF 1992-08-15 3 FGH 2015-01-01 4 IJK 2016-03-10 5 XYZ 1992-08-15 我想通过使用数据流在每个不同的日期创建动态分区来将此数据放入 BigQuery 表中。

标签: google-cloud-dataflow


【解决方案1】:

为了让 Google Dataflow 能够执行大规模并行化,使其成为同类产品之一(作为公共云上的服务),需要在将作业流提交到 Google 云控制台之前对其进行预定义。每次执行包含管道代码(包括管道选项和转换)的 jar 文件时,都会创建一个带有作业描述的 json 文件并将其提交到 Google 云平台。然后托管服务使用它来执行您的作业。

对于问题中提到的用例,它要求将输入 PCollection 拆分为与唯一日期一样多的 PCollections。对于拆分,应该动态创建拆分集合所需的元组标签,这目前是不可能的。不允许动态创建元组标签,因为这无助于创建工作描述 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.

您将不得不考虑重新构建数据源以将数据实时发送到数据流,但您将拥有一个动态日期分区的大查询表,数据处理结果接近实时。

参考资料 -

  1. Google Big Query Table Decorators
  2. Google Big Query Table insert using HTTP POST request
  3. How job description files work

注意:请在 cmets 中提及,如果需要,我将使用代码 sn-ps 详细说明答案。

【讨论】:

  • 感谢您的回复@paritosh...将尝试使用第一个选项来实现...第二个选项是不可能的,因为无法在流模式下运行管道...但是如果您来通过任何其他方式来做到这一点,请让我知道,或者如果我这样做,我会确保发布它......
  • 当然@rish0097 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 2023-02-13
  • 2019-02-09
相关资源
最近更新 更多