Flink-函数 | 用户自定义函数(UDF)标量函数 | 表函数 | 聚合函数 | 表聚合函数

这篇博客深入探讨了Apache Flink中的用户自定义函数,包括UDF(用户定义函数)、标量函数、表函数、聚合函数和表聚合函数的使用和实现方式。通过实例介绍了如何扩展Flink的功能,以满足特定的查询需求。
摘要由CSDN通过智能技术生成

GitHub

https://github.com/SmallScorpion/flink-tutorial.git

函数(Functions)

在这里插入图片描述
在这里插入图片描述

用户自定义函数(UDF)

  1. 用户定义函数(User-defined Functions,UDF)是一个重要的特性,它们显著地扩展了查询的表达能力,一些系统内置函数无法解决的需求,我们可以用UDF来自定义实现。
  2. 在大多数情况下,用户定义的函数必须先注册,然后才能在查询中使用
  3. 函数通过调用 registerFunction()方法在 TableEnvironment 中注册。当用户定义的函数被注册时,它被插入到 TableEnvironment 的函数目录中,这样Table API 或 SQL 解析器就可以识别并正确地解释它

标量函数(Scalar Functions)

  1. 用户定义的标量函数,可以将0、1或多个标量值,映射到新的标量值
  2. 为了定义标量函数,必须在 org.apache.flink.table.functions 中扩展基类Scalar Function,并实现(一个或多个)求值(eval)方法
  3. 标量函数的行为由求值方法决定,求值方法必须公开声明并命名为 eval
import java.sql.Timestamp

import com.atguigu.bean.SensorReading
import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time.Time
import org.apache.flink.table.api.Table
import org.apache.flink.table.api.scala._
import org.apache.flink.table.functions.ScalarFunction
import org.apache.flink.types.Row

object ScalarFunctionTest {
   
  def main(args: Array[String]): Unit = {
   

    val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
    env.setParallelism(1)

    // 开启事件时间语义
    env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)

    // 创建表环境
    val tableEnv: StreamTableEnvironment = StreamTableEnvironment.create(env)

    val inputDStream: DataStream[String] = env.readTextFile("D:\\MyWork\\WorkSpaceIDEA\\flink-tutorial\\src\\main\\resources\\SensorReading.txt")

    val dataDStream: DataStream[SensorReading] = inputDStream.map(
      data => {
   
        val dataArray: Array[String] = data.split(",")
        SensorReading(dataArray(0), dataArray(1).toLong, dataArray(2).toDouble)
      })
      .assignTimestampsAndWatermarks( new BoundedOutOfOrdernessTimestampExtractor[SensorReading]
      ( Time.seconds(1) ) {
   
        override def extractTimestamp(element: SensorReading): Long = element.timestamp * 1000L
      } )

    // 用proctime定义处理时间
    val dataTable: Table = tableEnv
      .fromDataStream(dataDStream, 'id, 'temperature, 'timestamp.rowtime as 'ts)

    // 使用自定义的hash函数,求id的哈希值
    val myHashCode = MyHashCode(1.23)

    // 查询 Table API 方式
    val resultTable: Table = dataTable
      .select('id, 'ts, myHashCode('id)) // 查询id和temperature字段


    // SQL调用方式,首先要注册表
    tableEnv.createTemporaryView("dataTable", dataTable)
    // 注册函数
    tableEnv.registerFunction("myHashCode", myHashCode)

    val resultSqlTable: Table = tableEnv.sqlQuery(
      """
        |select id, ts, myHashCode(id)
        |from dataTable
        |""".stripMargin)


    // 测试输出
    resultTable.toAppendStream[ Row ].print( "scalar" )
    resultSqlTable.toAppendStream[ Row ]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值