一.Flink支持的數據類型
Flink流應用程序處理的是以數據對象表示的事件流。所以在Flink內部,我們需要能夠處理這些對象。它們需要被序列化和反序列化,以便通過網絡傳送它們;或者從狀態後端、檢查點和保存點讀取它們。爲了有效地做到這一點,Flink需要明確知道應用程序所處理的數據類型。Flink使用類型信息的概念來表示數據類型,併爲每個數據類型生成特定的序列化器、反序列化器和比較器。
Flink還具有一個類型提取系統,該系統分析函數的輸入和返回類型,以自動獲取類型信息,從而獲得序列化器和反序列化器。但是,在某些情況下,例如lambda函數或泛型類型,需要顯式地提供類型信息,才能使應用程序正常工作或提高其性能。
Flink支持Java和Scala中所有常見數據類型。使用最廣泛的類型有以下幾種。
1.1 基礎數據類型
Flink支持所有的Java和Scala基礎數據類型,Int, Double, Long, String, …
DataStream<Integer> numberStream = env.fromElements(1, 2, 3, 4);
numberStream.map(data -> data * 2);
1.2 Java和Scala元組(Tuples)
java不像Scala天生支持元組Tuple類型,java的元組類型由Flink的包提供,默認提供Tuple0~Tuple25
DataStream<Tuple2<String, Integer>> personStream = env.fromElements(
new Tuple2("Adam", 17),
new Tuple2("Sarah", 23)
);
personStream.filter(p -> p.f1 > 18);
1.3 Scala樣例類(case classes)
case class Person(name:String,age:Int)
val numbers: DataStream[(String,Integer)] = env.fromElements(
Person("張三",12),
Person("李四",23)
)
1.4 Java簡單對象(POJO)
java的POJO這裏要求必須提供無參構造函數
成員變量要求都是public(或者private但是提供get、set方法)
public class Person{
public String name;
public int age;
public Person() {}
public Person( String name , int age) {
this.name = name;
this.age = age;
}
}
DataStream Pe rson > persons = env.fromElements(
new Person (" Alex", 42),
new Person (" Wendy",23)
);
1.5 其他(Arrays, Lists, Maps, Enums,等等)
Flink對Java和Scala中的一些特殊目的的類型也都是支持的,比如Java的ArrayList,HashMap,Enum等等。