我正在使用 Apache Pig 处理一些数据。
我的数据集有一些包含特殊字符的字符串,即(#,{}[])
.
这本编程猪书说你无法逃脱那些字符。
那么如何在不删除特殊字符的情况下处理我的数据呢?
我考虑过更换它们,但想避免这种情况。
谢谢
我正在使用 Apache Pig 处理一些数据。
我的数据集有一些包含特殊字符的字符串,即(#,{}[])
.
这本编程猪书说你无法逃脱那些字符。
那么如何在不删除特殊字符的情况下处理我的数据呢?
我考虑过更换它们,但想避免这种情况。
谢谢
最简单的方法是,
input = LOAD 'inputLocation' USING TextLoader() as unparsedString:chararray;
TextLoader 只是将输入的每一行读入一个字符串,而不管该字符串中的内容。然后,您可以使用自己的解析逻辑。
您是否尝试过加载数据?当这些字符是 tuple、bag 或 map 值的一部分时,没有办法转义这些字符,但是将这些字符加载到字符串的一部分时没有任何问题。只需将该字段指定为 type chararray
。
您需要注意的唯一问题是您的字符串是否包含 Pig 用作字段分隔符的字符 - 例如,如果您是USING PigStorage(',')
并且您的字符串包含逗号。但只要您不告诉 Pig 将您的字段解析为地图,#
, [
,]
就可以很好地处理。
在编写加载器函数时,不要返回元组,例如将地图作为字符串返回(因此稍后依赖Utf8StorageConverter将转换为正确的地图):
Tuple tuple = tupleFactory.newTuple( 1 );
tuple.set(0, new DataByteArray("[age#22, name#joel]"));
您可以直接创建和设置 Java 地图:
HashMap<String, Object> map = new HashMap<String, Object>(2);
map.put("age", 22);
map.put("name", "joel");
tuple.set(0, map);
这很有用,特别是如果您无论如何都必须在加载期间进行解析。