[TOC]
Flink Table & SQL中的用户自定义函数: UDF、UDAF、UDTF。
UDF: 自定义标量函数(User Defined Scalar Function)。一行输入一行输出。
UDAF: 自定义聚合函数。多行输入一行输出。
UDTF: 自定义表函数。一行输入多行输出或一列输入多列输出。
需求分析
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17今日目标:
(1) 会用Flink Java API
(2) 会写Flink SQL 的UDF、UDAF、UDTF
案例:
1. 先把本地flink开发环境弄好(maven + flink 1.10.0)
2. 基于开源flink 写一个Demo
(1) 用Flink Java API 向 Kafka 写事件。事件的业务含义: 某个用户在某个时刻点击或浏览了某个页面。
写到Kafka的数据格式是JSON字符串。
{"uid":"用户ID, 取1-10的随机数", "name": "user_1-10的随机数", "event_time": "北京时间,时间格式为yyyy-MM-dd HH:mm:ss", "event_name":"click/browse", "page": 1-10的随机数 }
如{"uid": "1", "name": "user_2", "event_time": "2021-01-06 11:22:00", "event_name": "click", "page": 5}
(2) 用Flink SQL 消费Kafka数据
(a) 自定义UDF, 每条数据增加一个字段uuid, uuid = uid+时间(event_time)+page
(b) 自定义UDTF, 将每条数据中的event_time, 拆分出日期dt和时间time两个字段
(c) 自定义UDAF, 求每个用户每天点击的总次数
1 | 发送数据: {"d":"2021-01-08 18:09:37","event_name":"click/browse","name":"user_10","page":10,"uid":5} |
Producer
1 | package com.imooc.flink.java.course02; |
Data
1 | package com.imooc.flink.java.course02; |
UDF
1 | package com.imooc.flink.java.course02; |
UDTF
1 | package com.imooc.flink.java.course02; |
UDAF
1 | package com.imooc.flink.java.course02; |