当前位置:   article > 正文

Flink SQL 使用UDF函数实现将多行值转为数组_flink udf返回array

flink udf返回array

1、背景

在使用Flink SQL同步数据的实际场景中,会碰到需要将多行数据转为数组的情况。
以MySQL同步ES为例,假如我们需要把每个学生的选修课程用数组格式存到ES。

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

需要得到以下结果:

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

2、问题

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

函数名返回类型
COLLECTMULTISET
LISTAGGSTRING
JSON_ARRAYAGGSTRING

2.2 类型转换也都没有成功

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

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

1. 自定义UDF

import org.apache.flink.table.functions.ScalarFunction;

public class Split extends ScalarFunction {

    public String[] eval(String str, String regex) {
        return str.split(regex);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.使用方法


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" +
                   ");"
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/533457
推荐阅读
相关标签
  

闽ICP备14008679号