Hive:如何分解嵌入在 CSV 文件中的 JSON 列?

Posted

技术标签:

【中文标题】Hive:如何分解嵌入在 CSV 文件中的 JSON 列?【英文标题】:Hive : How to explode a JSON column embedded in a CSV file? 【发布时间】:2018-04-06 17:04:19 【问题描述】:

从一个 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_json_object' 等,但仍然没有找到合适的 SQL 查询。

非常感谢您的帮助:-)

【问题讨论】:

嘿,您知道如何实现这一目标吗? 我也有同样的情况。你找到解决办法了吗? 【参考方案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

【讨论】:

您好,抱歉,您的解决方案不起作用!你真的在回答之前测试过你的代码吗?

以上是关于Hive:如何分解嵌入在 CSV 文件中的 JSON 列?的主要内容,如果未能解决你的问题,请参考以下文章

如何跳过 Hive 外部表中的 CSV 标头?

如何在使用 EMR/Hive 将数据从 S3 导入 DynamoDB 时处理包含在引号 (CSV) 中的字段

如何在 csv 文件中忽略带引号的换行符以创建 Hive 外部表?

hive表加载csv格式数据或者json格式数据

如何将excel中的数据导入hive仓库中

无法使用 CSV 文件中的 Presto 创建 Hive 表