2013-11-14 64 views
2

使用Pig Latin並將數據存儲在.txt文件中加載包含某些特定字符(例如,À,°等)的數據可能會看到txt文件中的這些符號顯示爲ï ½½和ï字符。這是因爲UTF-8替換字符。 我想問一下,是否有可能以某種方式避免它,也許有一些豬命令,在結果(在txt文件中)例如À而不是â?Pig中的編碼

+0

你確定來源是UTF-8編碼?如果沒有,您將不得不實現自己的存儲功能來支持其他編碼。 – SNeumann

回答

3

在Pig中,我們構建的動態調用者允許Pig程序員引用Java函數,而無需將它們包裝在自定義Pig UDF中。所以,現在你可以將數據加載爲UTF-8編碼的字符串,然後將其解碼,然後對其執行所有操作,然後將其存儲爲UTF-8。我想這應該對第一部分的工作:

DEFINE UrlDecode InvokeForString('java.net.URLDecoder.decode', 'String String'); 
    encoded_strings = LOAD 'encoded_strings.txt' as (encoded:chararray); 
    decoded_strings = FOREACH encoded_strings GENERATE UrlDecode(encoded, 'UTF-8'); 

Java代碼負責做這個是:

import java.io.IOException; 
    import java.net.URLDecoder; 

    import org.apache.pig.EvalFunc; 
    import org.apache.pig.data.Tuple; 

    public class UrlDecode extends EvalFunc<String> { 

     @Override 
     public String exec(Tuple input) throws IOException { 
      String encoded = (String) input.get(0); 
      String encoding = (String) input.get(1); 
      return URLDecoder.decode(encoded, encoding); 
     } 
    } 

現在修改這個代碼返回正常的字符串UTF-8編碼字符串,並將其存儲到您的文本文件。希望它有效。

0

這是因爲文本http://hadoop.apache.org/docs/r2.6.0/api/org/apache/hadoop/io/Text.html)自動將輸入數據(字節)轉換爲UTF-8。爲了避免這種情況,你不應該使用文本。

這就是說,你應該使用字節組類型,而不是chararrayByteArray的不使用文本等則不作任何轉換)。既然你不指定任何代碼,我會爲插圖提供了一個例子:

  1. 這是你做了什麼(很可能):

    converted_to_utf = LOAD 'strangeEncodingdata' using TextLoader AS (line:chararray); 
    
  2. 這是你想要做什麼:

    no_conversion = LOAD 'strangeEncodingdata' using TextLoader AS (line:bytearray);