零基础学Flink:UDF,2024年最新得物技术面试

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

import org.apache.flink.api.scala.ExecutionEnvironment

import org.apache.flink.api.scala.typeutils.Types

import org.apache.flink.table.api.TableEnvironment

import org.apache.flink.table.sources.CsvTableSource

import org.apache.flink.types.Row

import org.apache.flink.api.scala._

object TestScalarFunction {

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

val filePath = “E:\\devlop\\workspace\\streaming1\\src\\main\\resources\\testdata.csv”

val env = ExecutionEnvironment.getExecutionEnvironment

val tableEnv = TableEnvironment.getTableEnvironment(env)

val csvtable = CsvTableSource

.builder

.path(filePath)

.ignoreFirstLine

.fieldDelimiter(“,”)

.field(“rank”, Types.INT)

.field(“player”, Types.STRING)

.field(“club”, Types.STRING)

.field(“matches”, Types.INT)

.field(“red_card”, Types.INT)

.field(“total_score”, Types.INT)

.field(“total_score_home”, Types.INT)

.field(“total_score_visit”, Types.INT)

.field(“pass”, Types.INT)

.field(“shot”, Types.INT)

.build

tableEnv.registerTableSource(“goals”, csvtable)

tableEnv.registerFunction(“ts”,new TotalScores(2))

val tableTest = tableEnv.sqlQuery(“select player,total_score_home,total_score_visit,ts(total_score_home,total_score_visit) from goals where total_score > 10”)//.scan(“test”).where(“id=‘5’”).select(“id,sources,targets”)

tableEnv.toDataSet[Row](tableTest).print()

}

}

首先别忘记引用

import org.apache.flink.api.scala._

否则会有奇怪事情发生。

然后,注册函数,默认构造客场进球权重为2

tableEnv.registerFunction(“ts”,new TotalScores(2))

“select player,total_score_home,total_score_visit,ts(total_score_home,total_score_visit) from goals where total_score > 10”

在SQL中使用函数 ts(total_score_home,total_score_visit) 就这么简单

我们来看下输出:

C-罗纳尔多,5,7,19

夸利亚雷拉,5,5,15

萨帕塔,1,4,9

米利克,0,1,2

皮亚特克,2,0,2

因莫比莱,3,3,9

卡普托,2,4,10

表函数(TableFunction)

简单的说,表函数,就是你输入几个数(0个或几个都行),经过一系列的处理,再返回给你行数,返回的行可以包含一列或是多列值。这里我们使用一套新的数据案例来做一个说明。

假设这是某年四个直辖市四个季度GDP的一张透视表(说到透视表,想了解的同学可以异步到我之前的 文章 去看看)

provice,s1,s2,s3,s4

天津,10,11,13,14

北京,13,16,17,18

重庆,14,12,13,14

上海,15,11,15,17

我们来将这张透视表,还原成一张列表,接下来,我们来看代码

import org.apache.flink.table.functions.TableFunction

class UnPivotFunction(separator: String) extends TableFunction[(String)] {

@scala.annotation.varargs

def eval(strs:String*): Unit = {

strs.foreach(x=>collect(x))

}

}

函数要继承TableFunction,后面泛型需要输入返回列的类型,这里为了方便,我们就使用了字符串。我们计划在查询里面把四个季度的值都输入进来,转换成列表。collect是TableFunction提供的函数,用于添加列,eval方法的参数,可以根据你的需要自行扩展,注意在使用不确定参数值的时候,加上注解@scala.annotation.varargs

接下来,我们来测试一下

import org.apache.flink.api.common.typeinfo.Types

import org.apache.flink.api.scala.{ExecutionEnvironment, _}

import org.apache.flink.table.api.TableEnvironment

import org.apache.flink.table.sources.CsvTableSource

import org.apache.flink.types.Row

import wang.datahub.udf.UnPivotFunction

object TestMyTableFunction2 {

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

val filepath = “E:\\devlop\\workspace\\testsbtflink\\src\\main\\resources\\GDP.csv”

val env = ExecutionEnvironment.getExecutionEnvironment

val tableEnv = TableEnvironment.getTableEnvironment(env)

tableEnv.registerFunction(“mtf2”, new UnPivotFunction(“@”))

val cts = CsvTableSource.builder().ignoreFirstLine()

//provice,s1,s2,s3,s4

.field(“provice”,Types.STRING)

.field(“s1”,Types.STRING)

.field(“s2”,Types.STRING)

.field(“s3”,Types.STRING)

.field(“s4”,Types.STRING)

.path(filepath)

.build()

tableEnv.registerTableSource(“m”,cts)

val tableTest = tableEnv.sqlQuery(“select provice,word from m , LATERAL TABLE(mtf2(s1,s2,s3,s4)) as T(word)”)

val stream = tableEnv.toDataSet[Row](tableTest)

stream.print()

}

}

在SQL我使用了 JOIN LATERAL ,有兴趣了解的同学,可以看下云栖的文章,我放在参考文档里了。

我们来看下输出结果:

天津,10

天津,11

天津,13

天津,14

北京,13

北京,16

北京,17

北京,18

上海,15

上海,11

上海,15

上海,17

重庆,14

重庆,12

重庆,13

重庆,14

这个案例也许并不是那么恰当,其实,也可以利用到邮件切分等场景,这里算是抛砖引玉把。

聚合函数(AggregateFunction)

关于聚合函数,官方文档上的这张图,就充分的解释了其工作原理,主要计算通过

  • createAccumulator()

  • accumulate()

  • getValue()

这几个方法来完成,首先我们createAccumulator创建累加器,然后调用accumulate累加计算,最后getValue获取值。

640?wx_fmt=png

当然这只是完成了初步工作,

  • retract()

  • merge()

  • resetAccumulator()

我们还需要回滚,合并,重置累加器等操作以适应不同的计算场景。

好了,我们的案例,再次来到了大家喜闻乐见的意甲联赛,这次我们统计俱乐部的进球数,还是使用了一个更靠谱的规则,就是给客场进球加了一个权重,然后来计算加权场均进球数

先来创建累加器

class WeightedAvgAccum {

var sum = 0

var count = 0

}

然后创建计算函数

总结

本文从基础到高级再到实战,由浅入深,把MySQL讲的清清楚楚,明明白白,这应该是我目前为止看到过最好的有关MySQL的学习笔记了,我相信如果你把这份笔记认真看完后,无论是工作中碰到的问题还是被面试官问到的问题都能迎刃而解!

MySQL50道高频面试题整理:

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

class WeightedAvgAccum {

var sum = 0

var count = 0

}

然后创建计算函数

总结

本文从基础到高级再到实战,由浅入深,把MySQL讲的清清楚楚,明明白白,这应该是我目前为止看到过最好的有关MySQL的学习笔记了,我相信如果你把这份笔记认真看完后,无论是工作中碰到的问题还是被面试官问到的问题都能迎刃而解!

MySQL50道高频面试题整理:

[外链图片转存中…(img-B5WkkqDS-1713555934616)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-Uz8KRxzU-1713555934617)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 21
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值