我已经遍布Stack寻找解决方案,似乎无法达到任何接近的目标。
我有自定义压缩UDF,并希望使用JSON
从Pig输出{{1}}键值格式。问题是,我想将几个字段连接到JsonStorage()
,然后使用我的UDF压缩它们,然后使用JSON
输出。
最终输出理想情况如下:
JsonStorage()
压缩字节的值将解压缩到
{ '00001' : '<COMPRESSED BYTES>' }
{ '00002' : '<OTHER COMPRESSED BYTES>' }
......你明白了。
是否有内置或PiggyBank方法在Pig脚本中编码{ 'id': '00001', 'v1': 'value1', ... , 'vN': 'valueN' }
{ 'id': '00002', 'v1': 'othervalue1', ... , 'vN': 'othervalueN' }
?
JSON
register $MY_COMPRESS_UDF_JAR;
define compress my.compress.udf(args);
A = load 'example.csv' using PigStorage(',') as $fields;
B = foreach A generate encode_json($subset_of_fields) as jsonstr;
J = foreach B generate id, compress(jsonstr);
store J into 'example.json' using JsonStorage();
是将多个字段转换为单个encode_json
字符串的某种方式。
感谢您的任何指示。
答案 0 :(得分:0)
好的,原生猪似乎缺乏解决方案。我决定创建另一个UDF来执行这个简单的编码。它很粗糙,但它确实有效:
public class JsonEncode extends EvalFunc<String> {
/*
* Pig provides a tuple of fields to encode,
* with first field being a comma-separated
* list of field names
*/
@Override
public String exec(Tuple input) throws IOException {
// Build JSON object, return as string
JSONObject js = new JSONObject();
String fieldlist = (String) input.get(0);
String[] fields = fieldlist.split(",", -1);
for(int i = 1; i <= fields.length; i++) {
js.put(fields[i-1], input.get(i));
}
return js.toString();
};
}
猪:
define compress my.compress.udf(args);
define json_encode my.encode.udf();
A = load 'example.csv' using PigStorage(',') as $fields;
-- NB: first argument is quoted list of field names
B = foreach A generate json_encode('$subset_of_fields', $subset_of_fields) as jsonstr;
J = foreach B generate id, compress(jsonstr);
store J into 'example.out.csv' using PigStorage(',');
输出显示为:
00001,<compressed bytes>
00002,<other compressed bytes>