提取所有JSON密钥

时间:2017-12-01 06:52:37

标签: sql json presto

我有一个JSON列j,如:

{'a': 2, 'b': {'b1': 3, 'b2': 5}}
{'c': 3, 'a': 5}
{'d': 1, 'c': 7}

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

select distinct foo(j)

返回

['a', 'b', 'c', 'd']

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

Presto documentation没有任何明确适合该法案的功能。唯一看起来很接近的是提到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, '$*.*')

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

1 个答案:

答案 0 :(得分:2)

你可以

  1. 使用map_keys(cast(json_column as map<varchar,json>))
  2. 提取JSON顶级密钥
  3. 以后&#34; flatten&#34;使用CROSS JOIN UNNEST
  4. 的关键集合
  5. 然后您可以SELECT DISTINCT获取不同的顶级密钥。
  6. 将这个放在一起的例子:

    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)