配置单元:如何分解csv文件中嵌入的json列?

kjthegm6  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(364)

从一个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"}]}

首先,我创建我的“原始”表如下:

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\ujson\uobject'等等,但是仍然没有找到正确的sql查询。
非常感谢您的帮助:-)

jgwigjjp

jgwigjjp1#

你可以试试

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

相关问题