我的数据如下:
(000001, mfp=621|mdus=4.0|mduc=5.0|mas=1|mpc=4.0|mfn=1|country=ABC)
(00002, address=1000+mity|mus=1|name=kailtig+bksyt|mas=1|mpc=4.977552|country=ABC)
字段是标识符和属性集。
我正在尝试填充数据中的所有属性并对它们执行一些操作。
所以,我准备了我的脚本如下:
A = load 'myData.txt' using PigStorage(',') as (ID, ATTRIBUTES);
B = foreach A generate FLATTEN(STRSPLIT(ATTRIBUTES, '\\|')) ;
C = foreach B generate FLATTEN(TOBAG(*));
Dump C;
()
( mfp=621)
(mdus=4.0)
(mduc=5.0)
(mas=1)
(mpc=4.0)
(mfn=1)
(country=ABC))
( address=1000+mity)
(mus=1)
(name=kailtig+bksyt)
(mpc=4.977552)
到目前为止,它还可以正常工作。但是,问题从这里开始。
当我尝试对这些属性进行一些操作时,例如将'm'替换为'market'
D = foreach C generate REPLACE($0,'m','market');
给我一个错误如下:
Could not infer the matching function for org.apache.pig.builtin.REPLACE as
multiple or none of them fit. Please use an explicit cast.
当我尝试将bytearray转换为chararray
时D = foreach C generate (chararray)$0;
给我错误:
ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1052:
<line 4, column 24> Cannot cast bytearray to chararray
但是,以下链接http://pig.apache.org/docs/r0.11.1/basic.html#cast表示,letlatin支持从bytearray转换为chararray。
我该如何解决这个问题。请帮忙。
感谢。
答案 0 :(得分:2)
我不确定您是否100%使用字节数组,但如果不是,您可以使用:
A = LOAD 'myData.txt' USING PigStorage(',') AS (id, attrs) ;
B = FOREACH A GENERATE FLATTEN(TOKENIZE(attrs, '|')) AS attr:chararray ;
-- Now that the data is loaded as chararrays REPLACE will work
C = FOREACH B GENERATE REPLACE(attr,'m','market') AS attrchanged ;
因此,当attrs被拆分并展平时,它将另外转换为chararray。通常,您可能希望使用模式提前声明类型。
每个步骤的架构和输出如下:
A: {id: bytearray,attrs: bytearray}
((000001, mfp=621|mdus=4.0|mduc=5.0|mas=1|mpc=4.0|mfn=1|country=ABC))
((00002, address=1000+mity|mus=1|name=kailtig+bksyt|mas=1|mpc=4.977552|country=ABC))
B: {attr: chararray}
( mfp=621)
(mdus=4.0)
(mduc=5.0)
(mas=1)
(mpc=4.0)
(mfn=1)
(country=ABC))
( address=1000+mity)
(mus=1)
(name=kailtig+bksyt)
(mas=1)
(mpc=4.977552)
(country=ABC))
C: {attrchanged: chararray}
( marketfp=621)
(marketdus=4.0)
(marketduc=5.0)
(marketas=1)
(marketpc=4.0)
(marketfn=1)
(country=ABC))
( address=1000+marketity)
(marketus=1)
(namarkete=kailtig+bksyt)
(marketas=1)
(marketpc=4.977552)
(country=ABC))
答案 1 :(得分:2)
原来的问题:
由于输入行具有不同数量的元素
(000001, mfp=621|mdus=4.0|mduc=5.0|mas=1|mpc=4.0|mfn=1|country=ABC)
(00002, address=1000+mity|mus=1|name=kailtig+bksyt|mas=1|mpc=4.977552|country=ABC)
当你像这样转换它时
A = load 'myData.txt' using PigStorage(',') as (ID, ATTRIBUTES);
B = foreach A generate FLATTEN(STRSPLIT(ATTRIBUTES, '\\|')) ;
C = foreach B generate FLATTEN(TOBAG(*));
然后,根据我目前的理解,如果你采取
DESCRIBE B;
它应该返回“B未知的架构。”
这是由于此时您有两行具有不同列数的事实。如果你现在用C语言看C,它可能会给{NULL}。手册说未知的模式实际上被视为bytearray但它似乎无法转换为chararray和
D = FOREACH C GENERATE (chararray)$0
给出“不能将bytearray强制转换为chararray”。
后面的反应略有不同D = FOREACH C GENERATE $0 as foo:chararray
,它给出了“ERROR 1031:不兼容的字段模式:声明为”C:chararray“,感谢是”:NULL“”
这是我对我的数据和猪0.11.1尝试类似事情时发生的事情的理解。但这并没有真正解决问题。我希望唯一的解决方案是不将它存储到光盘并再次读入。
答案 2 :(得分:0)
当您DESCRIBE B并且它返回“Schema unknown”或任何列为NULL时,表示未定义架构或数据类型。 它给出了问题,因为bytearray的CAST存在问题。 因此,使用STORE创建文件并使用模式再次加载可以解决此问题。 是开销!