我的示例数据如下:
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,)
结果???它太怪异了。我已经尝试了几次......但结果仍然相同
答案 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用作STORE
和USING PigStorage(',')
的字段分隔符的内容。 PigStorage
的参数可以是你喜欢的任何角色。另一个常见的是USING PigStorage('\n')
,它将作为一个整体加载到每一行。