我有以下带有架构的数据(t0: chararray,t1: int,t2: int)
(B,4,2)
(A,2,3)
(A,3,2)
(B,2,2)
(A,1,2)
(B,1,2)
我想生成以下结果(按 t0 分组,按 t1 排序)
(A, ((1,2),(2,3),(3,2)))
(B, ((1,2),(2,2),(4,2)))
请注意,我只想要第二个组件中的元组,而不是包。请帮忙。
我有以下带有架构的数据(t0: chararray,t1: int,t2: int)
(B,4,2)
(A,2,3)
(A,3,2)
(B,2,2)
(A,1,2)
(B,1,2)
我想生成以下结果(按 t0 分组,按 t1 排序)
(A, ((1,2),(2,3),(3,2)))
(B, ((1,2),(2,2),(4,2)))
请注意,我只想要第二个组件中的元组,而不是包。请帮忙。
你应该可以这样做。
-- A: (t0: chararray,t1: int,t2: int)
B = GROUP A BY t0 ;
C = FOREACH B {
-- Project out the first column of A.
projected = FOREACH A GENERATE t1, t2 ;
-- Now you can order the projection.
ordered = ORDER projected BY t1 ;
GENERATE group AS t0, ordered AS vals ;
}
您可以在此处阅读有关嵌套FOREACH
s 的更多信息。
注意/更新:似乎当我最初回答这个问题时,我错过了提问者要求输出为元组形式的部分。只有当您知道元组中字段的确切数量和位置时,才应使用元组。否则,您的架构将不会被定义,并且访问这些字段将非常困难。这是因为整个元组将被视为一个字节数组,因此您必须手动查找并转换所有内容。
如果你必须这样做,你不能在纯猪身上这样做。您必须使用某种UDF来执行此操作。我会推荐Python。
你可以试试这个。。
grunt> a_input = Load '/home/training/pig/Join/order_temp.csv' Using PigStorage(',') as (t0:chararray,t1:int,t2:int);
grunt> b= Group (Order a_input by t1) By t0;
使用 FOREACH。请参阅 PigLatin 页面上的“嵌套投影”部分:http ://wiki.apache.org/pig/PigLatin