json - 如何使用 Hive (get_json_object) 查询结构数组?

标签 json hadoop hive hiveql

我将以下 JSON 对象存储在 Hive 表中:

{
  "main_id": "qwert",
  "features": [
    {
      "scope": "scope1",
      "name": "foo",
      "value": "ab12345",
      "age": 50,
      "somelist": ["abcde","fghij"]
    },
    {
      "scope": "scope2",
      "name": "bar",
      "value": "cd67890"
    },
    {
      "scope": "scope3",
      "name": "baz",
      "value": [
        "A",
        "B",
        "C"
      ]
    }
  ]
}

“features”是一个长度可变的数组,即所有对象都是可选的。对象具有任意元素,但它们都包含“范围”、“名称”和“值”。

这是我创建的 Hive 表:

CREATE TABLE tbl(
main_id STRING,features array<struct<scope:STRING,name:STRING,value:array<STRING>,age:INT,somelist:array<STRING>>>
)

我需要一个返回 main_id 和名为“baz”的结构值的 Hive 查询,即,

main_id baz_value
qwert ["A","B","C"]

我的问题是 Hive UDF“get_json_object”仅支持有限版本的 JSONPath。它不支持像 get_json_object(features, '$.features[?(@.name='baz')]') 这样的路径。

如何用Hive查询想要的结果?使用另一个 Hive 表结构可能更容易吗?

最佳答案

我找到了一个解决方案:

使用 Hive explode UDTF展开结构数组,即创建第二个(临时)表,其中为数组“特征”中的每个结构创建一个记录。

CREATE TABLE tbl_exploded as
select main_id, 
f.name as f_name,
f.value as f_value
from tbl
LATERAL VIEW explode(features) exploded_table as f
-- optionally filter here instead of in 2nd query:
-- where f.name = 'baz'; 

结果是:

qwert, foo, ab12345
qwert, bar, cd67890
qwert, baz, ["A","B","C"]

现在您可以像这样选择 main_id 和值:

select main_id, f_value from tbl_exploded where f_name = 'baz';

关于json - 如何使用 Hive (get_json_object) 查询结构数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28716165/

相关文章:

python - 将 python 连接到 Hive

javascript - JSP 属性 JSON 对象在 Javascript 中删除转义字符

Python - 在字典列表中查找重复项并将它们分组

javascript - 使用属性搜索 json 对象并获取该对象的所有相应属性

hadoop - HBase与Sqoop兼容性

xml - 如何在Hive中使用横向 View explode 以获取XML数据格式?

javascript - 如何使用函数向 javascript 对象添加值?

hadoop - HDFS的并行提示

java - URL 类中 setURLStreamHandlerFactory 的用途

hive - 使用 'STORED AS AVRO'子句创建配置单元表时,Avro模式存储在哪里?