在我的数据流管道中,我将从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
而不创建第四个?
答案 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
变换序列中的那些 - 无论如何都不会实现。