如何阅读Pig中的行李列表?

时间:2013-03-01 14:43:15

标签: apache-pig

如何阅读Pig中的行李清单?

我试过了:

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

1 个答案:

答案 0 :(得分:6)

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

但是,您的数据不是正确的Pig包格式。请记住,一个包是元组的集合。如果您无法预处理输入,则必须编写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)})