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 - 你能再帮我一次:-)吗?会很好。 你在找什么pivotinghive 中没有内置机制,但是第三方库很少。或者如果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 生成的数组值

从字典的 JSON 数组访问键/值 C#,Unity [重复]

在HandleBar jsp中迭代数组时访问JSON值

如何访问 json 对象中的数组?

使用无效键值访问的 JArray 值:“字段”。预期数组位置索引

如何访问json数组中的数据