猪:无法装载 BAG

Pig: Unable to Load BAG

我有这样格式的记录:

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

请指教

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

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

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

LiMuBei点是完全正确的。您输入的格式不正确。 Pig 总是期望袋子应该装 collection of tuples 但在你的情况下它是 collection of (tuple and fields)。在这种情况下,猪在负载期间将 retain the tuplereject the fields(年龄和性别)。

但是这个问题可以很容易地用不同的方法解决(有点老套的解决方案)。
1. 将每个输入行加载为字符数组。
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 访问所有字段。