簡體   English   中英

HiveSQL訪問JSON數組值

[英]HiveSQL access JSON-array values

我在Hive中有一個表,該表是通過從HDFS中的序列文件讀取生成的。 這些序列文件是json ,如下所示:

{"Activity":"Started","CustomerName":"CustomerName3","DeviceID":"StationRoboter","OrderID":"CustomerOrderID3","DateTime":"2018-11-27T12:56:47Z+0100","Color":[{"Name":"red","Amount":1},{"Name":"green","Amount":1},{"Name":"blue","Amount":1}],"BrickTotalAmount":3}

他們提交產品零件的顏色及其數量,這些顏色在一次服務過程中進行計數。

請注意彩色json-array

因此,我創建表的代碼是:

CREATE EXTERNAL TABLE iotdata(
  activity              STRING,
  customername          STRING,
  deviceid              STRING,
  orderid               STRING,
  datetime              STRING,
  color                 ARRAY<MAP<String,String>>,
  bricktotalamount      STRING
)
ROW FORMAT SERDE "org.apache.hive.hcatalog.data.JsonSerDe"
STORED AS
INPUTFORMAT 'org.apache.hadoop.mapred.SequenceFileInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat'
LOCATION '/IoTData/scray-data-000-v0';

這可行,如果我在該表上執行select * ,則如下所示:

在此處輸入圖片說明

但是我的問題是,我必須訪問顏色列中的數據進行分析。 例如,我要計算表中的所有紅色值。

因此,這帶來了一些機會和問題:如何將創建的金額字符串轉換為整數?

如何通過select訪問顏色列中的數據?

或者是否有可能在一開始就更改我的表模式,以便為我的4種顏色獲得4個額外的列,為相關色量獲得4個額外的列?

我還嘗試將整個json作為字符串讀入一列,然后在其中選擇子內容,但是這種將json數組導入hive只會導致我得到NULL值,這可能是因為我的json文件格式不是100%正確。

您需要指定數組中的數據絕對不是配置單元的映射。 我建議重新定義表,指定像這樣的數組數據的結構

CREATE EXTERNAL TABLE iotdata(
  activity              STRING,
  customername          STRING,
  deviceid              STRING,
  orderid               STRING,
  datetime              STRING,
  color ARRAY<STRUCT<NAME: STRING,AMOUNT:BIGINT>>
  bricktotalamount      STRING
)
ROW FORMAT SERDE "org.apache.hive.hcatalog.data.JsonSerDe"
STORED AS
INPUTFORMAT 'org.apache.hadoop.mapred.SequenceFileInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat'
LOCATION '/IoTData/scray-data-000-v0';

這樣,您應該能夠自行構建結構

您可以分兩步執行此操作。

創建正確的JSON表

CREATE external TABLE temp.test_json (
  activity string,
  bricktotalamount int,
  color array<struct<amount:int, name:string>>,
  customername string,
  datetime string,
  deviceid string,
  orderid string)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
location '/tmp/test_json/table'

在此處輸入圖片說明

分解Select語句中的表

select activity, bricktotalamount, customername, datetime, deviceid, orderid, name, amount from temp.test_json
lateral view inline(color) c as amount,name

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM