【问题标题】:HIVE, How to get an element from an array, the element itself is an array tooHIVE,如何从数组中获取元素,元素本身也是数组
【发布时间】:2016-09-29 23:11:27
【问题描述】:

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

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

对于“信息”列,它包含以下 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 oracle hadoop hive


    【解决方案1】:

    你可以直接调用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;
    

    【讨论】:

      猜你喜欢
      • 2019-12-17
      • 2019-06-01
      • 2014-12-19
      • 2020-07-09
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 2021-01-07
      • 1970-01-01
      相关资源
      最近更新 更多