前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(8)FlinkSQL自定义UDF

(8)FlinkSQL自定义UDF

原创
作者头像
NBI大数据
发布2022-08-08 11:21:34
4220
发布2022-08-08 11:21:34
举报

Flink提供了自定义函数的基础能力,在需要满足特殊业务场景需求时,根据自身需要按需定制自己的UDF 下面将简单演示一个UDF的定义和UDF的使用过程:

(1)定义一个UDF

代码语言:javascript
复制
package com.udf;

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

/**
 * Created by lj on 2022-07-25.
 */
public class TestUDF extends ScalarFunction {
    public String eval(String value) {
        return value + "_udf";
    }
}

(2)使用UDF

代码语言:javascript
复制
    public static void main(String[] args) throws Exception {

        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
        DataStreamSource<String> streamSource = env.socketTextStream("127.0.0.1", 9999,"\n");
        SingleOutputStreamOperator<WaterSensor> waterDS = streamSource.map(new MapFunction<String, WaterSensor>() {
            @Override
            public WaterSensor map(String s) throws Exception {
                String[] split = s.split(",");
                return new WaterSensor(split[0], Long.parseLong(split[1]), Integer.parseInt(split[2]));
            }
        });

        // 将流转化为表
        Table table = tableEnv.fromDataStream(waterDS,
                $("id"),
                $("ts"),
                $("vc"),
                $("pt").proctime());

        tableEnv.createTemporaryView("EventTable", table);

/*
        // 1. 直接调用自定义udf 函数
        //        table.select(call(myFunction.class,$("id"))).execute().print();
        // 2. 先注册在使用
        tableEnv.createTemporarySystemFunction("MyLength",myFunction.class);
        //2.1 在使用注册的自定义函数 名称为MyLength
        //        table.select(call("MyLength",$("id"))).execute().print();
        // 2.2 采用sql 的方式进行使用自定义函数
            tableEnv.sqlQuery("select id, MyLength(id) from "+table).execute().print();
* */

        tableEnv.createTemporarySystemFunction("MyLength",TestUDF.class);
        Table result = tableEnv.sqlQuery(
                "SELECT " +
                        "id as componentname, " +                //window_start, window_end,
                        "COUNT(ts) as componentcount ,SUM(ts) as componentsum, " +
                        "MyLength(cast(COUNT(ts) as string)) as testudf " +
                        "FROM TABLE( " +
                        "TUMBLE( TABLE EventTable , " +
                        "DESCRIPTOR(pt), " +
                        "INTERVAL '10' SECOND)) " +
                        "GROUP BY id , window_start, window_end"
        );

        tableEnv.toRetractStream(result, Row.class).print("toRetractStream");       //缩进模式

        env.execute();
    }

(3)应用效果

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
大数据处理套件 TBDS
腾讯大数据处理套件(Tencent Big Data Suite,TBDS)依托腾讯多年海量数据处理经验,基于云原生技术和泛 Hadoop 生态开源技术提供的可靠、安全、易用的大数据处理平台。 TBDS可在公有云、私有云、非云化环境,根据不同数据处理需求组合合适的存算分析组件,包括 Hive、Spark、HBase、Flink、Presto、Iceberg、Elasticsearch、StarRocks 等,以快速构建企业级数据湖仓。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档