我在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访问我的色列中的数据?
或者是否有可能在一开始就更改我的表模式,以便为我的4种颜色增加4个额外的列,并为相关颜色量增加4个额外的列?
我还尝试将整个json作为字符串读入一列,然后在其中选择子内容,但是此importing json array into hive仅将我引向NULL值,这可能是因为我的json文件格式不是100%正确
答案 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'
展开Select语句中的表
select activity, bricktotalamount, customername, datetime, deviceid, orderid, name, amount from temp.test_json
lateral view inline(color) c as amount,name