我们在处理数据的时候经常会出现一些。常用函数无法满足的函数。
本案例的实践效果是:对传入字段变为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文件会输出四个文件:
这是一个简单的自定义UDF函数,可以根据这个简单的版本举一反三。
感谢你的阅读。如有不对之处,还望指正。