如何在Pig Latin中编写子查询?

时间:2011-10-25 06:05:09

标签: apache-pig

我有两个数据文件:

range.txt

Min Max  Name
1    10    a
11   20    b
21   30    c
31   100   d
101  200   e

data.txt

1
3
40
150

我想要的结果是:

1   a  ( because 1   <= 1   <= 10 )
3   a  ( because 1   <= 3   <= 10 ) 
40  d  ( because 31  <= 40  <= 100 )
150 e  ( because 101 <= 150 <= 200 )

如何编写Pig脚本?

我试过了:

MyREPO = LOAD '/repos/range.txt'  USING PigStorage(',') AS (start:long,end:long,location:chararray);

MyDATA = LOAD '/repos/data.txt' AS (col1:long);


B = FOREACH MyDATA {

    C = FILTER MyREPO BY ( MyDATA.col1 >= start  AND MyDATA.col1 <= end  );

    GENERATE MyDATA.col1,C.location;
}


STORE C into '/result/'  USING PigStorage();

上面的脚本不能用pig编译。 但它显示了我想要做的事情。

感谢。

也许这种方式可以通过?

在range.txt中创建一个包含字符串的字符串, 使data.txt中的col1成为一个字符串, 我在这个函数中写了一个自定义的ComparisonFunc, 将字符串拆分为开始和结束,并测试col1是否在此范围内?

但是如何? 这是我在PIG上的第二天......

2 个答案:

答案 0 :(得分:1)

这是另一种可能的解决方案:

myRepo = LOAD 'range.txt'  USING PigStorage(',') AS (start:long,end:long,location:chararray);
myData = LOAD 'data.txt' AS (col1:long);

myRepoData = cross myRepo, myData;
myRepoData2 = filter myRepoData by col1 >= start and col1 <= end;
myRepoData3 = foreach myRepoData2 generate col1, location;

dump myRepoData3;

答案 1 :(得分:0)

一种非常天真的方式是从range.txt膨胀数据。

range = LOAD 'range.txt' AS (min:long, max:long, name:chararray);
m = FOREACH range GENERATE FLATTEN(udf(min, max, name));
data = LOAD 'data.txt' AS NUMBER:long;
output = JOIN m BY $0, data by NUMBER;
dump output;

输出键,值从最小值到最大值,带键,数字和值为“名称”。 所以1 10 a将是1 a,2 a,3 a等。 确保udf返回一个数据库,这样flatten每行会给你一个条目。

效率不高,但这可能是一个起点。