无法将字节数组转换为猪中的字符数组

Posted

技术标签:

【中文标题】无法将字节数组转换为猪中的字符数组【英文标题】:Cannot cast bytearray to chararray in pig 【发布时间】:2013-06-21 20:42:44 【问题描述】:

我有一个数据如下:

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

当我尝试将字节数组转换为字符数组时

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 说 piglatin 支持从 bytearray 到 chararray 的转换。

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

谢谢。

【问题讨论】:

【参考方案1】:

我不确定您是否 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))

【讨论】:

我试过了,但是使用这种方法只会填充第二个语句的以下属性---- () (address=1000+mity) 我已经为答案中的每个步骤添加了架构和输出。问题到底出在哪里? 它有效!!!!我想我忽略了剧本。我也尝试包含 tobag() 函数。非常感谢。【参考方案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 的架构”。

这是由于此时您有两行具有不同列数的事实造成的。如果你现在用 describe 查看 C,它可能会给出 NULL。手册说未知模式实际上被视为 bytearray 但它似乎无法转换为 chararray 和

D = FOREACH C GENERATE (chararray)$0

给出“无法将 bytearray 转换为 chararray”。

的反应略有不同
D = FOREACH C GENERATE $0 as foo:chararray

给出“错误 1031:不兼容的字段架构:声明为“C:chararray”,推断为“:NULL””

这是我对在我的数据和猪 0.11.1 尝试类似事情时发生的事情的理解。但这并不能真正解决问题。我希望唯一的解决方案是不要将其存储到光盘并再次读入。

【讨论】:

【参考方案3】:

当您描述 B 并且它返回“架构未知”或任何列作为 NULL 时,这意味着架构或数据类型未定义。 它给出了问题,因为 bytearray 的 CAST 有问题。 因此,使用 STORE 创建文件并再次使用模式加载可以解决此问题。 是的开销!

【讨论】:

以上是关于无法将字节数组转换为猪中的字符数组的主要内容,如果未能解决你的问题,请参考以下文章

Pig ERROR 1075:从 UDF 接收到一个字节数组。无法确定如何将字节数组转换为字符串

ValueError:无法使用 dtype='numeric' 将字节/字符串数组转换为十进制数

如何将十六进制字符串转换为字节数组,以及十六进制字符串中的字节数组?

如何将字符串转换为字节数组? [关闭]

无法将字节数组转换为字符串

C 字节数组转换成字符串