Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 如何在Pig中将一个组扁平化为一个元组?_Hadoop_Apache Pig - Fatal编程技术网

Hadoop 如何在Pig中将一个组扁平化为一个元组?

Hadoop 如何在Pig中将一个组扁平化为一个元组?,hadoop,apache-pig,Hadoop,Apache Pig,由此: (1, {(1,2), (1,3), (1,4)} ) (2, {(2,5), (2,6), (2,7)} ) …我们怎么能产生这个 ((1,2),(1,3),(1,4)) ((2,5),(2,6),(2,7)) (1, 2, 3, 4) (2, 5, 6, 7) …我们怎样才能产生这个 ((1,2),(1,3),(1,4)) ((2,5),(2,6),(2,7)) (1, 2, 3, 4) (2, 5, 6, 7) 就一排来说,我知道怎么做。问题是当我必须迭代多行并同时操作内

由此:

(1, {(1,2), (1,3), (1,4)} )
(2, {(2,5), (2,6), (2,7)} )
…我们怎么能产生这个

((1,2),(1,3),(1,4))
((2,5),(2,6),(2,7))
(1, 2, 3, 4)
(2, 5, 6, 7)
…我们怎样才能产生这个

((1,2),(1,3),(1,4))
((2,5),(2,6),(2,7))
(1, 2, 3, 4)
(2, 5, 6, 7)

就一排来说,我知道怎么做。问题是当我必须迭代多行并同时操作内部组时。

对于您的问题,我准备了以下文件:

1,2
1,3
1,4
2,5
2,6
2,7
首先,我使用以下脚本获取您在问题中描述的输入
r3

r1 = load 'test_file' using PigStorage(',') as (a:int, b:int);
r2 = group r1 by a;
r3 = foreach r2 generate group as a, r1 as b;
describe r3;
-- r3: {a: int,b: {(a: int,b: int)}}
-- r3 is like (1, {(1,2), (1,3), (1,4)} )
如果我们想生成以下内容

(1, 2, 3, 4)
(2, 5, 6, 7)
((1,2),(1,3),(1,4))
((2,5),(2,6),(2,7))
我们可以使用以下脚本:

r4 = foreach r3 generate a, FLATTEN(BagToTuple(b.b));
dump r4;
对于以下内容

(1, 2, 3, 4)
(2, 5, 6, 7)
((1,2),(1,3),(1,4))
((2,5),(2,6),(2,7))

我找不到任何有用的内置函数。也许您需要编写自定义的BagToTuple。以下是内置的BagToTuple源代码:

没有内置的方法将bag转换为元组。这是因为包是无序的元组集,所以Pig不知道元组转换为元组时应该设置为什么顺序。这意味着您必须编写一个UDF来执行此操作

我不确定您是如何创建
(1,2,3,4)
元组的,但这是UDF的另一个很好的候选,即使您可以仅使用BagToTuple UDF创建该模式

注意:除非您确切知道有多少字段,否则可能不应该将任何内容转换为元组

myudfs.py

#!/usr/bin/python

@outputSchema('T:(T1:(a1:chararray, a2:chararray), T2:(b1:chararray, b2:chararray), T3:(c1:chararray, c2:chararray))')
def BagToTuple(B):
    return tuple(B)

def generateContent(B):
    foo = [B[0][0]] + [ t[1] for t in B ]
    return tuple(foo)
myscript.pig

REGISTER 'myudfs.py' USING jython AS myudfs ; 

-- A is (1, {(1,2), (1,3), (1,4)} ) 
-- The schema is (I:int, B:{T:(I1:int, I2:int)})

B = FOREACH A GENERATE myudfs.BagToTuple(B) ;
C = FOREACH A GENERATE myudfs.generateContent(B) ;
为了获得:

((1,2),(1,3),(1,4))
((2,5),(2,6),(2,7))
您可以这样做:

r4 = foreach r3 {
    Tmp=foreach $1 generate (a,b);
    generate FLATTEN(BagToTuple(Tmp));
};

惊人的解决方案!为什么r4=foreach r3不生成BagToTuple(b)工作?它给我((1,4,1,3,1,2))((2,7,2,6,2,5)),这似乎是不合理的。如果有多个字段,1,2,3,1,3,4,4,5,5,6,2,6,7,2,7,8,我们希望输出为(1,2,3,3,4,4,5)(2,5,6,7,8)