Flink的DataSet基本運算元總結

千鋒Python唐小強發表於2020-10-15

Flink為了能夠處理有邊界的資料集和無邊界的資料集,提供了對應的DataSet API和DataStream API。我們可以開發對應的Java程式或者Scala程式來完成相應的功能。下面舉例了一些DataSet API中的基本的運算元。

Flink的DataSet基本運算元總結

下面我們透過具體的程式碼來為大家演示每個運算元的作用。

1、Map、FlatMap與MapPartition

//獲取執行環境ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
ArrayList<String> data = new ArrayList<String>();
data.add("I love Beijing");
data.add("I love China");
data.add("Beijing is the capital of China");
DataSource<String> text = env.fromCollection(data);
DataSet<List<String>> mapData = text.map(new MapFunction<String, List<String>>() {	public List<String> map(String data) throws Exception {		String[] words = data.split(" ");		
		//建立一個List
		List<String> result = new ArrayList<String>();		for(String w:words){
			result.add(w);
		}		return result;
	}
});
mapData.print();
System.out.println("*****************************************");
DataSet<String> flatMapData = text.flatMap(new FlatMapFunction<String, String>() {	public void flatMap(String data, Collector<String> collection) throws Exception {		String[] words = data.split(" ");		for(String w:words){
			collection.collect(w);
		}
	}
});
flatMapData.print();
System.out.println("*****************************************");/*	new MapPartitionFunction<String, String>
	第一個String:表示分割槽中的資料元素型別
	第二個String:表示處理後的資料元素型別*/DataSet<String> mapPartitionData = text.mapPartition(new MapPartitionFunction<String, String>() {	public void mapPartition(Iterable<String> values, Collector<String> out) throws Exception {		//針對分割槽進行操作的好處是:比如要進行資料庫的操作,一個分割槽只需要建立一個Connection
		//values中儲存了一個分割槽的資料
		 Iterator<String> it = values.iterator();		while (it.hasNext()) {			String next = it.next();			String[] split = next.split(" ");			for (String word : split) {
				out.collect(word);
			}
		}		//關閉連結
	}
});
mapPartitionData.print();

2、Filter與Distinct

//獲取執行環境ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
ArrayList<String> data = new ArrayList<String>();
data.add("I love Beijing");
data.add("I love China");
data.add("Beijing is the capital of China");
DataSource<String> text = env.fromCollection(data);
DataSet<String> flatMapData = text.flatMap(new FlatMapFunction<String, String>() {	public void flatMap(String data, Collector<String> collection) throws Exception {		String[] words = data.split(" ");		for(String w:words){
			collection.collect(w);
		}
	}
});//去掉重複的單詞flatMapData.distinct().print();
System.out.println("*********************");//選出長度大於3的單詞flatMapData.filter(new FilterFunction<String>() {	
	public boolean filter(String word) throws Exception {
		int length = word.length();		return length>3?true:false;
	}
}).print();

3、Join操作

//獲取執行的環境ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();//建立第一張表:使用者ID  姓名ArrayList<Tuple2<Integer, String>> data1 = new ArrayList<Tuple2<Integer,String>>();
data1.add(new Tuple2(1,"Tom"));
data1.add(new Tuple2(2,"Mike"));
data1.add(new Tuple2(3,"Mary"));
data1.add(new Tuple2(4,"Jone"));//建立第二張表:使用者ID 所在的城市ArrayList<Tuple2<Integer, String>> data2 = new ArrayList<Tuple2<Integer,String>>();
data2.add(new Tuple2(1,"北京"));
data2.add(new Tuple2(2,"上海"));
data2.add(new Tuple2(3,"廣州"));
data2.add(new Tuple2(4,"重慶"));//實現join的多表查詢:使用者ID  姓名  所在的程式DataSet<Tuple2<Integer, String>> table1 = env.fromCollection(data1);
DataSet<Tuple2<Integer, String>> table2 = env.fromCollection(data2);
table1.join(table2).where(0).equalTo(0)/*第一個Tuple2<Integer,String>:表示第一張表
 * 第二個Tuple2<Integer,String>:表示第二張表
 * Tuple3<Integer,String, String>:多表join連線查詢後的返回結果   */		                   .with(new JoinFunction<Tuple2<Integer,String>, Tuple2<Integer,String>, Tuple3<Integer,String, String>>() {	public Tuple3<Integer, String, String> join(Tuple2<Integer, String> table1,
			Tuple2<Integer, String> table2) throws Exception {		return new Tuple3<Integer, String, String>(table1.f0,table1.f1,table2.f1);
	} }).print();

4、笛卡爾積

ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();//建立第一張表:使用者ID  姓名ArrayList<Tuple2<Integer, String>> data1 = new ArrayList<Tuple2<Integer,String>>();
data1.add(new Tuple2(1,"Tom"));
data1.add(new Tuple2(2,"Mike"));
data1.add(new Tuple2(3,"Mary"));
data1.add(new Tuple2(4,"Jone"));//建立第二張表:使用者ID 所在的城市ArrayList<Tuple2<Integer, String>> data2 = new ArrayList<Tuple2<Integer,String>>();
data2.add(new Tuple2(1,"北京"));
data2.add(new Tuple2(2,"上海"));
data2.add(new Tuple2(3,"廣州"));
data2.add(new Tuple2(4,"重慶"));//實現join的多表查詢:使用者ID  姓名  所在的程式DataSet<Tuple2<Integer, String>> table1 = env.fromCollection(data1);
DataSet<Tuple2<Integer, String>> table2 = env.fromCollection(data2);//生成笛卡爾積table1.cross(table2).print();

5、First-N

ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();//這裡的資料是:員工姓名、薪水、部門號DataSet<Tuple3<String, Integer,Integer>> grade = 
		env.fromElements(new Tuple3<String, Integer,Integer>("Tom",1000,10),						 new Tuple3<String, Integer,Integer>("Mary",1500,20),						 new Tuple3<String, Integer,Integer>("Mike",1200,30),						 new Tuple3<String, Integer,Integer>("Jerry",2000,10));//按照插入順序取前三條記錄grade.first(3).print();
System.out.println("**********************");//先按照部門號排序,在按照薪水排序grade.sortPartition(2, Order.ASCENDING).sortPartition(1, Order.ASCENDING).print();
System.out.println("**********************");//按照部門號分組,求每組的第一條記錄grade.groupBy(2).first(1).print();

6、外連結操作

ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();//建立第一張表:使用者ID  姓名ArrayList<Tuple2<Integer, String>> data1 = new ArrayList<Tuple2<Integer,String>>();
data1.add(new Tuple2(1,"Tom"));
data1.add(new Tuple2(3,"Mary"));
data1.add(new Tuple2(4,"Jone"));//建立第二張表:使用者ID 所在的城市ArrayList<Tuple2<Integer, String>> data2 = new ArrayList<Tuple2<Integer,String>>();
data2.add(new Tuple2(1,"北京"));
data2.add(new Tuple2(2,"上海"));
data2.add(new Tuple2(4,"重慶"));//實現join的多表查詢:使用者ID  姓名  所在的程式DataSet<Tuple2<Integer, String>> table1 = env.fromCollection(data1);
DataSet<Tuple2<Integer, String>> table2 = env.fromCollection(data2);//左外連線table1.leftOuterJoin(table2).where(0).equalTo(0)
	  .with(new JoinFunction<Tuple2<Integer,String>, Tuple2<Integer,String>, Tuple3<Integer,String,String>>() {		public Tuple3<Integer, String, String> join(Tuple2<Integer, String> table1,
				Tuple2<Integer, String> table2) throws Exception {			// 左外連線表示等號左邊的資訊會被包含
			if(table2 == null){				return new Tuple3<Integer, String, String>(table1.f0,table1.f1,null);
			}else{				return new Tuple3<Integer, String, String>(table1.f0,table1.f1,table2.f1);
			}
		}
	}).print();
System.out.println("***********************************");//右外連線table1.rightOuterJoin(table2).where(0).equalTo(0)
	  .with(new JoinFunction<Tuple2<Integer,String>, Tuple2<Integer,String>, Tuple3<Integer,String,String>>() {		public Tuple3<Integer, String, String> join(Tuple2<Integer, String> table1,
				Tuple2<Integer, String> table2) throws Exception {			//右外連結表示等號右邊的表的資訊會被包含
			if(table1 == null){				return new Tuple3<Integer, String, String>(table2.f0,null,table2.f1);
			}else{				return new Tuple3<Integer, String, String>(table2.f0,table1.f1,table2.f1);
			}
		}
	}).print();
System.out.println("***********************************");//全外連線table1.fullOuterJoin(table2).where(0).equalTo(0)
.with(new JoinFunction<Tuple2<Integer,String>, Tuple2<Integer,String>, Tuple3<Integer,String,String>>() {	public Tuple3<Integer, String, String> join(Tuple2<Integer, String> table1, Tuple2<Integer, String> table2)
			throws Exception {		if(table1 == null){			return new Tuple3<Integer, String, String>(table2.f0,null,table2.f1);
		}else if(table2 == null){			return new Tuple3<Integer, String, String>(table1.f0,table1.f1,null);
		}else{			return new Tuple3<Integer, String, String>(table1.f0,table1.f1,table2.f1);
		}
	}
	
}).print();

更多的教程也會繼續更新,不清楚的地方,也可以給我留言!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69923331/viewspace-2727096/,如需轉載,請註明出處,否則將追究法律責任。

相關文章