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" +
                   ");"
)
相关推荐
城管不管4 小时前
搭建分片集群
大数据·数据库
刘一说5 小时前
Elasticsearch启动失败?5步修复权限问题
大数据·elasticsearch·jenkins
刘一说5 小时前
Elasticsearch安装启动常见问题全解析
大数据·elasticsearch·jenkins
一水鉴天6 小时前
整体设计 之 绪 思维导图引擎 之 引 认知系统 之8 之 序 认知元架构 之4 统筹:范畴/分类/目录/条目 之2 (豆包助手 之6)
大数据·架构·认知科学
计算机编程-吉哥7 小时前
大数据毕业设计-基于大数据的健康饮食推荐数据分析与可视化系统(高分计算机毕业设计选题·定制开发·真正大数据)
大数据·毕业设计·计算机毕业设计选题·机器学习毕业设计·大数据毕业设计·大数据毕业设计选题推荐·大数据毕设项目
Apache Flink7 小时前
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
人工智能·flink·apache
用户7415517014778 小时前
基础语法和数据类型
大数据
武子康8 小时前
大数据-94 Spark核心三剑客:RDD、DataFrame、Dataset与SparkSession全面解析
大数据·后端·spark
蜗牛~turbo8 小时前
金蝶云星空 调价表取历史价格
java·数据库·sql·c#·database
一个儒雅随和的男子8 小时前
Dockerfile构建容器需要注意的事项。
大数据·elasticsearch·搜索引擎