foreach如何在Pig工作?

hrirmatl  于 2021-06-25  发布在  Pig
关注(0)|答案(2)|浏览(258)

我有一个样本数据如下:

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,)

结果呢???太奇怪了。我试过好几次了。。。但结果还是一样

xxe27gdn

xxe27gdn1#

在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)

drkbr07n

drkbr07n2#

发生这种情况的原因是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

您可以控制pig使用什么作为这两个字段的字段分隔符 LOAD 以及 STORE 通过使用子句 USING PigStorage(',') . 对…的论点 PigStorage 可以是你喜欢的任何角色。另一个常见的是 USING PigStorage('\n') ,它将作为一个整体加载到每条线中。

相关问题