在presto中提取JSON键,父键和子键

cwxwcias  于 2023-03-20  发布在  Presto
关注(0)|答案(1)|浏览(409)

我在使用prestosql时遇到了一个问题,我试图将所有JSON键放到一行中:

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

我尝试使用map_keys,但得到的结果是:

a, b, c, d

但我想要的结果是:

a, b, b1, b2, c, d

我有点卡在这一点上,因为我尝试使用json_parse,提取等。
先谢谢你
我尝试将map_keysjson_parse/json_extract与map_keys结合使用

0lvr5msh

0lvr5msh1#

这并不容易,并且需要对每个嵌套级别进行额外处理,但对于2个级别,您可以执行以下操作:

-- sample data
WITH dataset(js_string) AS (
    values  (json '{"a":"2", "b":"3", "c":"4","d":{"d1":"9","d2":"8"}}')
)

-- query
select flatten(
    transform(
        map_keys(m),
        k -> coalesce(array[k] || map_keys(try_cast(m[k] as map(varchar, json))), array[k]))
    )
from (select cast(js_string as map(varchar, json)) m
      from dataset);

输出:

_col0         
----------------------
 [a, b, c, d1, d2, d]

一些解释:基本上,这个想法是将每个键转换为数组,然后将数据扁平化,为了转换键,我们检查值是否实际上是一个JSON对象,将其键与当前键连接或使用当前键

  • try_cast将返回null如果强制转换失败,则将某个内容与null(当前键)连接将导致null
  • coalesce在第一个参数不为空时返回该参数,否则返回第二个参数
  • flatten-将数组的数组展开为元素的数组。

附言
Json路径语法有一个扩展,允许从json对象获取密钥,如果特里诺/Presto支持它,那么使用以下路径-$..*~(检查@https://jsonpath.com/)将是一项相当容易的任务,但目前它不适用于Trino(与Presto相比,Trino已经扩展了对json路径的支持)。

相关问题