Объединение нескольких полей в JSON в скрипте Pig

Я по всему стеку ищу решение для этого, не могу, кажется, прийти ни к чему близкому.

У меня есть пользовательское сжатие UDF и я хотел бы вывести JSONформат ключа-значения из Pig с помощью JsonStorage(). Твист, я хотел бы объединить несколько полей ВJSON, а затем сжать их с помощью моего UDF, перед использованием вывода JsonStorage().

Конечный результат идеально будет выглядеть примерно так:

{ '00001' : '<COMPRESSED BYTES>' }
{ '00002' : '<OTHER COMPRESSED BYTES>' }

Где значение сжатых байтов будет распаковываться в

{ 'id': '00001', 'v1': 'value1', ... , 'vN': 'valueN' }
{ 'id': '00002', 'v1': 'othervalue1', ... , 'vN': 'othervalueN' }

…Вы поняли идею.

Существует ли встроенный или PiggyBank способ кодирования JSONвнутри скрипта Pig?

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какой-то способ превратить несколько полей в одну JSONстроку.

Спасибо за любые указатели.

1 ответ

  1. Хорошо, кажется, что в native Pig не хватает решений. Я решил создать еще один 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>