【问题标题】:Pig: Unable to Load BAG猪:无法加载 BAG
【发布时间】:2015-02-04 14:43:21
【问题描述】:

我有这样格式的记录:

{(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

请指教。

【问题讨论】:

    标签: hadoop mapreduce apache-pig bigdata


    【解决方案1】:

    它不是一个包,因为它不是由元组组成的。试试

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

    出于某种原因,Pig 将一行的输出包裹在花括号中,使其看起来像一个袋子,但事实并非如此。如果您使用 PigStorage 保存了此数据,则可以使用参数 ('-schema') 保存它,该参数告诉 PigStorage 创建模式文件 .pigschema(或类似的文件),您可以查看该文件以查看保存的模式是什么。也可以在使用 PigStorage 加载时使用,为您节省 AS 子句。

    【讨论】:

    • 感谢您的解释
    【解决方案2】:

    是的LiMuBei 点是绝对正确的。您的输入格式不正确。猪总是希望袋子应该装collection of tuples,但在你的情况下它是collection of (tuple and fields)。在这种情况下,猪会在加载过程中 retain the tuplereject the fields(年龄和性别)。

    但是这个问题可以通过不同的方法轻松解决(一种 hacky 解决方案)。
    1. 将每个输入行加载为 chararray。
    2. 去掉输入中的大括号和函数括号。
    3. 使用strsplit函数将输入分隔为(name,age,sex)字段。

    PigScript:

    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 访问所有字段。

    【讨论】:

    • 感谢您的解释,但由于LiMuBei 较早发布了他的答案,因此接受了他的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多