根据时间戳过滤Dataflow中的有界数据

时间:2016-06-11 18:10:49

标签: java google-cloud-dataflow

在我的数据流管道中,我将从BigQuery表中读取两个PCollections<TableRow>。我计划将这两个PCollections合并为一个PCollection,并带有flatten

由于BigQuery只是追加,因此目标是使用新的PCollection来截断BigQuery中的第二个表。

我已经阅读了文档,这是我很困惑的中间步骤。使用我的新PCollection,计划是使用Comparator DoFn查看最后一次更新日期并返回给定行。 我不确定是否应该使用过滤器转换,或者我应该按键进行分组然后使用过滤器?

所有PCollection<TableRow>将包含相同的值:IE:字符串,整数和时间戳。对于键值对,云数据流的大多数文档都只包含简单的字符串。 是否可以拥有一个键值对,它是PCollection<TableRow>的整行?

行看起来类似于:

customerID, customerName, lastUpdateDate
0001, customerOne, 2016-06-01 00:00:00
0001, customerOne, 2016-06-11 00:00:00

在上面的例子中,我想过滤PCollection,只是将第二行返回到将写入BigQuery的PCollection。 此外,是否可以在第三个PCollection上应用这些Pardo而不创建第四个?

1 个答案:

答案 0 :(得分:1)

您已经问了几个问题。我试图孤立地回答它们,但我可能误解了整个场景。如果您提供了一些示例代码,则可能有助于澄清。

  

使用我的新PCollection计划是使用Comparator DoFn查看最后一次更新日期并返回给定行。我不确定我是应该使用过滤器转换,还是应该按键进行分组,然后使用过滤器?

根据您的说明,您似乎想要获取PCollection个元素,并且每个customerID(密钥)都会找到该客户记录的最新更新。您可以使用提供的转换通过Top.largestPerKey(1, timestampComparator)完成此操作,您可以将timestampComparator设置为仅查看时间戳。

  

是否可以拥有一个键值对,它是PCollection的整行?

KV<K, V>可以包含密钥(K)和值(V)的任何类型。如果要按键分组,则键的编码器需要是确定性的。 TableRowJsonCoder不是确定性的,因为它可能包含任意对象。但听起来您希望键的customerID和值的整个TableRow

  

是否可以在第三次PCollection上应用这些Pardo而不创建第四个?

当您将PTransform应用于PCollection时,会产生新的PCollection。没有办法解决这个问题,并且您不需要尝试最小化管道中PCollections的数量。

PCollection是一个概念对象;它没有内在成本。您的管道将进行大量优化,以便许多中间PCollections - 尤其是ParDo变换序列中的那些 - 无论如何都不会实现。