柚子快報邀請碼778899分享:Flink13基礎(chǔ)-數(shù)據(jù)類型
柚子快報邀請碼778899分享:Flink13基礎(chǔ)-數(shù)據(jù)類型
一、Flink 支持的數(shù)據(jù)類型
1. Flink 的類型系統(tǒng)
為什么會出現(xiàn)“不支持”的數(shù)據(jù)類型呢?因為 Flink 作為一個分布式處理框架,處理的是
以數(shù)據(jù)對象作為元素的流。如果用水流來類比,那么我們要處理的數(shù)據(jù)元素就是隨著水流漂動
的物體。在這條流動的河里,可能漂浮著小木塊,也可能行駛著內(nèi)部錯綜復(fù)雜的大船。要分布
式地處理這些數(shù)據(jù),就不可避免地要面對數(shù)據(jù)的網(wǎng)絡(luò)傳輸、狀態(tài)的落盤和故障恢復(fù)等問題,這
就需要對數(shù)據(jù)進行序列化和反序列化。小木塊是容易序列化的;而大船想要序列化之后傳輸,
就需要將它拆解、清晰地知道其中每一個零件的類型,會有泛型擦除。
為了方便地處理數(shù)據(jù),F(xiàn)link 有自己一整套類型系統(tǒng)。Flink 使用“類型信息”
(TypeInformation)來統(tǒng)一表示數(shù)據(jù)類型。TypeInformation 類是 Flink 中所有類型描述符的基類。
它涵蓋了類型的一些基本屬性,并為每個數(shù)據(jù)類型生成特定的序列化器、反序列化器和比較器。
2. Flink 支持的數(shù)據(jù)類型
簡單來說,對于常見的 Java 和 Scala 數(shù)據(jù)類型,F(xiàn)link 都是支持的。Flink 在內(nèi)部,F(xiàn)link
對支持不同的類型進行了劃分,這些類型可以在 Types 工具類中找到:
(1)基本類型
所有 Java 基本類型及其包裝類,再加上 Void、String、Date、BigDecimal 和 BigInteger。
(2)數(shù)組類型
包括基本類型數(shù)組(PRIMITIVE_ARRAY)和對象數(shù)組(OBJECT_ARRAY)
(3)復(fù)合數(shù)據(jù)類型
? Java 元組類型(TUPLE):這是 Flink 內(nèi)置的元組類型,是 Java API 的一部分。最多
25 個字段,也就是從 Tuple0~Tuple25,不支持空字段
? Scala 樣例類及 Scala 元組:不支持空字段
? 行類型(ROW):可以認為是具有任意個字段的元組,并支持空字段
? POJO:Flink 自定義的類似于 Java bean 模式的類
(4)輔助類型
Option、Either、List、Map 等
(5)泛型類型(GENERIC)
Flink 支持所有的 Java 類和 Scala 類。不過如果沒有按照上面 POJO 類型的要求來定義,
就會被 Flink 當(dāng)作泛型類來處理。Flink 會把泛型類型當(dāng)作黑盒,無法獲取它們內(nèi)部的屬性;它
們也不是由 Flink 本身序列化的,而是由 Kryo 序列化的。
在這些類型中,元組類型和 POJO 類型最為靈活,因為它們支持創(chuàng)建復(fù)雜類型。而相比之
下,POJO 還支持在鍵(key)的定義中直接使用字段名,這會讓我們的代碼可讀性大大增加。
所以,在項目實踐中,往往會將流處理程序中的元素類型定為 Flink 的 POJO 類型。
Flink 對 POJO 類型的要求如下:
? 類是公共的(public)和獨立的(standalone,也就是說沒有非靜態(tài)的內(nèi)部類);
? 類有一個公共的無參構(gòu)造方法;
? 類中的所有字段是 public 且非 final 的;或者有一個公共的 getter 和 setter 方法,這些
方法需要符合 Java bean 的命名規(guī)范。
所以我們看到,之前的 UserBehavior,就是我們創(chuàng)建的符合 Flink POJO 定義的數(shù)據(jù)類型。
3. 類型提示(Type Hints)
Flink 還具有一個類型提取系統(tǒng),可以分析函數(shù)的輸入和返回類型,自動獲取類型信息,
從而獲得對應(yīng)的序列化器和反序列化器。但是,由于 Java 中泛型擦除的存在,在某些特殊情
況下(比如 Lambda 表達式中),自動提取的信息是不夠精細的——只告訴 Flink 當(dāng)前的元素由
“船頭、船身、船尾”構(gòu)成,根本無法重建出“大船”的模樣;這時就需要顯式地提供類型信
息,才能使應(yīng)用程序正常工作或提高其性能。
為了解決這類問題,Java API 提供了專門的“類型提示”(type hints)。
回憶一下之前的 word count 流處理程序,我們在將 String 類型的每個詞轉(zhuǎn)換成(word,
count)二元組后,就明確地用 returns 指定了返回的類型。因為對于 map 里傳入的 Lambda 表
達式,系統(tǒng)只能推斷出返回的是 Tuple2 類型,而無法得到 Tuple2
告訴系統(tǒng)當(dāng)前的返回類型,才能正確地解析出完整數(shù)據(jù)。
.map(word -> Tuple2.of(word, 1L))
.returns(Types.TUPLE(Types.STRING, Types.LONG));
這是一種比較簡單的場景,二元組的兩個元素都是基本數(shù)據(jù)類型。那如果元組中的一個元
素又有泛型,該怎么處理呢?
Flink 專門提供了 TypeHint 類,它可以捕獲泛型的類型信息,并且一直記錄下來,為運行
時提供足夠的信息。我們同樣可以通過.returns()方法,明確地指定轉(zhuǎn)換之后的 DataStream 里元
素的類型。
returns(new TypeHint
柚子快報邀請碼778899分享:Flink13基礎(chǔ)-數(shù)據(jù)類型
好文鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。