HiveSQL访问JSON数组值

时间:2018-12-07 13:23:59

标签: sql arrays json hive hiveql

我在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';

这有效,如果我在该表上执行选择* ,则它看起来像这样:

enter image description here

但是我的问题是,我必须访问颜色列中的数据以进行分析。例如,我要计算表中的所有红色值。

因此,这带来了一些机会和问题:如何将金额字符串转换为整数?

如何通过select访问我的色列中的数据?

或者是否有可能在一开始就更改我的表模式,以便为我的4种颜色增加4个额外的列,并为相关颜色量增加4个额外的列?

我还尝试将整个json作为字符串读入一列,然后在其中选择子内容,但是此importing json array into hive仅将我引向NULL值,这可能是因为我的json文件格式不是100%正确

2 个答案:

答案 0 :(得分:0)

您需要指定数组中的数据绝对不是配置单元的映射。我建议重新定义您的表,指定像这样的数组数据的结构

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';

这样,您应该可以自行构建结构

答案 1 :(得分:0)

您可以分两步执行此操作。

创建正确的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'

enter image description here

展开Select语句中的表

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

enter image description here