3

如何在 Pig 中读取包列表?

我试过:

grunt> cat sample.txt
{a,b},{},{c,d}
grunt> data = LOAD 'sample.txt' AS (a:bag{}, b:bag{}, c:bag{});
grunt> DUMP data
({},,)
4

1 回答 1

6

将数据读入 Pig 的默认方法是PigStorage('\t')——也就是说,它假定您的数据是制表符分隔的。你的是逗号分隔的。所以你应该写LOAD 'sample.txt' USING PigStorage(',') AS...

但是,您的数据不是正确的 Pig bag 格式。请记住,包是元组的集合。如果您无法预处理您的输入,则必须编写一个 UDF 来解析您给出的表单的输入。所以这应该有效:

grunt> cat tmp/data.txt
{(a),(b)},{},{(c),(d)}
grunt> data = LOAD 'tmp/data.txt' USING PigStorage(',') AS (a:bag{}, b:bag{}, c:bag{});
grunt> DUMP data;
(,,{})

什么地方出了错?您的输入字段分隔符 ( ,) 与袋记录分隔符相同的事实使 Pig 感到困惑。它将您的输入解析为字段{(a)(b)}{},这就是为什么只有第三个字段最终成为袋子的原因。这就是为什么您会看到类似的警告消息Encountered Warning FIELD_DISCARDED_TYPE_CONVERSION_FAILED 2 time(s)

如果可以,请尝试使用制表符或空格(或分号,或...)而不是逗号:

grunt> cat tmp/data.txt                                                                
{(a),(b)}       {}      {(c),(d)}
grunt> data = LOAD 'tmp/data.txt' AS (a:bag{}, b:bag{}, c:bag{});                      
grunt> DUMP data;
({(a),(b)},{},{(c),(d)})
于 2013-03-01T19:43:32.933 回答