pig:无法加载包

mbzjlibv  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(334)

我有这样一个记录:

{(Larry Page),23,M}
{(Suman Dey),22,M}
{(Palani Pratap),25,M}

我正在努力 LOAD 使用以下命令的记录:

records = LOAD '~/Documents/PigBag.txt' AS (details:BAG{name:tuple(fullname:chararray),age:int,gender:chararray});

但我得到了一个错误:

2015-02-04 20:09:41,556 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1200: <line 7, column 101>  mismatched input ',' expecting RIGHT_CURLY

请给我建议。

sqyvllje

sqyvllje1#

它不是一个袋子,因为它不是由元组组成的。尝试

load ... as (name:tuple(fullname:chararray), age:int, gender:chararray)

出于某种原因,pig用花括号将一行的输出包起来,使它看起来像一个包,但实际上不是。如果使用pigstorage保存了此数据,则可以使用参数('-schema')保存它,该参数告诉pigstorage创建一个架构文件.pigschema(或类似文件),您可以查看该文件以查看保存的架构是什么。当使用pigstorage加载时,也可以使用它来保存as子句。

vlurs2pr

vlurs2pr2#

LiMuBei 这一点绝对正确。您的输入格式不正确。Pig总是希望袋子能装得下 collection of tuples 但你的情况是 collection of (tuple and fields) . 在这种情况下,Pig会 retain the tuple 以及 reject the fields (年龄和性别)。
但是这个问题可以用不同的方法很容易地解决(一种黑客的解决方案)。
1将每个输入行作为字符加载。
2从输入中删除花括号和函数括号。
三。使用strsplit函数将输入分隔为(姓名、年龄、性别)字段。
Pig手稿:

A = LOAD 'input' USING PigStorage AS (line:chararray);
B = FOREACH A GENERATE FLATTEN(REPLACE(line,'[}{)(]+','')) AS (newline:chararray);
C = FOREACH B GENERATE FLATTEN(STRSPLIT(newline,',',3)) AS (fullname:chararray,age:int,sex:chararray);
DUMP C;

输出:

(Larry Page,23,M)
(Suman Dey,22,M)
(Palani Pratap,25,M)

现在您可以使用 fullname,age,sex .

相关问题