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" +
                   ");"
)
相关推荐
一步一个脚印一个坑19 小时前
如何建立精细化运营体系
大数据
2501_9336707920 小时前
2026年中专大数据与会计专业可考取的会计相关证书
大数据
是三好21 小时前
SQL 性能分析及优化
android·数据库·sql
江瀚视野21 小时前
昆仑芯启动港股上市:一枚芯片,如何折射百度全栈AI能力?
大数据·人工智能
CNRio21 小时前
Day 50:Git的高级技巧:使用Git的rebase交互式修改提交历史
大数据·git·elasticsearch
Coder_Boy_1 天前
基于LangChain4j的证券业务系统模块四
大数据·人工智能·spring cloud·langchain
CNRio1 天前
Day 52:Git的高级技巧:使用Git的bisect定位问题提交
大数据·git·elasticsearch
jkyy20141 天前
食材图像识别与个性化饮食:智能家电如何重构膳食健康管理?
大数据·人工智能·物联网·健康医疗
jiaozi_zzq1 天前
2026 高职财务专业就业方向与进阶指南
大数据·数据分析·证书·财务
Hello.Reader1 天前
Table & SQL API 配置从“默认可用”到“针对场景调优”的一套方法论
数据库·python·sql