2012-04-03 64 views
16

有沒有辦法將Hive查詢結果轉換爲JSON格式?Hive的JSON輸出格式查詢結果

+1

http://code.google.com/p/hive-json-serde/ – 2012-04-03 15:44:06

+1

好像我不是唯一一個尋找這個解決方案。感謝分享這個項目。將會看到它如何有用。 – divinedragon 2012-04-05 14:24:10

+0

@Steve我檢出了hive-json-serde。它看起來像是讀取和處理JSON數據。我一直在尋找我的數據是製表符分隔的東西,但是當我從配置單元查詢它們時,查詢輸出是以json格式。 – divinedragon 2012-04-06 10:13:07

回答

5

這似乎經常出現。使用來自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也將相應地解釋數組和映射。

0

我的經驗是使用傑克遜庫(http://jackson.codehaus.org/),你創建一個POJO來映射json格式。所以一旦你從你的配置單元查詢中得到了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); 
} 

然後您可以返回項目列表作爲結果,傑克遜允許您非常容易地以json格式編寫它。

  1. 創建一個ObjectMapper ObjectMapper mapper = new ObjectMapper();映射器爲您提供了很多選項,可以將json格式的對象寫入不同的目標。例如。輸出流,字節緩衝等。

  2. 遍歷列表。

  3. 使用映射器以json格式寫入值,例如。 mapper.writeValue(out,Item)。在這個例子中,out是一個OutputStream。

+0

謝謝。我打算爲此寫一個Hive UDF。將嘗試納入這一點。 – divinedragon 2012-04-12 02:33:56

+0

你有這個排序? – Shengjie 2012-04-12 23:32:06

+0

我正在使用UDF。完成後會發布。 – divinedragon 2012-04-13 06:11:36

0

最簡單的方法是先存儲爲tsv,然後使用類似spray的庫轉換爲JSON。

只要您不嘗試自定義太多,Hive就能正常工作。 如果您確實可以訪問羣集中的Spark,請使用SparkSQL而不是Hive。您的查詢結果將存儲在SchemaRDD中,並且從那裏您可以輕鬆映射到JSon執行.map(_。toJson),假設您已將範圍導入了噴射。

1

我正在使用一個名爲Apache Nifi的工具。它有AvrotoJSON處理器。 Avro格式的配置單元輸出可以輕鬆轉換爲JSON。下面的鏈接將有幫助:https://nifi.apache.org/