2015-02-23 4 views
3

Я начинаю писать Python и Pig UDF и бороться с преобразованием кодировки входного файла с помощью PIG.PIG UDF (Python) Кодировка кодировки

Просмотренный stackoverflow и весь интернет в течение нескольких дней, попробовал кучу разных вещей, но я все еще беспомощен.

Надеюсь, кто-то может дать мне мягкий толчок в правильном направлении.


Окружающая среда: реальная распределенная Hadoop кластера (нет локального экземпляра)/Cloudera сконфигурировано с utf-8 и Apache 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 (написано в питоне):

#!/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 �

В второй столбец я ожидал бы такую ​​же удобочитаемую оценку как во входном файле, а не �.

Что здесь происходит?

Насколько мой подход рекомендуется вообще?

Какие существуют другие подходы (без 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()) мы изменим изо-8859-1 кодирование в UTF- 8:

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

код в Скале (Я не питон парень - извините), он принимает ввод DataByteArray (ByteArray в PIG) и получите массив Scala.Bytes. Затем эти байты интерпретируются как windows-1250.

Тем не менее, ваша UDF должна оставаться такими же, но вход должен быть изменен в к ByteArray в Свинье и аналогичном типе данных в вашем UDF

Надеется, что это помогает

1

Вот ОДС определен в Python, который работал для меня для тех из вас, кто не устраивает Scala:

#!/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 к данным, и получить образец of 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 говорил в своем ответе, важная часть здесь, чтобы определить ваше поле в виде массива байтов.

 Смежные вопросы

  • Нет связанных вопросов^_^