Flink SQL重复解析JSON致CPU过高,求单次解析复用优化方案
解决Flink 1.16中重复解析JSON导致CPU过高的问题
针对多次调用json_value重复解析同一段JSON导致CPU占用高的问题,Flink 1.16里有两种可行方案实现单次解析复用:
方案一:使用JSON_TABLE函数一次性解析提取字段
JSON_TABLE可以一次性解析JSON字符串并提取所有需要的字段,底层只会执行一次解析操作。改写后的SQL如下:
SELECT t.key1, t.key2, t.key3, t.key4 FROM input_table, LATERAL TABLE(JSON_TABLE( json_str, '$' COLUMNS( key1 STRING PATH '$.key1', key2 STRING PATH '$.key2', key3 STRING PATH '$.key3', key4 STRING PATH '$.key4' ) )) AS t
通过LATERAL TABLE关联JSON_TABLE,一次性从json_str中提取所有目标字段,避免了多次解析开销。
方案二:先解析为JSON对象再提取字段
先用JSON_PARSE将JSON字符串解析成JSON对象,后续字段提取直接基于这个已解析的对象操作,同样只触发一次解析:
WITH parsed_json AS ( SELECT JSON_PARSE(json_str) AS json_obj FROM input_table ) SELECT JSON_VALUE(json_obj, '$.key1') AS key1, JSON_VALUE(json_obj, '$.key2') AS key2, JSON_VALUE(json_obj, '$.key3') AS key3, JSON_VALUE(json_obj, '$.key4') AS key4 FROM parsed_json
CTE里的JSON_PARSE完成单次解析,后续的JSON_VALUE都是对已解析对象的字段读取,不会重复解析原字符串。
这两种方案都能有效降低CPU占用,可根据实际场景选择使用。
内容的提问来源于stack exchange,提问作者xinfa
相关产品推荐
相关产品推荐

