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" +
                   ");"
)
相关推荐
Mr_Xuhhh12 小时前
MySQL函数详解:日期、字符串、数学及其他常用函数
java·数据库·sql
那就学有所成吧(˵¯͒¯͒˵)14 小时前
大数据项目(一):Hadoop 云网盘管理系统开发实践
大数据·hadoop·分布式
KKKlucifer15 小时前
数据资产地图构建:文档安全可视化与主动防御
大数据·安全
2501_9436953316 小时前
高职工业大数据应用专业,怎么找智能制造企业的数据岗?
大数据·信息可视化·制造
得赢科技16 小时前
智能菜谱研发公司推荐 适配中小型餐饮
大数据·运维·人工智能
Hello.Reader17 小时前
Flink 内存与资源调优从 Process Memory 到 Fine-Grained Resource Management
大数据·flink
有代理ip18 小时前
成功请求的密码:HTTP 2 开头响应码深度解析
java·大数据·python·算法·php
jl486382118 小时前
打造医疗设备的“可靠视窗”:医用控温仪专用屏从抗菌设计到EMC兼容的全链路解析
大数据·运维·人工智能·物联网·人机交互
司沐_Simuoss18 小时前
Text to SQL系统的千层套路~
数据库·人工智能·sql·语言模型·系统架构
刺客xs18 小时前
git 入门常用命令
大数据·git·elasticsearch