首页 / 数组和 Map
STR_TO_MAP 字符串转 Map
STR_TO_MAP 用两个分隔符把字符串拆成键值对,返回 Map。除 Hologres 外都同名可用,但默认的键值分隔符不同:MaxCompute 和 Flink 默认是等号,StarRocks、Doris、Hive 和 Spark 默认是冒号。迁移时建议把两个分隔符都写明。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | STR_TO_MAP([mapDupKeyPolicy,] text[, delimiter1[, delimiter2]]) | delimiter1 默认是逗号,delimiter2 默认是等号。分隔符是冒号、句点、问号、加号、星号等特殊字符时要用两个反斜杠转义。可以用 mapDupKeyPolicy 指定重复键是报错还是后者覆盖。 | 官方文档 |
| Hologres | 不支持 | — | 字符串函数中没有 STR_TO_MAP。 | 官方文档 |
| StarRocks | 支持 | str_to_map(content[, delimiter[, map_delimiter]]) | 3.1 起提供。delimiter 默认是逗号,map_delimiter 默认是冒号。任一参数为 NULL 时返回 NULL。 | 官方文档 |
| Doris | 支持 | STR_TO_MAP(str[, pair_delimiter[, key_value_delimiter]]) | 3.0.6 起提供。键值对分隔符默认是逗号,键和值的分隔符默认是冒号。 | 官方文档 |
| Hive | 支持 | str_to_map(text[, delimiter1, delimiter2]) | delimiter1 默认是逗号,delimiter2 默认是冒号。 | 官方文档 |
| Spark SQL | 支持 | str_to_map(text[, pairDelim[, keyValueDelim]]) | Spark 2.0.1 起提供。默认分隔符是逗号和冒号,两个分隔符都按正则表达式处理。 | 官方文档 |
| Flink SQL | 支持 | STR_TO_MAP(string1[, string2, string3]) | 键值对分隔符默认是逗号,键和值的分隔符默认是等号。两个分隔符都按正则表达式处理,特殊字符需要转义。 | 官方文档 |
迁移注意事项
- 默认的键值分隔符不同:MaxCompute 和 Flink 是等号,StarRocks、Doris、Hive 和 Spark 是冒号。省略分隔符的写法迁移后会解析出错误结果,而且不会报错。
- Spark、Flink 把分隔符当作正则表达式,MaxCompute 也要求对句点、问号等特殊字符转义。分隔符是 | 或 . 时,迁移前后都要检查转义写法。
- Hologres 没有 STR_TO_MAP。可以先用 REGEXP_SPLIT_TO_ARRAY 拆分,再按需取值,或者在入库前把数据转成 JSON。
- 重复键的处理不同。MaxCompute 可以用 mapDupKeyPolicy 指定报错或后者覆盖,其他引擎文档没有说明,迁移前建议实测。
示例
解析 k1=v1&k2=v2 形式的参数
SELECT STR_TO_MAP(params, '&', '=') AS kv FROM access_log;SELECT str_to_map(params, '&', '=') AS kv FROM access_log;SELECT STR_TO_MAP(params, '&', '=') AS kv FROM access_log;SELECT str_to_map(params, '&', '=') AS kv FROM access_log;SELECT str_to_map(params, '&', '=') AS kv FROM access_log;SELECT STR_TO_MAP(params, '&', '=') AS kv FROM access_log;