在Trino/Presto中展开JSON对象元素,拆分用户数据为多列
解决方案
你可以通过解析JSON为Map类型,再借助UNNEST(map_entries())同时提取邮箱(键)和对应的数组值,最后从数组中拆分出两个元素作为单独列。完整查询语句如下:
SELECT entry.key AS splitUsers, CAST(json_extract(entry.value, '$[0]') AS DOUBLE) AS firstValue, CAST(json_extract(entry.value, '$[1]') AS DOUBLE) AS secondValue FROM tableName, UNNEST(map_entries(CAST(json_parse(users) AS MAP(VARCHAR, JSON)))) AS entry
步骤说明
- 解析JSON为Map:
CAST(json_parse(users) AS MAP(VARCHAR, JSON))将users列的JSON字符串转换为键为邮箱字符串、值为JSON数组的Map结构。 - 拆分Map为行:
UNNEST(map_entries(...))把Map中的每一组键值对拆成单独的行,每行包含一个邮箱(entry.key)和对应的数组(entry.value)。 - 提取数组元素:
json_extract(entry.value, '$[0]')和json_extract(entry.value, '$[1]')分别从JSON数组中取出第一个、第二个元素,再转为DOUBLE类型得到数值列。
简化写法(部分SQL引擎支持)
如果你的SQL引擎(比如Snowflake)支持直接对类型化数组使用索引,可以把Map的值类型指定为ARRAY(DOUBLE),这样就能直接通过索引访问元素:
SELECT entry.key AS splitUsers, entry.value[0] AS firstValue, entry.value[1] AS secondValue FROM tableName, UNNEST(map_entries(CAST(json_parse(users) AS MAP(VARCHAR, ARRAY(DOUBLE))))) AS entry
内容的提问来源于stack exchange,提问作者Orkun Oz
相关产品推荐
相关产品推荐

