在我的数据流管道中,我将从BigQuery表中读取两个PCollections<TableRow>。我计划使用PCollection将这两个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而不创建第四个?

最佳答案

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


对于我的新PCollection,计划是使用Comparator DoFn查看最近一次更新的最大日期并返回给定的行。我不确定是否应该使用过滤器转换,或者是否应该先按组进行分组,然后再使用过滤器?


根据您的描述,您似乎希望采用元素的PCollection,并针对每个customerID(键)找到该客户记录的最新更新。您可以使用提供的转换通过Top.largestPerKey(1, timestampComparator)来实现此目的,在其中将timestampComparator设置为仅查看时间戳。


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


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


是否可以将这些Pardo应用于第三个PCollection而无需创建第四个?


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

PCollection是概念对象;它没有内在成本。您的流水线将进行大量优化,以使许多中间PCollections-尤其是一系列ParDo转换的中间-都永远不会实现。

关于java - 根据时间戳过滤数据流中的绑定(bind)数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37767050/

10-11 02:29