json - HIVE,如何从数组中获取元素,元素本身也是一个数组

标签 json oracle hadoop hive

我有一个数据库表,其中有一列存储 JSON 格式的字符串。字符串本身包含多个元素,如数组。每个元素包含多个键值对。一些值也可能包含多个键值对,例如下面的“地址”属性。

People table:
  Col1      Col2   .....   info
  aaa       bbb           see below

对于“info”列,它包含以下JSON格式字符串:

 [{"name":"abc", 
  "address":{"street":"str1", "city":"c1"},
  "phone":"1234567"
 },
 {"name":"def", 
  "address":{"street":"str2", "city":"c1", "county":"ct"},
  "phone":"7145895"
 }
]

我需要获取 JSON 字符串中每个字段的单个值。我可以通过调用 explode() 为除“地址”字段之外的所有字段执行此操作,如下所示:

 SELECT  
   get_json_object(person, '$.name') AS name,
   get_json_object(person, '$.phone') AS phone,
   get_json_object(person, '$.address') AS addr
 FROM people lateral view explode(split(regexp_replace(
      regexp_replace(info, '\\}\\,\\{', '\\}\\\\n\\{' ), '\\[|\\]',''), '\\\\n')) 
      p as person;

我的问题是如何获取“地址”字段中的每个字段。 “地址”字段可以包含任意数量的键值对,我不能使用 JSONSerDe。我正在考虑使用另一个 explode() 调用,但我无法让它工作。有人可以帮忙吗?非常感谢。

最佳答案

你可以直接调用json_objects

SELECT  
  get_json_object(person, '$.name') AS name,
  get_json_object(person, '$.phone') AS phone,
  get_json_object(person, '$.address.street') AS street,
  get_json_object(person, '$.address.city') AS city,
  get_json_object(person, '$.address.county') AS county,      
FROM people lateral view explode(split(regexp_replace(
  regexp_replace(info, '\\}\\,\\{', '\\}\\\\n\\{' ), '\\[|\\]',''), '\\\\n')) 
  p as person;

关于json - HIVE,如何从数组中获取元素,元素本身也是一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39781392/

相关文章:

oracle - 在生产中使用 Babel - 如何预编译脚本

hadoop - 从Amazon HBase读取数据

java - 管道 hadoop mapreduce 作业

java - 彻底改变spring项目的响应从渲染jsp变为json对象

c# - 使用 Swashbuckle Aspnetcore 将 `host` 、 `basePath` 和 `schemes` 添加到 swagger.json

java - Jackson 自定义序列化程序,用于某些字段的自定义行为,同时对其余字段具有默认行为

SQL 连接只允许每个表中有一个匹配项

javascript - 如何访问javascript中有空格的对象参数

sql - 为什么 NVL2 在预期之外返回 NULL?

java - 在hadoop中运行作业-错误安全性.UserGroupInformation