提取所有 JSON 密钥

Mic*_*ico 5 sql json presto

我有一个 JSON 列,j例如:

{'a': 2, 'b': {'b1': 3, 'b2': 5}}
{'c': 3, 'a': 5}
{'d': 1, 'c': 7}
Run Code Online (Sandbox Code Playgroud)

如何从 Presto 获取所有不同的(顶级)键名称?即我喜欢

select distinct foo(j)
Run Code Online (Sandbox Code Playgroud)

回来

['a', 'b', 'c', 'd']
Run Code Online (Sandbox Code Playgroud)

(请注意,在这种情况下,我不太关心嵌套键)

Presto 文档没有任何明确符合要求的功能。唯一看起来很接近的是提到了JSONPath语法,但即使这样似乎也不准确。至少以下之一应该返回一些内容,但在 Presto 中对我来说都失败了:

select json_extract(j, '$.*')
select json_extract(j, '$..*')
select json_extract(j, '$[*]')
select json_extract(j, '*')
select json_extract(j, '..*')
select json_extract(j, '$*.*')
Run Code Online (Sandbox Code Playgroud)

此外,我怀疑这将从(ie, )返回,而不是键。j[2, 3, 5, 3, 5, 1, 7]

Pio*_*sen 5

你可以

  1. 提取 JSON 顶级密钥map_keys(cast(json_column as map<varchar,json>))
  2. 后来使用“展平”关键集合CROSS JOIN UNNEST
  3. 然后你就可以获得SELECT DISTINCT不同的顶级密钥。

将其放在一起的示例:

presto> SELECT DISTINCT m.key
     -> FROM (VALUES JSON '{"a": 2, "b": {"b1": 3, "b2": 5}}', JSON '{"c": 3, "a": 5}')
     ->     example_table(json_column)
     -> CROSS JOIN UNNEST (map_keys(CAST(json_column AS map<varchar,json>))) AS m(key);
 key
-----
 a
 b
 c
(3 rows)
Run Code Online (Sandbox Code Playgroud)

  • 附加的条件是,如果您的列存储为“varchar”,例如“{“a”:2,“b”:{“b1”:3,“b2”:5}}'`,则您需要转换使用“json_parse(json_column)”转换为“JSON”,而不是“cast(json_column as JSON)” (4认同)