piglatin位置表示法,如何指定间隔

时间:2014-08-21 22:12:29

标签: apache-pig

假设我有一个非常广泛的数据源:

big_thing = LOAD 'some_path' using MySpecialLoader;

现在我想生成一些由big_thing列的子集组成的小东西。

smaller_thing = FOREACH big_thing GENERATE 
   $21,$22,$23 ...... $257;

有没有办法在不写出所有列的情况下实现这一目标?

我假设是,但我的搜索量不大,我想我只是使用了错误的术语。

编辑:

所以看起来我的问题被误解了。由于我是一个Python人,我将给出一个python类比。

假设我有一个由数组组成的数组l1。它看起来像一个网格对吗?现在我希望数组l2是'l1 such that的子集l2'包含来自l1的一堆列。我会做这样的事情:

    l2 = [[l[a],l[b],l[c],l[d]] for l in l1]
    # a,b,c,d are just some constants.

在猪中,这相当于:

smaller_thing = FOREACH big_thing GENERATE 
   $1,$22,$3,$21;

但我有很多专栏。我感兴趣的列都是顺序的,并且有很多这些。然后在python中我会这样做:

l2 = [l[x:y] for l in l2]
#again, x and y are constants, eg x=20, y=180000000. See, lots of stuff I dont want to type out

我的问题是猪的等价物是什么?

smaller_thing = FOREACH big_thing GENERATE ?????

那样的东西怎么样:

的Python:

l2 = [l[x:y]+l[a:b]+[l[b],l[c],l[d]] for l in l2]

猪:

smaller_thing = FOREACH big_thing GENERATE ?????

2 个答案:

答案 0 :(得分:0)

是的,you can simply load the dataset without columns。 但是,如果使用列名加载数据,将有助于您在将来的脚本中识别列详细信息。

UDF可以帮助您执行查询, 例如,

REGISTER UDF\path;
a = load 'data' as (a1);
b = foreach a generate UDF.Func(a1,2,4);

UDF:

    public class col_gen extends EvalFunc<String>
    {

        @Override
        public String exec(Tuple tuple) throws IOException {

        String data = tuple.get(0).toString();
        int x = (int)tuple.get(1);
        int y = (int)tuple.get(2);
        String[] data3 = data.split(",");
        String data2 = data3[x]+",";
        x = x+1;
        while(x <= y)
        {
            data2 += data3[x]+",";
            x++;
        }
        data2 = data2.substring(0, data2.length()-1);
        return data2;
}
}

答案 1 :(得分:0)

答案可以在这篇文章中找到:http://blog.cloudera.com/blog/2012/08/process-a-million-songs-with-apache-pig/

Distanced = FOREACH Different GENERATE artistLat..songPreview, etc;

..表示使用从artistLat到songPreview的所有内容。

使用位置表示法也可以做同样的事情。例如$1..$6