0

假设一个人有一个列表,其中Intervals一个列表Points来自两个不同的查询计划。

假设Intervals列表的签名是:

Intervals : { (start:int, stop:int) }

因此,它是一个情侣列表。

ConvereslyPoints是一个单例列表:

Points: { (coordinate:int) }

我想要做的是从集合中检索Points包含在集合的至少一个间隔中的所有点Intervals

我所做的,是为了实现这个简单的计划:

cp = CROSS Points, Intervals;
cp_filtered = FILTER cp BY start < coordinate and coordinate < stop;
filtered_point = FOREACH cp_filtered GENERATE coordinate;

当然,如果列表的基数很高,叉积就不是一个好的选择。

我想知道在 PigLatin 中通常如何解决此类问题。你可以帮帮我吗?

4

1 回答 1

1

您可以使用Python UDF将区间转换为范围,然后JOIN使用范围:

myudf.py

#!/usr/bin/python

@outputSchema('expanded: {(num:int)}')
def expand(start, end):
    return [ (x) for x in range(start + 1, end) ]

我的脚本.pig

REGISTER 'myudf.py' using jython as myudf ;   

-- expand creates a bag of all numbers in the range 
B = FOREACH Intervals GENERATE FLATTEN(myudf.expand(start, end)) ;

-- Maybe do DISTINCT on B to speed up the JOIN?

C = JOIN B by num, Points by coordinate ;

我不确定这是否是您最快的选择,但CROSS对于较大的数据集,它应该比 a 快得多。

于 2013-07-30T21:23:45.823 回答