2016-11-03 3 views
0

私はこれを解決するためのスタックを探しています。近くには到着していないようです。JSONのいくつかのフィールドをPigスクリプト内で連結します。

私はカスタム圧縮UDFを持っており、JsonStorage()を使用してPigからJSONのキー値フォーマットを出力したいと考えています。ひねりは、を使用して出力する前に、いくつかのフィールドを連結してJSONにし、私のUDFを使用して圧縮したいと思っています。

最終的な出力は、理想的には、のようなものになります。

圧縮されたバイトの値が

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

に解凍します

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

を...あなたのアイデアを得ます。

JSONをPigスクリプトの中にエンコードするビルトインまたはPiggyBankの方法はありますか? encode_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(); 

は、単一JSON文字列に複数のフィールドを回すのいくつかの方法です。

ありがとうございます。

+0

あなたは(Pythonのメソッドのstring.encodeを試しました) –

答えて

0

OK、ネイティブのブタには溶液が不足しているようです。この単純なエンコーディングを実行する別の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> 
関連する問題