Spark基础实例

来源:互联网 发布:swmm模型软件 编辑:程序博客网 时间:2024/04/28 14:50

spark 操作的几个步骤

1  数据关联  textFile 和 parallelize

2 转换操作(JavaRDD和JavaPairRDD他们可以通过mapToPair and flatMapToPair转换) 

3  action操作,获取数据结果 

 

一、wordcount的例子

 

Java代码  收藏代码
  1. //单词统计   
  2. public static void wordCount(JavaSparkContext ctx  ){  
  3.     String filePath = "e://log1.log";  
  4.     JavaRDD<String> lines = ctx.textFile(filePath, 1);  
  5.   
  6.     JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {  
  7.         @Override  
  8.         public Iterable<String> call(String s) {  
  9.             return Arrays.asList(SPACE.split(s));  
  10.         }  
  11.     });  
  12.   
  13.     JavaPairRDD<String, Integer> ones = words.mapToPair(new PairFunction<String, String, Integer>() {  
  14.         @Override  
  15.         public Tuple2<String, Integer> call(String s) {  
  16.             return new Tuple2<String, Integer>(s, 1);  
  17.         }  
  18.     });  
  19.   
  20.     JavaPairRDD<String, Integer> counts = ones.reduceByKey(new Function2<Integer, Integer, Integer>() {  
  21.         @Override  
  22.         public Integer call(Integer i1, Integer i2) {  
  23.             return i1 + i2;  
  24.         }  
  25.     });  
  26.   
  27.       
  28.     List<Tuple2<String, Integer>> output = counts.collect();  
  29.     for (Tuple2<?, ?> tuple : output) {  
  30.         System.out.println(tuple._1() + " : " + tuple._2());  
  31.     }  
  32. }  

二、 各种Transformations 和action测试准备数据

 

  

Java代码  收藏代码
  1.     public static void testMap(JavaSparkContext ctx) {  
  2.   
  3.         List<Integer> data = Arrays.asList(12345,1,2,3);  
  4.         JavaRDD<Integer> distData = ctx.parallelize(data);  
  5.           
  6.         List<Integer> data2 = Arrays.asList(12345,6);  
  7.         JavaRDD<Integer> distData2 = ctx.parallelize(data2);  
  8.           
  9.         List<String> data3 = Arrays.asList("wang zhan,xiao ming,li xin,wang qiang,e,f".split(","));  
  10.         JavaRDD<String> data3RDD = ctx.parallelize(data3);  
  11.           
  12.         JavaRDD<Integer> lineLengths ;  
  13.         JavaRDD<String> returnStr;  
  14.         JavaPairRDD<String, Integer> returnStr2;  
  15.         JavaPairRDD<String, Integer> returnStr3;  
  16.           
  17. //      lineLengths = map( distData);  
  18. //      lineLengths = filter(distData );  
  19. //      lineLengths = sample(distData );  
  20. //      lineLengths = union(distData, distData2) ;  
  21. //      lineLengths = intersection(distData, distData2) ;  
  22. //      lineLengths = distinct(distData ) ;  
  23.           
  24. //      returnStr = flatMap(data3RDD); //数据扁平打散   
  25. //      returnStr3 = mapToPair(returnStr);// 数据变成键值对的形式   
  26. //      reduceByKey(returnStr3); //对key进行分组计算   
  27.           
  28.           
  29. //      List<Integer> list = lineLengths.collect();  
  30. //      WordCount.print(list);  
  31.           
  32. //      List<String> list2 = returnStr.collect() ;   
  33. //      WordCount.print(list2);  
  34.    
  35. //      testPersist( data3RDD );  
  36.           
  37. //      List<Tuple2<String, Integer>> listTuple = returnStr2.collect();  
  38. //      printTuple( listTuple );  
  39.           
  40. //      returnStr3 = reduceByKey(returnStr2  );  
  41. //      List<Tuple2<String, Integer>> listTuple2 = returnStr3.collect();  
  42. //      printTuple( listTuple2 );  
  43.         //reduceByKey(returnStr2  );  
  44.           
  45.         //action   
  46.         //reduce( returnStr2);  
  47.         // count(returnStr2 );  
  48.     }  

 

 

三、groupByKey 

Java代码  收藏代码
  1. //对key进行分组处理,但如果需要统计求和则最好不要这样处理   
  2. private static JavaPairRDD<String, Integer> groupByKey(JavaPairRDD<String, Integer> returnStr3) {  
  3.     JavaPairRDD<String, Iterable<Integer>>  rdd = returnStr3.groupByKey();  
  4.       
  5.     return null;  
  6. }  

 四、数据去重

  

Java代码  收藏代码
  1. //数据去重   
  2. private static JavaRDD<Integer> distinct(JavaRDD<Integer> distData) {  
  3.     JavaRDD<Integer> rdd3 = distData.distinct( );  
  4.     print( rdd3);  
  5.     return null;  
  6. }  

 

五、交集数据

 

Java代码  收藏代码
  1. //获取rdd数据的交集 数据  
  2. private static JavaRDD<Integer> intersection(JavaRDD<Integer> distData,  
  3.         JavaRDD<Integer> distData2) {  
  4.     JavaRDD<Integer> rdd3 = distData.intersection(distData2 );   
  5.     print(rdd3 );   
  6.       
  7.     return null;  
  8. }  

 

六数据持久化

 

Java代码  收藏代码
  1.     /** 
  2.      * 持久化数据  
  3.      * @param data3RDD 
  4.      */  
  5.     private static void testPersist(JavaRDD<String> data3RDD) {  
  6.         System.out.println( "持久化数据到目录。。。");  
  7.         data3RDD.persist(StorageLevel.MEMORY_ONLY());  
  8. //      data3RDD.checkpoint();    
  9. //      data3RDD.isCheckpointed() ;  
  10.     }  

七、count统计

 

Java代码  收藏代码
  1. //计算统计  元素两两传入到reduce中然后计算统计  
  2. private static void count(JavaPairRDD<String, Integer> returnStr2) {  
  3.     System.out.println("元素总数:"+returnStr2.count()  ); //获取元素总数  
  4.     System.out.println("元素总数:"+returnStr2.first() );//获取第一个元素  
  5.     System.out.println("元素总数:"+returnStr2.take(2) );//获取RDD的前2个元素  
  6.     System.out.println("元素countByKey总数:"+returnStr2.countByKey( )  ); //根据key进行统计数量   
  7.     //returnStr2.saveAsTextFile("E://test.txt") ;//数据保存到文件中       
  8.     returnStr2.foreach(new VoidFunction<Tuple2<String,Integer>>() {  
  9.         @Override  
  10.         public void call(Tuple2<String, Integer> t) throws Exception {  
  11.              System.out.println( t );  
  12.         }  
  13.     });  
  14.       
  15. }  

  

八、reduce操作

  

Java代码  收藏代码
  1. //计算统计  元素两两传入到reduce中然后计算统计  
  2. private static void reduce(JavaPairRDD<String, Integer> returnStr2) {  
  3.       
  4.     Tuple2<String, Integer> t = returnStr2.reduce(  
  5.             new Function2<Tuple2<String,Integer>, Tuple2<String,Integer>,  Tuple2<String,Integer>>() {  
  6.                 @Override  
  7.                 public Tuple2<String, Integer> call( Tuple2<String, Integer> v1,  Tuple2<String, Integer> v2) throws Exception {  
  8.                      System.out.println( v1 +"  "+v2 );  
  9.                       
  10.                     return new Tuple2<String, Integer>(v1._1+v2._1,v1._2+v2._2()  );  
  11.                 }  
  12.                   
  13.           
  14.     } );  
  15.     System.out.println("reduce结果 :"+t._1 +"  "+t._2);  
  16. }  

 

九、reduceBykey使用

  

Java代码  收藏代码
  1. //将原来的RDD每一个行数据 变成一个数组,然后所有的数组数据存到一个总得RDD数组中  
  2. public static JavaPairRDD<String, Integer> reduceByKey(JavaPairRDD<String, Integer> rdd ) {  
  3.       
  4.     JavaPairRDD<String, Integer> counts = rdd.reduceByKey(  
  5.             new Function2<Integer, Integer, Integer>() {//泛型分别是 :两个计算参数  ,最后是返回值   
  6.           
  7.         @Override  
  8.         public Integer call(Integer i1, Integer i2) {//每次把key相同的数据,与上一次执行的结果,依次传进来计算  
  9.             System.out.println(i1+" == "+i2);  
  10.             return i1 + i2;  
  11.         }  
  12.     });  
  13.     printPair(counts );  
  14.     return counts;  
  15. }  

 

十 flatMap使用

  

Java代码  收藏代码
  1. //将原来的RDD每一个行数据 变成一个数组,然后所有的数组数据存到一个总得RDD数组中  
  2. public static JavaRDD<String> flatMap(JavaRDD<String> rdd  ) {  
  3.     JavaRDD<String> lineLengths = rdd.flatMap( //返回值是输出的类型  
  4.             new FlatMapFunction<String, String>() { //第一个参数是输入,第二个参数是输出  
  5.         @Override  
  6.         public Iterable<String> call(String str) throws Exception {  
  7.                
  8.             return Arrays.asList(SPACE.split(str));  
  9.         }  
  10.     }) ;   
  11.       
  12.     printStr(lineLengths );  
  13.     return lineLengths;  
  14. }  

 十一、mapToPair使用

   

Java代码  收藏代码
  1. // 将普通的RDD转换为 map数据的RDD方便计算处理  , a  a->1  
  2. public static  JavaPairRDD<String, Integer>   mapToPair(JavaRDD<String> rdd ){  
  3.     JavaPairRDD<String, Integer> ones = rdd.mapToPair( new PairFunction<String, String, Integer>() {  
  4.         @Override  
  5.         public Tuple2<String, Integer> call(String t) throws Exception {  
  6.             return  new Tuple2<String, Integer>( t, 1);  
  7.         }  
  8.     }) ;   
  9.     return ones ;   
  10. }  

 十二、 合并Rdd

  

Java代码  收藏代码
  1. // 合并rdd   
  2. public static JavaRDD<Integer> union(JavaRDD<Integer> rdd , JavaRDD<Integer> rdd2) {  
  3.     JavaRDD<Integer> lineLengths = rdd.union(rdd2) ;   
  4.     print(lineLengths);  
  5.     return lineLengths;  
  6. }  

 十三、抽样

   

Java代码  收藏代码
  1. // Return a sampled subset of this RDD. 返回一个RDD子集抽样   
  2. public static JavaRDD<Integer> sample(JavaRDD<Integer> rdd) {  
  3.     JavaRDD<Integer> lineLengths = rdd.sample(false , 0.4 ) ;   
  4.     print(lineLengths);  
  5.     return lineLengths;  
  6. }  

 十四、map使用

  

Java代码  收藏代码
  1. // map 源中的每一个元素都进行一个函数操作,生成一个新的RDD ,即每个元素进行一次转换  
  2. public static JavaRDD<Integer> map(JavaRDD<Integer> rdd) {  
  3.     JavaRDD<Integer> lineLengths = rdd.map(new Function<Integer, Integer>() {  
  4.         @Override  
  5.         public Integer call(Integer v1) throws Exception {  
  6.               
  7.             return v1+1;  
  8.         }  
  9.     });  
  10.       
  11.     print( lineLengths);  
  12.     return lineLengths;  
  13. }  

 十五、打印数据 

   

Java代码  收藏代码
  1.     /** 
  2.      * 如果rdd中数据过多,则调用take获取一部分数据打印 
  3.      * 1 直接rdd.foreach 打印rdd的数据,数据打印在各个executor中 
  4.      * 2 调用rdd.collect.foreach 打印数据,数据打印在driver上  
  5.      * @param lineLengths 
  6.      */  
  7.     public static void print(JavaRDD<Integer> lineLengths ){  
  8. //      lineLengths.foreach( new VoidFunction<Integer>() {  
  9. //          @Override  
  10. //          public void call(Integer t) throws Exception {  
  11. //          }  
  12. //      });  
  13.         System.out.println("开始打印");  
  14.         lineLengths.collect().forEach( new Consumer<Integer>(){  
  15.             @Override  
  16.             public void accept(Integer t) {  
  17.                 System.out.println( t);   
  18.             }  
  19.         });  
  20.         System.out.println("结束打印");  
  21.     }  
  22.       
  23.     public static void printStr(JavaRDD<String> lineLengths ){  
  24.         System.out.println("开始打印");  
  25.         lineLengths.collect().forEach( new Consumer<String>(){  
  26.             @Override  
  27.             public void accept(String t) {  
  28.                 System.out.println( t);   
  29.             }  
  30.         });  
  31.         System.out.println("结束打印");  
  32.     }  
  33.     /** 
  34.      * 打印tuble 
  35.      * @param lineLengths 
  36.      */  
  37.     public static void printPair( JavaPairRDD<String, Integer> rdd ){  
  38.    
  39.         System.out.println("开始打印");  
  40.         rdd.collect().forEach( new Consumer<Tuple2<String,Integer>>(){  
  41.             @Override  
  42.             public void accept(Tuple2<String, Integer> t) {  
  43.                 System.out.println( t._1() +"  "+t._2() );  
  44.             }  
  45.               
  46.         });  
  47.         System.out.println("结束打印");  
  48.     }  
  49.     public static void print(List  list) {  
  50.         if (list == null || list.size() == 0) {  
  51.             return;  
  52.         }  
  53.         for (int i = 0; i < list.size(); i++) {  
  54.             System.out.println(list.get(i));  
  55.         }  
  56.     }  
  57.       
  58.     /** 
  59.      * 打印map的RDD 
  60.      * @param listTuple 
  61.      */  
  62.     public static void printTuple(List<Tuple2<String, Integer>> listTuple) {  
  63.           
  64.         if (listTuple == null || listTuple.size() == 0) {  
  65.             return;  
  66.         }  
  67.   
  68.         for (int i = 0; i < listTuple.size(); i++) {  
  69.             System.out.println(listTuple.get(i));  
  70.         }  
  71.     }  
  72.   
  73.       

 十六、过滤

  

Java代码  收藏代码
  1. //对每一个元素进行过滤,然后返回 ,false 的数据会被过滤掉  
  2. public static JavaRDD<Integer> filter(JavaRDD<Integer> rdd) {  
  3.     JavaRDD<Integer> lineLengths = rdd.filter(new Function<Integer, Boolean>() {  
  4.         @Override  
  5.         public Boolean call(Integer v1) throws Exception {  
  6.             if (v1 != 1) {  
  7.                 return true;  
  8.             }  
  9.             return false;  
  10.         }  
  11.     });  
  12.       
  13.     print( lineLengths);  
  14.     return lineLengths;  
  15. }  

 

0 0