如何在 Pig 中读取包列表?
我试过:
grunt> cat sample.txt
{a,b},{},{c,d}
grunt> data = LOAD 'sample.txt' AS (a:bag{}, b:bag{}, c:bag{});
grunt> DUMP data
({},,)
如何在 Pig 中读取包列表?
我试过:
grunt> cat sample.txt
{a,b},{},{c,d}
grunt> data = LOAD 'sample.txt' AS (a:bag{}, b:bag{}, c:bag{});
grunt> DUMP data
({},,)
将数据读入 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)})