如何阅读Pig中的行李清单?
我试过了:
grunt> cat sample.txt
{a,b},{},{c,d}
grunt> data = LOAD 'sample.txt' AS (a:bag{}, b:bag{}, c:bag{});
grunt> DUMP data
({},,)
答案 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)})