foreach如何在Pig中工作?

时间:2013-10-24 05:23:03

标签: foreach apache-pig

我的示例数据如下:

1950,0,1
1950,22,1
1950,-11,1
1949,111,1
1949,78,1

我使用了以下命令:

    A = load 'path/to/the/sample';
    B = foreach A generate $0,$1;

应该只生成A的前2列。

然后我用了
describe B

检查它是如何工作的,它返回:B:{a:bytearray,b:bytearray},这是正确的。

然而,当我运行命令

dump B

为什么会返回:

(1950,0,1,)
(1950,22,1,)
(1950,-11,1,)
(1949,111,1,)
(1949,78,1,)

结果???它太怪异了。我已经尝试了几次......但结果仍然相同

2 个答案:

答案 0 :(得分:2)

在Load语句中使用 PigStorage 子句。

A = load 'path/to/the/sample' using PigStorage(',');

B = foreach A generate $0,$1;

dump B

现在你会得到你期望的结果

(1950,0)

(1950,22)

(1950,-11)

(1949,111)

(1949,78)

答案 1 :(得分:2)

发生这种情况的原因是因为Pig默认尝试按标签分隔您的数据。所以当你传递一行像

1950,0,1

它认为它只发现了一个字段1950,0,1。由于您指示每行包含两个字段,因此第二个字段仅设置为NULL

因此,当您GENERATE加载了两个字段时,它会打印出元组

(1950,0,1,)

如果您STORE而不是DUMP,那么您会更清楚地看到它。 Pig会存储由制表符分隔的数据(同样是默认值),输出文件看起来像

1950,0,1    
1950,22,1    
1950,-11,1    
1949,111,1    
1949,78,1    

这不是很有启发性,所以看看如果你这样做会发生什么:

B = foreach A generate $0, "test";
store B into 'output';

现在output中的数据将是

1950,0,1    test
1950,22,1   test
1950,-11,1  test
1949,111,1  test
1949,78,1   test

您可以使用LOAD子句控制Pig用作STOREUSING PigStorage(',')的字段分隔符的内容。 PigStorage的参数可以是你喜欢的任何角色。另一个常见的是USING PigStorage('\n'),它将作为一个整体加载到每一行。