2

使用 Pig Latin 加载包含某些特定字符(例如 À、° 等)的数据并将数据存储在 .txt 文件中,可以看到 txt 文件中的这些符号显示为 � 和 ï 字符。发生这种情况是因为 UTF-8 替换字符。我想问是否有可能以某种方式避免它,也许用一些猪命令,在结果中(在txt文件中)例如À而不是�?

4

2 回答 2

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 编码的字符串并将其存储到您的文本文件中。希望它有效。

于 2014-06-27T10:08:32.007 回答
0

你是对的,这是因为文本http://hadoop.apache.org/docs/r2.6.0/api/org/apache/hadoop/io/Text.html)会自动将传入数据(字节)转换为 UTF-8 . 为避免这种情况,您不应使用 Text。

也就是说,您应该使用bytearray类型而不是chararraybytearray不使用 Text ,因此不进行转换)。由于您没有指定任何代码,因此我将提供一个示例进行说明:

  1. 这就是(可能)你所做的:

    converted_to_utf = LOAD 'strangeEncodingdata' using TextLoader AS (line:chararray);
    
  2. 这就是你想要做的:

    no_conversion = LOAD 'strangeEncodingdata' using TextLoader AS (line:bytearray);
    
于 2015-03-26T18:11:27.187 回答