算子:
完整的spark代码执行下来叫做一个application,有多个job
个数与action算子相同。
action触发流程:
RDD-->RDD-->RDD-->RDD,不持久化情况下,每次action触发都会从头计算
具体的算子
算子分为两类,action算子与transformation算子,持久化算子属于transformation算子
action算子不会返回RDD,transformation总是返回RDD。
transfoamation:懒执行,只有当action算子出现才会执行,否则不执行。
1.很重要的:
mapToPair,map
reduceByKey
foreach,
而mapPartitions,foreachPartition:按分区计算(功能上可替代单个的foreach,map,性能高,原因不详
2.持久化的算子
cache:存于内存
persist:可指定存于内存,磁盘等, pereiet()=cache();
checkpoint:存于磁盘,用于RDD的切断(persist不行),比如丢失后的恢复,比如说RDD4丢了他要从
头计算开始恢复,但是如果发现它对RDD3进行checkpoint了那么直接RDD3开始恢复 ,不同于前两项,
application结束后不会被删除。可以checkpoint前对相应的RDDcache一下
3.类似于数据库操作
join,leftjoin,rightjoin,fullOuterJoin,,intersection计算交集,subtract,,union:都是两个RDD之间的操作,
cogroup,
distinct
注意:连接操作需要kv形式的RDD,计算交差集不一定要kv形式元素相同即可,union产生的RDD分区数等于两个父亲RDD之和,
而连接产生的RDD分区数等于调用该方法的父RDD的分区数
产生的RDD的元素数量join<joinleft,right<full
4.其他一些:
count
返回数据集中的元素数。会在结果计算完成后回收到Driver端。
take(n)
返回一个包含数据集前n个元素的集合。
first
first=take(1),返回数据集中的第一个元素。
foreach
循环遍历数据集中的每个元素,运行相应的逻辑。
collect
将计算结果回收到Driver端。
下面是3中的算子的代码示范:
public class Day02 {
public static void main(String[] args) {
SparkConf conf = new SparkConf().setMaster("local").setAppName("test");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> rdd = sc.parallelize(Arrays.asList("a","a","b","b","b","c","d"));
/**
* distinct
*/
JavaRDD<String> distinct = rdd.distinct();
distinct.foreach(new VoidFunction<String>() {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void call(String arg0) throws Exception {
System.out.println(arg0);
}
});
JavaPairRDD<String, Integer> mapToPair = rdd.mapToPair(new PairFunction<String, String, Integer>() {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public Tuple2<String, Integer> call(String s) throws Exception {
// TODO Auto-generated method stub
return new Tuple2<String, Integer>(s,1);
}
});
JavaPairRDD<String, Integer> reduceByKey = mapToPair.reduceByKey(new Function2<Integer, Integer, Integer>() {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public Integer call(Integer v1, Integer v2) throws Exception {
return v1*v2;
}
});
JavaRDD<String> map = reduceByKey.map(new Function<Tuple2<String,Integer>, String>() {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public String call(Tuple2<String, Integer> tuple) throws Exception {
return tuple._1;
}
});
map.foreach(new VoidFunction<String>() {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void call(String arg0) throws Exception {
System.out.println(arg0);
}
});
/**
* foreachPartition 一个分区一个分区的遍历数据,action算子
*/
rdd.foreachPartition(new VoidFunction<Iterator<String>>() {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void call(Iterator<String> iter) throws Exception {
List<String> list = new ArrayList<String>();
System.out.println("创建数据库连接。。。。");
while(iter.hasNext()) {
String s = iter.next();
System.out.println("拼接sql。。。。"+s);
list.add(s);
}
System.out.println("关闭数据库连接。。。。");
}
});
/**
* foreach 一条条处理数据
*/
rdd.foreach(new VoidFunction<String>() {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void call(String s) throws Exception {
System.out.println("创建数据库连接。。。。");
System.out.println("插入数据库连接。。。。"+s);
System.out.println("关闭数据库连接。。。。");
}
});
/**
* mapPartitions
*/
// JavaRDD<String> mapPartitions = rdd.mapPartitions(new FlatMapFunction<Iterator<String>, String>() {
//
// /**
// *
// */
// private static final long serialVersionUID = 1L;
//
// @Override
// public Iterable<String> call(Iterator<String> iter) throws Exception {
// List<String> list = new ArrayList<String>();
//
// System.out.println("创建数据库连接。。。。");
//
// while(iter.hasNext()) {
// String s = iter.next();
// System.out.println("拼接sql。。。。"+s);
// list.add(s);
// }
//
// System.out.println("关闭数据库连接。。。。");
// return list;
// }
// });
// mapPartitions.collect();
// JavaRDD<String> map = rdd.map(new Function<String, String>() {
//
// /**
// *
// */
// private static final long serialVersionUID = 1L;
//
// @Override
// public String call(String s) throws Exception {
//
// System.out.println("创建数据库连接。。。。");
// System.out.println("插入数据库连接。。。。"+s);
// System.out.println("关闭数据库连接。。。。");
//
//
// return s+"~";
// }
// });
// map.collect();
// JavaPairRDD<String, String> rdd1 = sc.parallelizePairs(Arrays.asList(
// new Tuple2<String,String>("zhangsan","a"),
// new Tuple2<String,String>("zhangsan","aa"),
// new Tuple2<String,String>("zhangsan","aaa"),
// new Tuple2<String,String>("lisi","b"),
// new Tuple2<String,String>("lisi","bb"),
// new Tuple2<String,String>("wangwu","c")
// ));
// JavaPairRDD<String, String> rdd2 = sc.parallelizePairs(Arrays.asList(
// new Tuple2<String,String>("zhangsan","10000"),
// new Tuple2<String,String>("lisi","1"),
// new Tuple2<String,String>("lisi","10"),
// new Tuple2<String,String>("lisi","1000"),
// new Tuple2<String,String>("wangwu","3"),
// new Tuple2<String,String>("wangwu","30"),
// new Tuple2<String,String>("maliu","200")
// ));
/**
* cogroup 将两个RDD的key合并,每个RDD中的key对应一个value集合
*/
// JavaPairRDD<String, Tuple2<Iterable<String>, Iterable<String>>> cogroup = rdd1.cogroup(rdd2);
// cogroup.foreach(new VoidFunction<Tuple2<String,Tuple2<Iterable<String>,Iterable<String>>>>() {
//
// /**
// *
// */
// private static final long serialVersionUID = 1L;
//
// @Override
// public void call(Tuple2<String, Tuple2<Iterable<String>, Iterable<String>>> arg0) throws Exception {
// System.out.println(arg0);
// }
// });
/**
* subtract 取差集
*/
// JavaPairRDD<String, String> subtract = rdd2.subtract(rdd1);
//
// subtract.foreach(new VoidFunction<Tuple2<String,String>>() {
//
// /**
// *
// */
// private static final long serialVersionUID = 1L;
//
// @Override
// public void call(Tuple2<String, String> arg0) throws Exception {
// System.out.println(arg0);
// }
// });
/**
* intersection 取交集
*/
// JavaPairRDD<String, String> intersection = rdd1.intersection(rdd2);
//
// intersection.foreach(new VoidFunction<Tuple2<String,String>>() {
//
// /**
// *
// */
// private static final long serialVersionUID = 1L;
//
// @Override
// public void call(Tuple2<String, String> arg0) throws Exception {
// System.out.println(arg0);
// }
// });
// JavaPairRDD<String, Integer> rdd2 = sc.parallelizePairs(Arrays.asList(
// new Tuple2<String,Integer>("zhangsan",100),
// new Tuple2<String,Integer>("lisi",200),
// new Tuple2<String,Integer>("wangwu",300),
// new Tuple2<String,Integer>("tianqi",400)
// ),2);
// JavaPairRDD<String, String> rdd3 = sc.parallelizePairs(Arrays.asList(
// new Tuple2<String,String>("zhangsan1","100"),
// new Tuple2<String,String>("lisi1","200"),
// new Tuple2<String,String>("wangwu1","300"),
// new Tuple2<String,String>("tianqi1","400")
// ),2);
/**
* union 合并RDD, 类型一致
*/
// JavaPairRDD<String, String> union = rdd1.union(rdd3);
// System.out.println("union partition legth = "+union.partitions().size());
//
// union.foreach(new VoidFunction<Tuple2<String,String>>() {
//
// /**
// *
// */
// private static final long serialVersionUID = 1L;
//
// @Override
// public void call(Tuple2<String, String> arg0) throws Exception {
// System.out.println(arg0);
// }
// });
/**
* join
* 按照两个RDD的key去关联
* Join 后的RDD与父RDD分区多的那个分区数一致
*/
// JavaPairRDD<String, Tuple2<String, Integer>> joinRDD = rdd1.join(rdd2);
// System.out.println("joinRDD partition legth = "+joinRDD.partitions().size());
// joinRDD.foreach(new VoidFunction<Tuple2<String,Tuple2<String,Integer>>>() {
//
// /**
// *
// */
// private static final long serialVersionUID = 1L;
//
// @Override
// public void call(Tuple2<String, Tuple2<String, Integer>> arg0) throws Exception {
// System.out.println(arg0);
// }
// });
/**
* fullOuterJoin
*/
// JavaPairRDD<String, Tuple2<Optional<String>, Optional<Integer>>> fullOuterJoin = rdd1.fullOuterJoin(rdd2);
// fullOuterJoin.foreach(new VoidFunction<Tuple2<String,Tuple2<Optional<String>,Optional<Integer>>>>() {
//
// /**
// *
// */
// private static final long serialVersionUID = 1L;
//
// @Override
// public void call(Tuple2<String, Tuple2<Optional<String>, Optional<Integer>>> arg0) throws Exception {
// System.out.println(arg0);
// }
// });
/**
* rightOuterJoin
*/
// JavaPairRDD<String, Tuple2<Optional<String>, Integer>> rightOuterJoin = rdd1.rightOuterJoin(rdd2);
// rightOuterJoin.foreach(new VoidFunction<Tuple2<String,Tuple2<Optional<String>,Integer>>>(
// ) {
//
// /**
// *
// */
// private static final long serialVersionUID = 1L;
//
// @Override
// public void call(Tuple2<String, Tuple2<Optional<String>, Integer>> arg0) throws Exception {
// System.out.println(arg0);
// }
// });
/**
* leftOuterJoin
*
*/
// JavaPairRDD<String, Tuple2<String, Optional<Integer>>> leftOuterJoin = rdd1.leftOuterJoin(rdd2);
// leftOuterJoin.foreach(new VoidFunction<Tuple2<String,Tuple2<String,Optional<Integer>>>>() {
//
// /**
// *
// */
// private static final long serialVersionUID = 1L;
//
// @Override
// public void call(Tuple2<String, Tuple2<String, Optional<Integer>>> tuple) throws Exception {
// String key = tuple._1;
// String value1 = tuple._2._1;
// Optional<Integer> option = tuple._2._2;
// if(option.isPresent()) {
//
// System.out.println("key = "+key +", value1 = "+value1+" ,value2 ="+option.get());
// }else {
// System.out.println("key = "+key +", value1 = "+value1+" ,value2 =Null");
//
// }
// }
// });
sc.stop();
}
}
*/