HiveSQL 访问 JSON 数组值
Posted
技术标签:
【中文标题】HiveSQL 访问 JSON 数组值【英文标题】:HiveSQL access JSON-array values 【发布时间】:2018-12-07 13:23:58 【问题描述】:我在 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
他们提交产品零件颜色和在一次服务流程运行中计算的颜色数量。
请注意 color
中的 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 额外列?
我还尝试将整个 json 作为字符串读入一列,并在那里选择子内容,但是这个 importing json array into hive 只会将我引导到 NULL 值,这可能是因为我的 json 文件不是 100% 格式正确的。
【问题讨论】:
【参考方案1】:您可以分两步完成此操作。
创建正确的 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
【讨论】:
嘿 Gaurang,这对我帮助很大。感谢您的快速和可理解的支持!但我需要将 4 种颜色及其数量放在单独的列中。最后它应该看起来像:imgur.com/a/L4cq8LE - 你能再帮我一次:-)吗?会很好。 你在找什么pivoting
。 hive
中没有内置机制,但是第三方库很少。或者如果orderid
更独特,你可以groupby
它然后写case
语句。【参考方案2】:
你的数组里面的数据绝对不是hive的map,你需要指定。我建议重新定义您的表,指定数组数据的结构,如下所示
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';
这样你应该能够自己构建它
【讨论】:
谢谢!这也有效。我现在必须看看我如何在单独的列中获得 4 种颜色,就像我在你上面的帖子中的 cmets 中提到的那样。也许你可以在这里帮助我。以上是关于HiveSQL 访问 JSON 数组值的主要内容,如果未能解决你的问题,请参考以下文章
从字典的 JSON 数组访问键/值 C#,Unity [重复]