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" +
                   ");"
)
相关推荐
测试运维日常笔记3 分钟前
SQL 快速学习笔记:1~2 小时掌握面试重点
笔记·sql·学习
人工智能培训18 分钟前
边缘AI与大模型轻量化:让智能跑进每一个终端
大数据·人工智能·算法·重构·生活
产业家23 分钟前
当数据走向理解,如何重构一个企业级 AI 数据平台?
大数据·人工智能
Hotchip_MEMS26 分钟前
从触发吸气道智能感知:MEMS硅麦埋下雾化器智能化伏笔
大数据·人工智能·笔记·电脑·制造
北京君诺正信知识产权39 分钟前
商标变更、转让、续展怎么办理?官方规则整理好了
大数据
字节跳动数据平台41 分钟前
水印字幕无痕擦除!电商、短剧素材处理告别“贴膏药”
大数据
泡海椒43 分钟前
JQuick-SQL CASE WHEN 与函数:在查询中构建业务字段
数据库·sql
清华kenny44 分钟前
中医生活化智能终端对比:晓得养在合肥周边的服务优势
大数据·人工智能·安徽晓得养
汉知宝科技1 小时前
商标管理软件选型指南:四类平台定位与功能覆盖横向对比
大数据
Sayai1 小时前
Kafka 磁盘空间治理实战:retention 保留策略、log.dirs 在线扩容、分区跨盘迁移与不停机整体换盘
大数据·运维·分布式·kafka·消息队列