2016-03-10 47 views
1

我们有一个大约90 GB的输入数据源(可以是CSV或XML,无关紧要),它包含已经排序的数据列表。为了简单起见,您可以将其视为具有两列:时间列和字符串列。该文件中的数亿行已按时间列按升序排序。有没有办法告诉Google Cloud Dataflow进来的数据已经订购了?

在我们的Google云DataFlow中,我们将每一行建模为Pcollection中的一个元素,并将DoFn转换应用于字符串字段(例如,计算字符串中大写字符的数量等)。这工作正常。

但是,我们需要应用一段时间(例如五分钟)计算的函数,并重叠一分钟。所以,我们正在考虑使用滑动窗口函数(即使数据是有界的)。

但是,需要在这五分钟窗口上应用的计算逻辑假定数据按时间字段按逻辑顺序排列(即升序)。我的理解是,即使在使用这些窗口函数时,也不能认为每个窗口中的P集合对象都以任何方式排序 - 所以需要手动遍历每个P集合并重新排序它们,对吧?但是,这似乎是计算能力的巨大浪费,因为传入数据已包含有序数据。那么,有没有办法教/通知Google云数据流,输入数据是按顺序排列的,以便在窗口内维持该顺序?

在一个小问题上,我有另一个问题:我的理解是,如果数据源是无界的,那么永远不会执行一个“全局聚合”函数,因为它从来没有真正意义上的(因为没有结束传入的数据);但是,如果对有界数据使用窗口函数,则会有一个真实的结束状态,它对应于从CSV文件读取所有数据的时间。因此,即使我们使用窗口函数来分割数据,有没有办法告诉Google云数据流在所有数据都被读入后进行最终计算?

回答

3

SlidingWindows听起来像是您的问题的正确解决方案。传入数据的排序不会跨GroupByKey保留,因此通知Dataflow目前不会有用。但是,批量Dataflow运行器已经按照时间戳进行排序,以便高效地实现窗口,因此对于像SlidingWindows这样的简单窗口,您的代码将按顺序查看数据。

如果你想在一个有限的数据集做了一些窗口计算后做最后的计算,你可以以后再窗口中的数据导入到全局窗口再次,做你的最终聚集:

p.apply(Window.into(new GlobalWindows())); 
相关问题