FlinkSQL Scala版本的自定义UDF —— 03

我们在处理数据的时候经常会出现一些。常用函数无法满足的函数。
本案例的实践效果是:对传入字段变为url。 如
传入:hao123
返回:http://www.hao123.com

源数据csv文件:

hao123,2,1
baidu,2,1

1、自定义UDF/UDAF/UDTF函数的步骤

1)继承函数ScalarFunction
(2)覆写eval方法
(3)注册函数registerFunction
(4)应用

代码:

import org.apache.flink.api.common.typeinfo.TypeInformation
import org.apache.flink.api.scala.ExecutionEnvironment
import org.apache.flink.table.api.{Table, Types}
import org.apache.flink.table.api.scala.BatchTableEnvironment
import org.apache.flink.table.functions.ScalarFunction
import org.apache.flink.table.sinks.CsvTableSink
import org.apache.flink.table.sources.CsvTableSource

object FlinkUDF {

  def main(args: Array[String]): Unit = {
    //有界 bitch 数据table
    val bEnv: ExecutionEnvironment = ExecutionEnvironment.getExecutionEnvironment
    // create a TableEnvironment for batch queries
    val bTableEnv: BatchTableEnvironment = BatchTableEnvironment.create(bEnv)
    //字段和字段类型
    val fieldNames: Array[String] = Array("a", "b", "c")
    val fieldTypes: Array[TypeInformation[_]] = Array(Types.STRING, Types.LONG, Types.LONG)
    // create a TableSource
    val csvSource = new CsvTableSource("F://abc.csv",fieldNames,fieldTypes,",")

    bTableEnv.registerTableSource("test", csvSource)
	//注册函数
    bTableEnv.registerFunction("SimpleUDF",new SimpleUDF(".com"))//.cn
    // Create a Table from a SQL query
    val sql:String = "SELECT SimpleUDF(a) as a,b  FROM test"
    val sqlResult: Table = bTableEnv.sqlQuery(sql)
    // create a TableSink
    val sink = new CsvTableSink("F:/tmp/","|")
    bTableEnv.registerTableSink("SinkTest", Array("x","y"), Array(Types.STRING,Types.LONG), sink)
    //sink table
    sqlResult.insertInto("SinkTest")
    // execute
    bEnv.execute()
  }

  //UDF  拼接字符串  http://xxx.com 或者cn
 class SimpleUDF() extends ScalarFunction {

    private  var address:String =_

    def  this(s: String){
      this()
      address = s
    }
    //重写方法
    def eval(s: String): String = {
      "http://www." + s + address
    }
  }
}

sink文件会输出四个文件:
FlinkSQL Scala版本的自定义UDF —— 03_第1张图片FlinkSQL Scala版本的自定义UDF —— 03_第2张图片
这是一个简单的自定义UDF函数,可以根据这个简单的版本举一反三。

感谢你的阅读。如有不对之处,还望指正。

你可能感兴趣的:(Flink)