我执行以下操作:
a = load '/hive/warehouse/' USING PigStorage('^') as (a1,b1,c1);
b = group a by (a1) ;
c = foreach b generate group, a.$2;
dump c;
输出显示所有组:
abc {(1),(44),(66)}
cde {(1),(44),(66)}
如何删除“{”和“(”字符以便最终的HDFS文件可以作为逗号分隔文件读取?
答案 0 :(得分:3)
你不能直接在Pig中这样做。需要特殊的语法,因为你正在存放一个包,为了让Pig能够在以后读取这个包,它需要与大括号(用于包)和括号(包含在包中的元组)一起存储。
你有几个选择。您可以将文件读回Pig,但不要将其作为bag
阅读,而应将其读作chararray
。然后你可以执行正则表达式替换来摆脱标点符号(未经测试):
a = LOAD 'output' AS (group:chararray, list:chararray);
b = FOREACH A GENERATE group, REPLACE(list, '[{()}]', '');
另一种选择是编写一个UDF,将一个包变成一个元组。请注意,这不是一个明确定义的操作:行李没有特定的顺序,所以从一次运行到下一次运行,你的元组不能保证在同一个顺序。但就你的目的而言,听起来可能并不重要。 UDF可能看起来像(草稿非常粗糙,未经测试):
public class BAG_TO_TUPLE extends EvalFunc(Tuple) {
public Tuple exec(Tuple input) {
DataBag bag = input.get(0);
Iterator<Tuple> iterator = bag.iterator();
Tuple out = new DefaultTuple();
while(iterator.hasNext()) {
out.append(iterator.next().get(0));
}
return out;
}
}
上面的UDF非常糟糕 - 它假设你在包的每个元组中都有一个元素(你关心的)并且没有检查输入是否有效等等。但它应该让你走向什么你想要的。
但是,最好的解决方案是找到一种方法来处理Pig之外的额外标点符号,如果Pig不是您下游处理的一部分。
答案 1 :(得分:1)
此功能现在在Pig中作为内置函数提供(我使用0.11)。
http://pig.apache.org/docs/r0.11.0/api/org/apache/pig/builtin/BagToString.html
c = foreach b generate group, a.$2 as stuff;
d = foreach c generate group, BagToString(stuff, ',');
我的用例不需要以逗号分隔的文件,但我假设你可以使用store func来获取最终的逗号(在group和now-逗号分隔的包之间)
答案 2 :(得分:0)
尝试FLATTEN运算符;
c = foreach b生成组,FLATTEN(a。$ 2);