Flink的DataSet基本運算元總結
Flink為了能夠處理有邊界的資料集和無邊界的資料集,提供了對應的DataSet API和DataStream API。我們可以開發對應的Java程式或者Scala程式來完成相應的功能。下面舉例了一些DataSet API中的基本的運算元。
下面我們透過具體的程式碼來為大家演示每個運算元的作用。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- flink batch dataset 的基本操作BAT
- SIFT運算元總結
- Flink -- Operator操作運算元
- [python] 基於Dataset庫運算元據庫Python
- Flink的底層運算元之前如何通訊
- Flink 運算元鏈可以合併的原始碼分析原始碼
- JDBC運算元據庫基本步驟JDBC
- 位運算總結
- spark的基本運算元使用和原始碼解析Spark原始碼
- 【Flink】Deduplicate 去重運算元原始碼解讀原始碼
- Flink standlone 模式,Job的運算元一直轉圈模式
- 四元數的運用與總結
- spark-運算元-分割槽運算元Spark
- 直播回顧 | Flink Exactly Once & Kafka-connector 運算元Kafka
- 四則運算之總結
- 四則運算app總結APP
- 快速入門Flink(5)——Flink中的17種TransFormAction運算元(面試必問,建議收藏)ORMMac面試
- Spark運算元:RDD基本轉換操作map、flatMapSpark
- 使用運算元控制公式運算公式
- DataSet的幾個基本操作
- 【OpenCV】影像變換(二)邊緣檢測:梯度運算元、Sobel運算元和Laplace運算元OpenCV梯度
- Python 影像處理 OpenCV (12): Roberts 運算元、 Prewitt 運算元、 Sobel 運算元和 Laplacian 運算元邊緣檢測技術PythonOpenCV
- 【Spark篇】---SparkStreaming中運算元中OutPutOperator類運算元Spark
- 【技巧總結】位運算裝逼指南
- 陣列和廣義表的基本運算實現(三元組)陣列
- 運算元據庫
- Java的&運算子作用於boolean運算元JavaBoolean
- 第04講:Flink 常用的 DataSet 和 DataStream APIASTAPI
- golang lesson4 -基本的運算Golang
- Flink例項(五十): Operators(十)多流轉換運算元(五)coGroup 與union
- 面試官常問的位運算問題總結面試
- [乾貨] 位運算面試題大總結面試題
- 程式設計中位運算用法總結程式設計
- 軟體工程之四則運算總結軟體工程
- Spark運算元篇 --Spark運算元之aggregateByKey詳解Spark
- Spark運算元篇 --Spark運算元之combineByKey詳解Spark
- JS中運算元組的方法JS
- 運算元據庫表