[英]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.