web-dev-qa-db-ja.com

Hiveクエリ結果のJSON出力形式

Hiveクエリの結果をJSON形式に変換する方法はありますか?

20
divinedragon

これはかなり頻繁に発生するようです。 Brickhouseのto_jsonUDFを使用します( http://github.com/klout/brickhouse )。結果をnamed_structに変換すると、JSONマップとして解釈され、それに応じて出力されます。

SELECT to_json( named_struct( "field1", field1 ,
            "field2", field2,
            "field3", field3 ) )
   FROM mytable;

To_jsonは、それに応じて配列とマップも解釈します。

7
Jerome Banks

私はApacheNifiというツールを使用していました。 AvrotoJSONプロセッサを搭載しています。 Avro形式のHive出力は、JSONに簡単に変換できます。以下のリンクが役立ちます: https://nifi.Apache.org/

1
ForeverLearner

私の経験では、jacksonライブラリ(http://jackson.codehaus.org/)を使用し、POJOを作成してjson形式をマップします。したがって、HiveクエリからResultSetを取得したら、それを繰り返し処理し、Jacksonを使用してPOJOのオブジェクトを作成します。

/**--JACKSON Class--**/
public class Item {
    @JsonProperty
    private String att1;
    @JsonProperty
    private String att2;
    public Item(String att1, String att2){
        this.att1 = att1;
        this.att2 = att2;
    }

}

/**--the class where u run your query--**/
List<Item> list = new ArrayList<Item>();
ResultSet rs = executeQuery(queryStr); // do your Hive query here
while(rs.next){
    String att1 = rs.get("att1");
    String att2 = rs.get("att2");
    Item item = new Item(att1, att2);
    list.add(item);
}

その結果、アイテムのリストを返すことができます。Jacksonを使用すると、json形式で非常に簡単に書き込むことができます。

  1. objectMapperを作成しますObjectMappermapper = new ObjectMapper();マッパーには、オブジェクトをjson形式で別のターゲットに書き込むための多くのオプションがあります。例えば。 outputstream、bytebufferなど。

  2. リストを繰り返し処理します。

  3. マッパーを使用して、json形式で値を書き込みます。 mapper.writeValue(out、Item)。この例では、outはOutputStreamです。

0
Shengjie

jsonオブジェクトのリスト:

出力をjson形式に変換し、それを意味するコレクションを作成する場合:[{json1}、{json2}、{json3}] ... collect()関数がそれを文字列として扱うことを知っておく必要があります。間違っている。

したがって、json形式の出力のコレクションを作成するために必要なのは、それらをfrom-json関数でラップすることです。

create temporary function collect as 'brickhouse.udf.collect.CollectUDAF';
create temporary function to_json as 'brickhouse.udf.json.ToJsonUDF';
create temporary function from_json as 'brickhouse.udf.json.FromJsonUDF';
collect(from_json(to_json(named_struct("locale", locale, "createdtime",  created_time)), 'map<string,string>')) as list_json_object,
0
Reihan_amn

最も簡単な方法は、最初にtsvとして保存してから、sprayなどのライブラリを使用してJSONに変換することです。

あまりカスタマイズしようとしない限り、Hiveは正常に機能します。クラスター内のSparkにアクセスできる場合は、Hiveの代わりにSparkSQLを使用します。クエリの結果はSchemaRDDに保存され、そこから.mapを実行してJSonに簡単にマップできます。 (_.toJson)、スコープにスプレーをインポートしたと仮定します。

0