2015-02-23 73 views
3

我是一名初学者,正在编写Python和Pig UDF,并努力使用PIG对输入文件进行charset转换。PIG UDF(Python)字符集编码

浏览过的stackoverflow和整个互联网的天,尝试了一堆不同的东西,但我仍然无助。

希望有人能给我一个温柔的推向正确的方向。


环境:一个真正的分布式Hadoop集群(无本地实例)/ Cloudera的配置与utf-8Apache Pig version 0.12.0

我的源文件进行编码iso-8859-1,目标是保存它作为utf-8内容(后或在猪内进行其他几次操作之前)。

输入文件看起来像这样(用于测试目的的一对夫妇的ASCII/ISO-8859-1 - 一个字符每行):

ù 
 
û 
 
ü 
 
ÿ 
 
à 
 
â 
 
æ 
 
ç 
 
é 
 
è 
 
ê 
 
ë 
 
î 
 
ô

这是我Pig-脚本:

RMF $output; 
 

 
REGISTER 'charsetConversion.py' using org.apache.pig.scripting.jython.JythonScriptEngine AS pyudf; 
 

 
data = LOAD '$input' USING PigStorage() AS (col1:chararray); --col1:bytearray 
 

 
final = foreach data generate $0, pyudf.toUTF8(col1); 
 

 
STORE final INTO '$output' USING PigStorage();

我的UDF(用Python编写的):

#!/usr/bin/env python 
 
# charsetConversion.py 
 

 
@outputSchema("word:chararray") 
 
def toUTF8(s): 
 
    return unicode(s, 'iso-8859-1').encode('utf-8')

运行/提交脚本后,我得到了以下的输出:

� \t � 
 
� \t � 
 
� \t � 
 
� \t � 
 
� \t � 
 
� \t � 
 
� \t � 
 
� \t � 
 
� \t � 
 
� \t � 
 
� \t � 
 
� \t � 
 
� \t � 
 
� \t � 
 
� \t � 
 
� \t � 
 
� \t � 
 
� \t � 
 
� \t � 
 
� \t � 
 
� \t �

在第二列我会期望同样可读的价值es在输入文件中,而不是�

这里会发生什么?

我的方法是否被推荐?

还有什么其他方法存在(没有java Stackoverflow: Encoding in Pig - Java solution)?

非常感谢您的任何建议。

回答

1

我正在解决类似的问题。 是的,在Java/Hadoop世界中,字符编码可能会非常棘手:)。

其实,你是相当接近 - 该解决方案是:

data = LOAD '$input' USING PigStorage() AS (col1:bytearray); 

的问题是,您所指定的col1为chararray。 Chararray是“Unicode UTF-8格式的数组(字符串)”。但是,对于iso-8859-1中的输入数据,情况并非如此。猪脚本将您的数据解释为UTF-8 而不是iso-8859-1。您应该指定bytearray。 Bytearray不以任何方式解释数据 - 你必须这样做(例如在你的UDF函数中)。

在接下来,行,我们需要处理的每一行:

parsed = foreach a generate flatten(my.testparser($0)); 

然后,UDF函数内(my.testparser()),我们将改变ISO-8859-1编码为UTF- 8

.... 
    val line:String = input.get(0).asInstanceOf[DataByteArray].get(), "windows-1250") 
    .... 

的代码是Scala(我不是一个Python的家伙 - 对不起),它需要输入DataByteArray字节组 in PIG)并获得数组Scala.Bytes。那些字节被解释为windows-1250。

这就是说,你的UDF应该保持不变,但需要在猪,等效的数据类型在你的UDF

希望变成以的bytearray输入这有助于

1

这里的UDF定义在Python是为我工作,对于那些你谁是不舒服的斯卡拉:

#!/usr/bin/env python 
# charsetConversion.py 
import struct 

@outputSchema("word:chararray") 
def toUTF8(s): 
     line = ‘.’join([struct.pack(‘B’, x).decode(‘iso-8859-1’) for x in s]) 
     return line 

这里是PIG命令来注册UDF,加载数据,可以使用UDF的数据,并得到一个样本的t帽子数据来检查解码是否按预期工作。

REGISTER 'charsetConversion.py' USING org.apache.pig.scripting.jython.JythonScriptEngine AS pyudf; 
data = LOAD '$input' USING TextLoader AS (col1: bytearray); 
final = FOREACH data GENERATE $0,pyudf.toUTF8(col1); 
final_lim = LIMIT final 10; 
DUMP final_lim; 

正如他在答复中提到xhudik,这里的重要组成部分,是定义字段作为一个字节数组。