2013-06-21 27 views
3

到chararray我有一个数据如下:无法施展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) 

的字段是标识和属性集。

我想填充数据中的所有属性,并对它们进行一些操作。

所以,我准备我的脚本如下:

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”的“市场”

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表示,明胶支持从bytearray投射到chararray。

我该如何解决这个问题。请帮忙。

谢谢。

回答

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)) 
+0

我试过,但使用这种方法只填充由第二语句以下属性---- () (地址= 1000 + mity) – bndg

+0

我已经添加了模式和输出在每个步骤我的答案。问题究竟在哪里? – mr2ert

+0

它的作品!我想我忽略了剧本。我试图包含tobag()函数。非常感谢。 – bndg

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描述它可能会给{NULL}。手册说,未知的模式实际上是当作字节组,但它似乎不能转换到chararray和

D = FOREACH C GENERATE (chararray)$0 

给出“不能投ByteArray的chararray”。从

D = FOREACH C GENERATE $0 as foo:chararray 

赋予略有不同的反应如下“错误1031:不相容场模式:宣称是‘C:chararray’,infered是‘:NULL’”

这是我的,而我发生了什么事的理解我的数据正在尝试类似的事情,猪0.11.1。但这并不能真正解决问题。我希望唯一的解决办法是不要将它存储到光盘并再次读入。

0

当您描述B并返回“Schema unknown”或任何列为NULL时,表示模式或数据类型未定义。 由于bytearray的CAST存在问题,所以给出了问题。 因此,使用STORE创建文件并再次使用模式加载可以解决此问题。 是一个开销!

相关问题