Hiveクエリの結果をJSON形式に変換する方法はありますか?
これはかなり頻繁に発生するようです。 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は、それに応じて配列とマップも解釈します。
私はApacheNifiというツールを使用していました。 AvrotoJSONプロセッサを搭載しています。 Avro形式のHive出力は、JSONに簡単に変換できます。以下のリンクが役立ちます: https://nifi.Apache.org/
私の経験では、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形式で非常に簡単に書き込むことができます。
objectMapperを作成しますObjectMappermapper = new ObjectMapper();マッパーには、オブジェクトをjson形式で別のターゲットに書き込むための多くのオプションがあります。例えば。 outputstream、bytebufferなど。
リストを繰り返し処理します。
マッパーを使用して、json形式で値を書き込みます。 mapper.writeValue(out、Item)。この例では、outはOutputStreamです。
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,
最も簡単な方法は、最初にtsvとして保存してから、sprayなどのライブラリを使用してJSONに変換することです。
あまりカスタマイズしようとしない限り、Hiveは正常に機能します。クラスター内のSparkにアクセスできる場合は、Hiveの代わりにSparkSQLを使用します。クエリの結果はSchemaRDDに保存され、そこから.mapを実行してJSonに簡単にマップできます。 (_.toJson)、スコープにスプレーをインポートしたと仮定します。