You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flink SQL如何提取嵌套数组值并拼接为指定字符串?

问题原因拆解

你已经用CROSS JOIN UNNEST拆分了properties数组,但用CONCAT(JSON_VALUE(t1.properties,'$.displayName'),';')返回null,核心问题有两个:

  • 聚合逻辑错误:UNNEST会把数组拆成多行数据,CONCAT只能处理单行字段拼接,无法将多行的displayName合并成一个字符串
  • 若JSON_VALUE返回null,也可能是路径匹配问题,但你已经用JSON_STRING验证过数组结构,大概率是前者

正确实现方案

1. 先验证UNNEST后的单条数据

先确认拆分后的每个元素是独立的JSON对象,执行以下SQL排查:

SELECT JSON_STRING(prop) 
FROM your_source_table
CROSS JOIN UNNEST(properties) AS t(prop)

正常应该返回两行结果:

{"displayName":"n1","value":"value1"}
{"displayName":"n2","value":"value2"}

2. 使用STRING_AGG做聚合拼接

要把多行的displayName用分号连接,必须用STRING_AGG聚合函数,完整INSERT语句示例:

INSERT INTO target_table
SELECT 
  -- 替换成你需要插入的其他字段
  id, 
  create_time,
  -- 聚合拼接所有displayName
  STRING_AGG(JSON_VALUE(prop, '$.displayName'), ';') AS combined_names
FROM your_source_table
CROSS JOIN UNNEST(properties) AS t(prop)
-- 必须按原表非聚合字段分组
GROUP BY id, create_time

3. 额外排查点

如果执行后还是有问题,先单独提取displayName确认是否能正常取值:

SELECT JSON_VALUE(prop, '$.displayName') AS name
FROM your_source_table
CROSS JOIN UNNEST(properties) AS t(prop)

如果这一步能返回n1和n2,说明是聚合逻辑的问题,检查GROUP BY的字段是否覆盖了所有非聚合字段即可。

内容的提问来源于stack exchange,提问作者user3017827

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:52:38