SQL 方言通

首页 / JSON

JSON_TUPLE 一次取出多个 JSON 字段

JSON_TUPLE 一次从 JSON 字符串中取出多个键,比多次调用 GET_JSON_OBJECT 更省解析开销。MaxCompute、Hive 和 Spark 支持;Hologres、StarRocks、Doris 和 Flink SQL 没有这个函数,需要按键逐个提取。

各引擎写法 · 迁移注意事项 · 示例

各引擎写法

引擎支持写法说明依据
MaxCompute支持JSON_TUPLE(json, key1, key2, ...)返回值都是 STRING,key 支持用 ['...'] 表示带特殊字符的键,也支持多层路径。官方文档
Hologres需改写GET_JSON_OBJECT(json, '$.key')没有 JSON_TUPLE,可以按键多次调用 hive_compatible 扩展中的 GET_JSON_OBJECT。官方文档
StarRocks需改写get_json_string(json_str, '$.key')没有 JSON_TUPLE,按键多次调用 get_json_string,它的别名是 get_json_object。官方文档
Doris需改写GET_JSON_STRING(json_str, '$.key')没有 JSON_TUPLE。GET_JSON_STRING 是 JSON_EXTRACT_STRING 的别名。官方文档
Hive支持json_tuple(jsonStr, k1, k2, ...)Hive 0.7 起提供,是表生成函数,通常配合 LATERAL VIEW 使用。官方文档
Spark SQL支持json_tuple(jsonStr, p1, p2, ..., pn)所有参数和输出列都是字符串。官方文档
Flink SQL需改写JSON_VALUE(json, '$.key')没有 JSON_TUPLE,按键多次调用 JSON_VALUE。官方文档

迁移注意事项

示例

从埋点 JSON 中取事件 ID 和事件名

MaxCompute
SELECT JSON_TUPLE(event_json, 'event_id', 'event_name') AS (event_id, event_name) FROM events;
Hologres
SELECT GET_JSON_OBJECT(event_json, '$.event_id') AS event_id, GET_JSON_OBJECT(event_json, '$.event_name') AS event_name FROM events;
StarRocks
SELECT get_json_string(event_json, '$.event_id') AS event_id, get_json_string(event_json, '$.event_name') AS event_name FROM events;
Doris
SELECT GET_JSON_STRING(event_json, '$.event_id') AS event_id, GET_JSON_STRING(event_json, '$.event_name') AS event_name FROM events;
Hive
SELECT t.event_id, t.event_name FROM events LATERAL VIEW json_tuple(event_json, 'event_id', 'event_name') t AS event_id, event_name;
Spark SQL
SELECT json_tuple(event_json, 'event_id', 'event_name') AS (event_id, event_name) FROM events;
Flink SQL
SELECT JSON_VALUE(event_json, '$.event_id') AS event_id, JSON_VALUE(event_json, '$.event_name') AS event_name FROM events;

同类函数

JSON:全部引擎写法对照

核对日期: · 提交勘误