2015-02-23 74 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,這裏的重要組成部分,是定義字段作爲一個字節數組。