0

我有一个示例数据,如下所示:

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

作为结果???太奇怪了 我已经尝试了几次...但仍然是相同的结果

4

2 回答 2

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)

于 2013-10-24T09:48:49.223 回答
2

发生这种情况的原因是,默认情况下,Pig 会尝试按制表符分隔您的数据。所以当你通过它时

1950,0,1

它认为它只找到了一个字段,1950,0,1. 由于您指出每行有两个字段,因此第二个字段仅设置为NULL.

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

(1950,0,1,)

如果你STORE这样做而不是DUMPing 它,你会更清楚地看到它。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(',')PigStorageUSING PigStorage('\n')

于 2013-10-24T15:07:54.343 回答