Hadoop 配置单元查询结果的JSON输出格式

Hadoop 配置单元查询结果的JSON输出格式,hadoop,hive,Hadoop,Hive,有没有办法将配置单元查询结果转换为JSON格式?我的经验是使用jackson库(http://jackson.codehaus.org/),创建一个POJO来映射json格式。因此,一旦您从配置单元查询中获得结果集,您就可以对其进行迭代,并使用Jackson创建POJO的对象 /**--JACKSON Class--**/ public class Item { @JsonProperty private String att1; @JsonProperty pr

有没有办法将配置单元查询结果转换为JSON格式?

我的经验是使用jackson库(http://jackson.codehaus.org/),创建一个POJO来映射json格式。因此,一旦您从配置单元查询中获得结果集,您就可以对其进行迭代,并使用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类--**/
公共类项目{
@JsonProperty
专用字符串att1;
@JsonProperty
私有字符串att2;
公共项目(字符串att1、字符串att2){
this.att1=att1;
this.att2=att2;
}
}
/**--运行查询的类--**/
列表=新的ArrayList();
结果集rs=执行任务(查询任务);//在这里执行配置单元查询
while(rs.next){
字符串att1=rs.get(“att1”);
字符串att2=rs.get(“att2”);
项目=新项目(附件1、附件2);
列表。添加(项目);
}
然后您可以返回一个项目列表作为结果,Jackson允许您非常轻松地以json格式编写它

  • 创建ObjectMapper ObjectMapper mapper=new ObjectMapper();映射器提供了很多选项,可以将json格式的对象写入不同的目标。例如输出流、bytebuffer等

  • 遍历列表

  • 使用mapper以json格式写入值,例如mapper.writeValue(out,Item)


  • 最简单的方法是首先存储为tsv,然后使用spray之类的库将其转换为JSON

    只要您不尝试过多定制,蜂巢就可以正常工作。
    如果您确实可以访问集群中的Spark,请使用SparkSQL而不是Hive。您的查询结果将存储到SchemaRDD中,从那里您可以轻松地映射到JSon doing.map(u.toJson),假设您已经在您的范围内导入了spray。

    这似乎经常出现。使用Brickhouse()中的to_json UDF。如果将结果转换为命名的_结构,它将把它解释为JSON映射,并相应地输出

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

    to_json还将相应地解释数组和映射。

    我使用了一个名为ApacheNIFI的工具。它有AvrotoJSON处理器。Avro格式的配置单元输出可以轻松转换为JSON。下面的链接将非常有用:

    json对象列表:

    SELECT to_json( named_struct( "field1", field1 ,
                "field2", field2,
                "field3", field3 ) )
       FROM mytable;
    
    如果您希望将输出转换为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,
    
    创建临时函数collect作为'brickhouse.udf.collect.CollectUDAF';
    创建临时函数作为'brickhouse.udf.json.ToJsonUDF';
    从_json创建临时函数,作为'brickhouse.udf.json.FromJsonUDF';
    收集(从_json(到_json(名为_struct(“locale”,locale,“createdtime”,created_time)),“map”)作为列表_json_对象,
    
    似乎我不是唯一一个寻求此解决方案的人。谢谢分享这个项目。我会看看它有多有用。@Steve我查看了hive json serde。它似乎是用来读取和处理JSON数据的。我一直在寻找我的数据以制表符分隔的东西,但是当我从配置单元中查询它们时,查询输出是json格式的。嗨,divinedragon,你已经找到解决方案了吗?我也在寻找一个解决方案,如果你有一个plz,你能分享吗,谢谢!事实上,由于其他一些优先工作,我已经暂停了那件事。我会开始考虑的,谢谢。我正计划为此编写一个蜂巢UDF。要注册函数,可以使用ADD jar/filepath/brickhouse-0.7.1-SNAPSHOT.jar;将函数创建为'brickhouse.udf.json.ToJsonUDF';它正确地生成单个json对象,但当我按某个对象对_进行分组并使用collect函数时,它崩溃了!:collect(to_json(名为_struct(“locale”,cap)))有什么想法吗?可以在不知道列名的情况下使用to_json吗?我想在JSON中包含所有列名,但事先不知道列名