Hive:如何爆炸嵌入CSV文件的JSON列?

时间:2017-10-25 14:37:04

标签: json csv hadoop hive explode

从CSV文件(带有标题和管道分隔符)我有以下两个内容,其中包含一个JSON列(内部有一个集合),如下所示:

第一种情况(使用没有名称的JSON集合):

ProductId|IngestTime|ProductOrders
9180|20171025145034|[{"OrderId":"299","Location":"NY"},{"OrderId":"499","Location":"LA"}]
8251|20171026114034|[{"OrderId":"1799","Location":"London"}]

第二种情况(使用名为“Orders”的JSON集合):

ProductId|IngestTime|ProductOrders
9180|20171025145034|{"Orders":[{"OrderId":"299","Location":"NY"},{"OrderId":"499","Location":"LA"}]}
8251|20171026114034|{"Orders":[{"OrderId":"1799","Location":"London"}]}

Firstable,我创建了这样的“原始”表:

DROP TABLE IF EXISTS Product;
CREATE EXTERNAL TABLE Product (
  ProductId STRING,
  IngestTime STRING,
  ProductOrders STRING
)
COMMENT "Product raw table"
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\|'
STORED AS TEXTFILE
LOCATION
  '/data/product'
TBLPROPERTIES ("skip.header.line.count"="1");

当我用:

查询我的表时
SELECT * FROM Product

我得到了以下答案:

第一种情况(使用没有名称的JSON集合):

ProductId  IngestTime      ProductOrders
9180       20171025145034  [{"OrderId":"299","Location":"NY"},{"OrderId":"499","Location":"LA"}]
8251       20171026114034  [{"OrderId":"1799","Location":"London"}]

第二种情况(使用名为“Orders”的JSON集合):

ProductId  IngestTime      ProductOrders
9180       20171025145034  {"Orders":[{"OrderId":"299","Location":"NY"},{"OrderId":"499","Location":"LA"}]}
8251       20171026114034  {"Orders":[{"OrderId":"1799","Location":"London"}]}

好的非常好,到目前为止它运作良好!

但我现在需要的是创建一个返回的SELECT查询:

ProductId  IngestTime      ProductOrderId ProductLocation
9180       20171025145034  299            NY
9180       20171025145034  499            LA
8251       20171026114034  1799           London

我真的需要一个可移植的SQL查询,它适用于我的两种情况(带或不带标签“OrderId”)。

到目前为止,我通过使用'explode','get_json_object'等尝试了很多组合,但我仍然没有找到正确的SQL查询。

非常感谢你的帮助: - )

1 个答案:

答案 0 :(得分:-1)

你可以尝试

CREATE EXTERNAL TABLE product(productid String,ingesttime String, productorders array<struct<orderid:String,location:string>> ) 

select productid,ingesttime, productorders.orderid[0] as orderid , productorders.location[0] as location from product

enter image description here