猪:无法装载 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 tuple
和 reject 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
访问所有字段。
我有这样格式的记录:
{(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 tuple
和 reject 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
访问所有字段。