flink-入门功能整合(udf,创建临时表table,使用flink sql)

说明

  • 本次测试用scala,java版本大体都差不多,不再写两个版本了
  • StreamTableEnvironment做了很多调整,目前很多网上的样例使用的都是过时的api,本次代码测试使用的都是官方doc中推荐使用的新api
  • 本次测试代码主要测试了三个基本功能:1.UDF 2.流处理Table的创建以及注册 3.Flink Sql
  • 依赖有很多是多余的,懒得删了

依赖

<dependencies>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-scala_2.12</artifactId>
            <version>1.12.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-java</artifactId>
            <version>1.12.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-scala_2.12</artifactId>
            <version>1.12.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java_2.12</artifactId>
            <version>1.12.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients_2.12</artifactId>
            <version>1.12.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-core</artifactId>
            <version>1.12.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-test-utils-junit</artifactId>
            <version>1.12.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table</artifactId>
            <version>1.12.1</version>
            <type>pom</type>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-common</artifactId>
            <version>1.12.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-api-scala_2.12</artifactId>
            <version>1.12.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-api-java-bridge_2.12</artifactId>
            <version>1.12.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-api-scala-bridge_2.12</artifactId>
            <version>1.12.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-planner_2.12</artifactId>
            <version>1.12.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-planner-blink_2.12</artifactId>
            <version>1.12.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-runtime-blink_2.12</artifactId>
            <version>1.12.1</version>
            <scope>provided</scope>
        </dependency>

    </dependencies>

代码


import org.apache.flink.api.scala._
import org.apache.flink.streaming.api.scala.{DataStream, StreamExecutionEnvironment}
import org.apache.flink.table.api.EnvironmentSettings
import org.apache.flink.table.api.Expressions.$
import org.apache.flink.table.api.bridge.scala.StreamTableEnvironment
import org.apache.flink.table.functions.ScalarFunction

/**
 * word count
 * 1.create and use udf function
 * 2.create tmp table
 * 3.use table sql
 *
 * @author:sssuperMario
 * @date:2021-03-02
 */
object WordCount {
  def main(args: Array[String]): Unit = {
    //create stream runtime environment
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    //with blink planner setting
    val settings = EnvironmentSettings.newInstance().useBlinkPlanner().build()
    //create table environment
    val tableEnv = StreamTableEnvironment.create(env, settings)
    //register udf
    registerUDF(tableEnv)
    //input datasource
    val inputDataStream = env.socketTextStream("localhost", 8888)
    //word count
    val ds: DataStream[(String, Int)] = inputDataStream.filter(_.nonEmpty)
      .flatMap(_.split(" "))
      .map((_, 1))
      .keyBy(_._1)
      .sum(1)
    //register table
    tableEnv.createTemporaryView("wordcount_tmp", ds, $("word"), $("grand_total"))
    //execute sql and print result
    tableEnv.executeSql("select flink_udf_test(word) word,grand_total from wordcount_tmp")
      .print()
    //execute
    env.execute("WordCount")
  }

  /**
   * register udf
   *
   * @param env
   */
  def registerUDF(env: StreamTableEnvironment): Unit = {
    env.createTemporaryFunction("flink_udf_test", new TestUDF)
  }

  /**
   * udf
   */
  class TestUDF extends ScalarFunction {

    def eval(s: String): String = {
      "<" + s + ">"
    }
  }

}

终端启动端口

nc -lk -p 8888

控制台输出

+----+--------------------------------+-------------+
| op |                           word | grand_total |
+----+--------------------------------+-------------+
| +I |                            <a> |           1 |
| +I |                            <d> |           1 |
| +I |                            <a> |           2 |
| +I |                            <d> |           2 |
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值