有没有办法以JSON格式转换Hive查询结果?
答案 0 :(得分:7)
这似乎经常出现。使用Brickhouse中的to_json UDF(http://github.com/klout/brickhouse)。如果将结果转换为named_struct,它会将其解释为JSON映射,并相应地输出。
SELECT to_json( named_struct( "field1", field1 ,
"field2", field2,
"field3", field3 ) )
FROM mytable;
to_json还会相应地解释数组和地图。
答案 1 :(得分:1)
我使用的是名为Apache Nifi的工具。它有AvrotoJSON处理器。 Avro格式的配置单元输出可以轻松转换为JSON。以下链接将有所帮助:https://nifi.apache.org/
答案 2 :(得分:0)
我的经验将是使用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);
}
然后你可以返回一个Item of Item作为结果,Jackson允许你很容易地用json格式写它。
创建一个ObjectMapper ObjectMapper mapper = new ObjectMapper();映射器为您提供了很多选项,可以将json格式的对象写入不同的目标。例如。 outputstream,bytebuffer等。
遍历列表。
使用mapper以json格式写入值,例如。 mapper.writeValue(out,Item)。在这个例子中,out是一个OutputStream。
答案 3 :(得分:0)
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,