Flink - Table API UDF --- 用户自定义函数

函数 (Functions)

  • Flink Table API 和 SQL 为用户提供了一组用于数据转换的内置函数

  • SQL中支持的很多函数,Table API和SQL 都已经做了实现

  • 比较函数

    • SQL:
      • value1 = value2
      • value1 > value2
    • Table API
      • ANY1 === ANY2
      • ANY1 > ANY2
  • 逻辑函数

    • SQL:
      • boolean1 OR boolean2
      • boolean IS FALSE
      • NOT boolean
    • Table API
      • BOOLEAN1 || BOOLEAN2
      • BOOLEAN.isFalse
      • IBOOLEAN
  • 算数函数

    • SQL:
      • numeric1 + numeric2
      • POWER(numeric1,numeric2)
    • Table API:
      • NUMERIC1 + NUMERIC2
      • NUMERIC1,pow(NUMERIC2)
  • 字符串函数

    • SQL:
      • string1 || string2
      • UPPER(string)
      • CHAR_LENGTH(string)
    • Table API:
      • STRING1 + STRING2
      • STRING.upperCase()
      • STRING.charLength()
  • 时间函数

    • SQL:
      • DATE string
      • TIMESTAMP string
      • CURRENT_TIME
      • INTERVAL string range
    • Table API:
      • STRING.toDate
      • STRING.toTimestamp
      • currentTime()
      • NUMERIC_days
      • NUMERIC_minutes
  • 聚合函数

    • SQL:
      • COUNT(*)
      • SUM(expression)
      • RANK()
      • ROW_NUMBER()
    • Table API:
      • FIELD.count
      • FIELD.sum()

用户自定义函数(UDF)

  • 用户定义函数(User-defined Functions,UDF)是一个重要的特性,它们是显著地扩展了查询的表达能力
  • 在大多数情况下,用户定义的函数必须先注册,然后才能在查询中使用
  • 函数通过调用registerFunction()方法在TableEnvironment的函数目录中,这样Table API或SQL 解析器就可以识别并正确地解释它

标量函数(Scalar Function)

  • 用户定义的标量函数,可以将0,1或多个标量值,映射到新的标量值

  • 为了定义标量函数,必须在org.apache.flink.table.functions中扩展基类Scalar Function, 并实现(一个或多个)求值(eval)方法

  • 标量函数的行为由求值方法决定,求值的方法必须公开声明为eval

    public static class HashCode extends ScalarFunction{
    	private int factor = 13;
    	public HashCoded(int factor){
    		this.factor = factor;
    	}
    	public int eval(String s){
    		return s.hashCode() * factor;
    	}
    }
    
  • 案例

    public static void main(String[] args) throws Exception {
         
    
            StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    
            env.setParallelism(1);
    
            DataStream<String> fileDataStream = env.readTextFile("data/temps.txt");
    
    
            DataStream<TempInfo> dataStream = fileDataStream.map(new MapFunction<String, TempInfo>() {
         
                @Override
                public TempInfo map(String value) throws Exception {
         
                    String[
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值