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