如何执行“范围查询”?

时间:2016-06-17 17:13:11

标签: google-cloud-dataflow

Google云数据流通过其“CoGroupByKey”方法支持我称之为“全外连接”的SQL语句。但是,有没有办法在数据流中实现SQL中的“范围连接”?例如,如果我有一个名为“people”的表,其中有一个名为“age”的浮点字段。而且,假设我希望所有人的年龄都在五年之内。我可以写下面的陈述:

选择p1.name,p1.age,p2.name,p2.age 来自人p1,人p2 其中p1.age介于(p2.age - 5.0)和(p2.age + 5.0)之间;

我无法确定是否有办法在数据流中实现此目的。 (同样,如果我想要一个严格的相等,我可以使用CoGroupByKey,但在这种情况下,它不是严格的相等条件。)

对于我的特定用例,“people”表不是太大 - 可能需要500,000行和大约50兆的RAM。所以,我认为,我可以简单地运行一个asList()方法来创建一个位于单个计算机RAM中的单个对象,然后按年龄对人员对象进行排序,然后编写一些“遍历列表的例程”从最高年龄开始的低级阶段“在走过名单的同时输出那些年龄小于10岁的人。这可行,但它将是单线程等。我想知道是否有一种“更好”的方式使用数据流架构。 (并且其他开发人员可能需要找到一种“数据流”方式来执行此操作,如果他们正在处理的对象不能很好地适应单个计算机的内存,例如可能有10亿行的人员表等。)

1 个答案:

答案 0 :(得分:1)

使大规模有效工作的技巧是将数据划分为多组潜在匹配。在您的情况下,您可以为每个人分配两个不同的密钥,年龄四舍五入为5的倍数,年龄向下舍入为5的倍数。然后,在这些存储桶上执行GroupByKey,并发出每个存储桶中的所有对实际上年龄足够接近。你需要消除重复,因为两条记录都可能同时存在于同一个桶中。

使用此解决方案,整个数据不需要适合内存,只需要适合数据的每个子集。