假设我有一个非常广泛的数据源:
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 ?????
答案 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