Flink SQL 使用UDF函数实现将多行值转为数组

1、背景

在使用Flink SQL同步数据的实际场景中,会碰到需要将多行数据转为数组的情况。

以MySQL同步ES为例,假如我们需要把每个学生的选修课程用数组格式存到ES。

name course
苏苏 语文
苏苏 数学
苏苏 英语
橙橙 政治
橙橙 物理
橙橙 计算机

需要得到以下结果:

name course_arr
苏苏 [语文, 数学,英语]
橙橙 [政治, 物理, 计算机]

2、问题

2.1 试过一些可能可以使用的聚合函数都不满足条件。

函数名 返回类型
COLLECT MULTISET
LISTAGG STRING
JSON_ARRAYAGG STRING

2.2 类型转换也都没有成功

3、解决方案 - 编写UDF函数实现

先使用自带的LISTAGG聚合函数将多行聚合成字符串,然后自己编写UDF将字符串切割成数组

1. 自定义UDF

java 复制代码
import org.apache.flink.table.functions.ScalarFunction;

public class Split extends ScalarFunction {

    public String[] eval(String str, String regex) {
        return str.split(regex);
    }
}

2.使用方法

java 复制代码
StreamTableEnvironment tEnv = StreamTableEnvironment.create(env);
// 注册函数
tEnv.createTemporarySystemFunction("SPLIT", Split.class);

// 使用函数
tEnv.executeSql(
                   "SELECT name, " +
                   "SPLIT(course, ',') AS course_arr " +
                   "FROM (" +
                   "    SELECT " +
                   "        name," +
                   "        LISTAGG(course)  AS course " +
                   "    FROM student " +
                   "    GROUP BY name" +
                   ");"
)
相关推荐
Elastic 中国社区官方博客16 小时前
Elasticsearch:快速近似 ES|QL - 第一部分
大数据·运维·数据库·elasticsearch·搜索引擎·全文检索
龙腾AI白云18 小时前
大模型在天文科研中的应用:天体数据分析
大数据·flask·逻辑回归·pygame
快乐非自愿19 小时前
抛弃传统AI:OpenClaw与Skill重构AI生产力,技术范式不可逆
大数据·人工智能
网络研究员19 小时前
Claude身份认证后还是被封?三条稳定防封策略
大数据·人工智能
TuCoder19 小时前
2026年了,景区制作智慧导地图有哪些选择?
大数据
2601_9499251819 小时前
基于 OpenClaw 打造货代行业 AI 智能体架构实战
大数据·人工智能·架构·ai智能体
zhengyquan20 小时前
7000mAh 电池 + 独立 AI 键,小米 18 Pro 是堆料还是突破?
大数据·人工智能
geneculture20 小时前
意识的多学科定义:从16个视域,到融智学统合——基于“意+识”框架且区分“意识≠心智”系统研究
大数据·人工智能·融智学的重要应用·哲学与科学统一性·融智时代(杂志)·意识=意+识·智=信息处理+选择用意
Ai1731639157920 小时前
GB200 NVL72超节点深度解析:架构、生态与产业格局
大数据·服务器·人工智能·神经网络·机器学习·计算机视觉·架构
观远数据20 小时前
跨部门BI推广权限治理指南:如何避免数据泄露与权责混乱
大数据·人工智能·数据分析