flink 自定义 窗口_《从0到1学习Flink》—— Flink Data transformation(转换)
前言
在第一篇介紹 Flink 的文章 《《從0到1學(xué)習(xí)Flink》—— Apache Flink 介紹》 中就說(shuō)過(guò) Flink 程序的結(jié)構(gòu)
Flink 應(yīng)用程序結(jié)構(gòu)就是如上圖所示:
1、Source: 數(shù)據(jù)源,Flink 在流處理和批處理上的 source 大概有 4 類:基于本地集合的 source、基于文件的 source、基于網(wǎng)絡(luò)套接字的 source、自定義的 source。自定義的 source 常見(jiàn)的有 Apache kafka、Amazon Kinesis Streams、RabbitMQ、Twitter Streaming API、Apache NiFi 等,當(dāng)然你也可以定義自己的 source。
2、Transformation:數(shù)據(jù)轉(zhuǎn)換的各種操作,有 Map / FlatMap / Filter / KeyBy / Reduce / Fold / Aggregations / Window / WindowAll / Union / Window join / Split / Select / Project 等,操作很多,可以將數(shù)據(jù)轉(zhuǎn)換計(jì)算成你想要的數(shù)據(jù)。
3、Sink:接收器,Flink 將轉(zhuǎn)換計(jì)算后的數(shù)據(jù)發(fā)送的地點(diǎn) ,你可能需要存儲(chǔ)下來(lái),Flink 常見(jiàn)的 Sink 大概有如下幾類:寫入文件、打印出來(lái)、寫入 socket 、自定義的 sink 。自定義的 sink 常見(jiàn)的有 Apache kafka、RabbitMQ、MySQL、ElasticSearch、Apache Cassandra、Hadoop FileSystem 等,同理你也可以定義自己的 Sink。
在上四篇文章介紹了 Source 和 Sink:
1、《從0到1學(xué)習(xí)Flink》—— Data Source 介紹
2、《從0到1學(xué)習(xí)Flink》—— 如何自定義 Data Source ?
3、《從0到1學(xué)習(xí)Flink》—— Data Sink 介紹
4、《從0到1學(xué)習(xí)Flink》—— 如何自定義 Data Sink ?
那么這篇文章我們就來(lái)看下 Flink Data Transformation 吧,數(shù)據(jù)轉(zhuǎn)換操作還是蠻多的,需要好好講講!
Transformation
Map
這是最簡(jiǎn)單的轉(zhuǎn)換之一,其中輸入是一個(gè)數(shù)據(jù)流,輸出的也是一個(gè)數(shù)據(jù)流:
還是拿上一篇文章的案例來(lái)將數(shù)據(jù)進(jìn)行 map 轉(zhuǎn)換操作:
SingleOutputStreamOperator將每個(gè)人的年齡都增加 5 歲,其他不變。
FlatMap
FlatMap 采用一條記錄并輸出零個(gè),一個(gè)或多個(gè)記錄。
SingleOutputStreamOperator這里將 id 為偶數(shù)的聚集出來(lái)。
Filter
Filter 函數(shù)根據(jù)條件判斷出結(jié)果。
SingleOutputStreamOperator這里將 id 大于 95 的過(guò)濾出來(lái),然后打印出來(lái)。
KeyBy
KeyBy 在邏輯上是基于 key 對(duì)流進(jìn)行分區(qū)。在內(nèi)部,它使用 hash 函數(shù)對(duì)流進(jìn)行分區(qū)。它返回 KeyedDataStream 數(shù)據(jù)流。
KeyedStream上面對(duì) student 的 age 做 KeyBy 操作分區(qū)
Reduce
Reduce 返回單個(gè)的結(jié)果值,并且 reduce 操作每處理一個(gè)元素總是創(chuàng)建一個(gè)新值。常用的方法有 average, sum, min, max, count,使用 reduce 方法都可實(shí)現(xiàn)。
SingleOutputStreamOperator上面先將數(shù)據(jù)流進(jìn)行 keyby 操作,因?yàn)閳?zhí)行 reduce 操作只能是 KeyedStream,然后將 student 對(duì)象的 age 做了一個(gè)求平均值的操作。
Fold
Fold 通過(guò)將最后一個(gè)文件夾流與當(dāng)前記錄組合來(lái)推出 KeyedStream。 它會(huì)發(fā)回?cái)?shù)據(jù)流。
KeyedStreamAggregations
DataStream API 支持各種聚合,例如 min,max,sum 等。 這些函數(shù)可以應(yīng)用于 KeyedStream 以獲得 Aggregations 聚合。
KeyedStreammax 和 maxBy 之間的區(qū)別在于 max 返回流中的最大值,但 maxBy 返回具有最大值的鍵, min 和 minBy 同理。
Window
Window 函數(shù)允許按時(shí)間或其他條件對(duì)現(xiàn)有 KeyedStream 進(jìn)行分組。 以下是以 10 秒的時(shí)間窗口聚合:
inputStreamFlink 定義數(shù)據(jù)片段以便(可能)處理無(wú)限數(shù)據(jù)流。 這些切片稱為窗口。 此切片有助于通過(guò)應(yīng)用轉(zhuǎn)換處理數(shù)據(jù)塊。 要對(duì)流進(jìn)行窗口化,我們需要分配一個(gè)可以進(jìn)行分發(fā)的鍵和一個(gè)描述要對(duì)窗口化流執(zhí)行哪些轉(zhuǎn)換的函數(shù)
要將流切片到窗口,我們可以使用 Flink 自帶的窗口分配器。 我們有選項(xiàng),如 tumbling windows, sliding windows, global 和 session windows。 Flink 還允許您通過(guò)擴(kuò)展 WindowAssginer 類來(lái)編寫自定義窗口分配器。 這里先預(yù)留下篇文章來(lái)講解這些不同的 windows 是如何工作的。
WindowAll
windowAll 函數(shù)允許對(duì)常規(guī)數(shù)據(jù)流進(jìn)行分組。 通常,這是非并行數(shù)據(jù)轉(zhuǎn)換,因?yàn)樗诜欠謪^(qū)數(shù)據(jù)流上運(yùn)行。
與常規(guī)數(shù)據(jù)流功能類似,我們也有窗口數(shù)據(jù)流功能。 唯一的區(qū)別是它們處理窗口數(shù)據(jù)流。 所以窗口縮小就像 Reduce 函數(shù)一樣,Window fold 就像 Fold 函數(shù)一樣,并且還有聚合。
inputStreamUnion
Union 函數(shù)將兩個(gè)或多個(gè)數(shù)據(jù)流結(jié)合在一起。 這樣就可以并行地組合數(shù)據(jù)流。 如果我們將一個(gè)流與自身組合,那么它會(huì)輸出每個(gè)記錄兩次。
inputStreamWindow join
我們可以通過(guò)一些 key 將同一個(gè) window 的兩個(gè)數(shù)據(jù)流 join 起來(lái)。
inputStream以上示例是在 5 秒的窗口中連接兩個(gè)流,其中第一個(gè)流的第一個(gè)屬性的連接條件等于另一個(gè)流的第二個(gè)屬性。
Split
此功能根據(jù)條件將流拆分為兩個(gè)或多個(gè)流。 當(dāng)您獲得混合流并且您可能希望單獨(dú)處理每個(gè)數(shù)據(jù)流時(shí),可以使用此方法。
SplitStreamSelect
此功能允許您從拆分流中選擇特定流。
SplitStreamProject
Project 函數(shù)允許您從事件流中選擇屬性子集,并僅將所選元素發(fā)送到下一個(gè)處理流。
DataStream上述函數(shù)從給定記錄中選擇屬性號(hào) 2 和 3。 以下是示例輸入和輸出記錄:
(最后
本文主要介紹了 Flink Data 的常用轉(zhuǎn)換方式:Map、FlatMap、Filter、KeyBy、Reduce、Fold、Aggregations、Window、WindowAll、Union、Window Join、Split、Select、Project 等。并用了點(diǎn)簡(jiǎn)單的 demo 介紹了如何使用,具體在項(xiàng)目中該如何將數(shù)據(jù)流轉(zhuǎn)換成我們想要的格式,還需要根據(jù)實(shí)際情況對(duì)待。
關(guān)注我
轉(zhuǎn)載請(qǐng)務(wù)必注明原創(chuàng)地址為:http://www.54tianzhisheng.cn/2018/11/04/Flink-Data-transformation/
微信公眾號(hào):zhisheng
另外我自己整理了些 Flink 的學(xué)習(xí)資料,目前已經(jīng)全部放到微信公眾號(hào)了。你可以加我的微信:zhisheng_tian,然后回復(fù)關(guān)鍵字:Flink 即可無(wú)條件獲取到。
更多私密資料請(qǐng)加入知識(shí)星球!
Github 代碼倉(cāng)庫(kù)
https://github.com/zhisheng17/flink-learning/
以后這個(gè)項(xiàng)目的所有代碼都將放在這個(gè)倉(cāng)庫(kù)里,包含了自己學(xué)習(xí) flink 的一些 demo 和博客
相關(guān)文章
1、《從0到1學(xué)習(xí)Flink》—— Apache Flink 介紹
2、《從0到1學(xué)習(xí)Flink》—— Mac 上搭建 Flink 1.6.0 環(huán)境并構(gòu)建運(yùn)行簡(jiǎn)單程序入門
3、《從0到1學(xué)習(xí)Flink》—— Flink 配置文件詳解
4、《從0到1學(xué)習(xí)Flink》—— Data Source 介紹
5、《從0到1學(xué)習(xí)Flink》—— 如何自定義 Data Source ?
6、《從0到1學(xué)習(xí)Flink》—— Data Sink 介紹
7、《從0到1學(xué)習(xí)Flink》—— 如何自定義 Data Sink ?
8、《從0到1學(xué)習(xí)Flink》—— Flink Data transformation(轉(zhuǎn)換)
9、《從0到1學(xué)習(xí)Flink》—— 介紹Flink中的Stream Windows
10、《從0到1學(xué)習(xí)Flink》—— Flink 中的幾種 Time 詳解
11、《從0到1學(xué)習(xí)Flink》—— Flink 寫入數(shù)據(jù)到 ElasticSearch
12、《從0到1學(xué)習(xí)Flink》—— Flink 項(xiàng)目如何運(yùn)行?
13、《從0到1學(xué)習(xí)Flink》—— Flink 寫入數(shù)據(jù)到 Kafka
14、《從0到1學(xué)習(xí)Flink》—— Flink JobManager 高可用性配置
15、《從0到1學(xué)習(xí)Flink》—— Flink parallelism 和 Slot 介紹
16、《從0到1學(xué)習(xí)Flink》—— Flink 讀取 Kafka 數(shù)據(jù)批量寫入到 MySQL
17、《從0到1學(xué)習(xí)Flink》—— Flink 讀取 Kafka 數(shù)據(jù)寫入到 RabbitMQ
總結(jié)
以上是生活随笔為你收集整理的flink 自定义 窗口_《从0到1学习Flink》—— Flink Data transformation(转换)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CSDN ARIMA R语言_R语言实现
- 下一篇: delphi 串口通信发送_STM32第