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

l3zydbqr  于 2021-06-21  发布在  Pig
关注(0)|答案(2)|浏览(232)

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

big_thing = LOAD 'some_path' using MySpecialLoader;

现在我想生成一些较小的东西,由big\u thing的列的子集组成。

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

有没有一种方法可以做到这一点,而不必写下所有的专栏?
我想是的,但我的搜索结果不多,我想我只是用错了术语。
编辑:
看来我的问题被误解了。既然我是一个巨蟒人,我就用巨蟒来比喻。
假设我有一个数组 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.

在pig中,这相当于:

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

我的问题是什么是Pig相当于这个?

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 ?????
cnh2zyt3

cnh2zyt31#

答案可以在以下帖子中找到: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

zzoitvuj

zzoitvuj2#

对, you can simply load the dataset without columns . 但是,如果用列名加载数据,将有助于在将来的脚本中识别列的详细信息。
自定义项可以帮助您执行查询,例如,

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

自定义项:

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;
}
}

相关问题