Hive查询结果的JSON输出格式

时间:2012-04-03 14:46:28

标签: hadoop hive

有没有办法以JSON格式转换Hive查询结果?

4 个答案:

答案 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格式写它。

  1. 创建一个ObjectMapper ObjectMapper mapper = new ObjectMapper();映射器为您提供了很多选项,可以将json格式的对象写入不同的目标。例如。 outputstream,bytebuffer等。

  2. 遍历列表。

  3. 使用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,