拉丁猪包后到了元组

时间:2013-11-13 08:14:32

标签: apache-pig

我在架构(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)))

请注意我只想要第二个组件中的元组,而不是包。请帮忙。

3 个答案:

答案 0 :(得分:9)

你应该能够这样做。

-- 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 here的更多信息。

注意/更新:当我回答这个问题时,我似乎错过了提问者要求输出为元组形式的部分。只有在知道元组中字段的确切数量和位置时才应使用元组。否则,您的架构将不会被定义,并且为了访问这些字段将非常非常。这是因为整个元组将被视为bytearray,因此您将手动查找并cast所有内容。

如果你必须这样做,你就不能在纯猪中这样做。您必须使用某种UDF来执行此操作。我会推荐Python。

答案 1 :(得分:0)

使用FOREACH。请参阅PigLatin页面上的“嵌套投影”部分:http://wiki.apache.org/pig/PigLatin

答案 2 :(得分:0)

你可以试试这个..

咕噜> a_input = Load' /home/training/pig/Join/order_temp.csv'使用PigStorage(',')为(t0:chararray,t1:int,t2:int);

咕噜> b =组(按t1命令a_input)t0;