在Pig脚本中连接JSON中的几个字段

时间:2016-11-03 18:43:28

标签: json apache-pig

我已经遍布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字符串的某种方式。

感谢您的任何指示。

1 个答案:

答案 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>