2016-11-21 2 views
2

Я пишу программу MapReduce, чтобы очистить некоторые файлы, хранящиеся в HDFS, так как я должен кодировать все файлы в UTF-8, я пытался кодировать значение Text в моем mapper, но у меня все еще есть ошибки в моем файле результатов.Кодирование файлов UTF-8 в hadoop

if(encoding.compareTo("UTF-8")!=0){ 
      final Charset fromCharset = Charset.forName(encoding); 
      final Charset toCharset = Charset.forName("UTF-8"); 
      String fixed = new String(value.toString().getBytes(fromCharset), toCharset); 
      result= new String(fixed); 

Я также таможня LineReader, чтобы кодировать байты прочтенных в UTF-8, прежде чем, что он хранится в текстовом объекте.

//buffer contain the data readed in a line of the file 
String s = new String(buffer, startPosn, appendLength); 
      byte ptext[] = Charset.forName("UTF-8").encode(s).array();    
      str.append(ptext, 0, ptext.length); 

Помогите мне пожалуйста!

+0

Какие фактические 'типы Writable' вы используете в вашей программе? В приведенных выше фрагментах кода не рассказывается история о том, как 'byte []' считываются и записываются в фактические реализации «Writable» (и эти два, вероятно, там, где ваша проблема лежит). –

+0

Спасибо за ваш ответ @ArminBraun, я использую только Text i, создаю объект 'Writable', и я использую его как вывод в mapper, но ничего не происходит, потому что текст ввода в файле картографа неправильно построен: ' 25196921 | 03 | Обязательное условие ||| 2015-12-16 00: 00: 00.0' Я думаю, что вопрос заключается в том, как изменить тип входных параметров устройства отображения, чтобы изменить текст в другом объекте. (Поскольку текст объект может манипулировать только символами UFT-8). –

ответ

1

Я нашел ответ:

if(encoding.compareTo("CP1252")==0) 
     valueInString= new String(value.getBytes(), 
      0, value.getLength(), 
      StandardCharsets.ISO_8859_1); 
    else valueInString=value.toString();