Spark RDD常用算子

本文详细介绍了Spark中的RDD常用算子,包括parallelize、textFile、filter、map、flatMap、distinct、union、intersection、subtract、cartesian、mapToPair、flatMapToPair、combineByKey、reduceByKey、foldByKey、sortByKey、groupByKey、cogroup、subtractByKey、join、rightOuterJoin、leftOuterJoin等,涵盖了数据读取、转换、聚合和持久化等多个方面。
摘要由CSDN通过智能技术生成

Spark RDD常用算子

一、parallelize
调用SparkContext 的 parallelize(),将一个存在的集合,变成一个RDD,这种方式试用于学习spark和做一些spark的测试

scala版本
scala的parallelize有两个参数,第一个是一个Seq集合,第二个是分区数,如果没有则会是默认分区数
scala版本可以选择makeRDD替换parallelize,java版本则没有

val rdd = sc.parallelize(List("A","B","C"))
val rdd1 = sc.makeRDD(List("A","B","C"))

Java版本
java版本的参数则是一个List集合和分区数

JavaRDD<Tuple2<Integer,String>> rdd = sc.parallelize(Arrays.asList(
new Tuple2<>(1,"A"),
new Tuple2<>(2,"B"),
new Tuple2<>(3,"C")
));

二、textFile
从外部读取数据创建RDD,textFile支持分区,支持模糊匹配,可以读取多个路径,路径之间使用逗号隔开

scala版本

val rdd = sc.textFile("D:/text/*.txt,E:/text/sample.txt",2)

java版本

JavaRDD<String> rdd = sc.textFile("文件路径");

三、filter
过滤算子

scala版本

val conf = new SparkConf().setMaster("local[2]").setAppName("filterscala")
val sc=new SparkContext(conf)

val rdd = sc.textFile("in/sample.txt")
rdd.filter(_.contains("zks")).collect.foreach(println)

java版本

public static void main(String[] args) {
    SparkConf conf=new SparkConf().setMaster("local[*]").setAppName("filterJava");
    JavaSparkContext sc=new JavaSparkContext(conf);
public static void main(String[] args) {
    SparkConf conf=new SparkConf().setMaster("local[*]").setAppName("filterJava");
    JavaSparkContext sc=new JavaSparkContext(conf);
JavaRDD<String> lines=sc.textFile("in/sample.txt");
JavaRDD<String> filterRdd=lines.filter(new Function<String,Boolean>(){
    @override
    public Boolean call(String v) throws Exception{
        return v1.contains("zks");
    }
});

List<String> collect=filterRdd.collect();
for(String str:collect){
    System.out.println(str);
 }
}

四、map
map() 接收一个函数,把这个函数用于 RDD 中的每个元素,将函数的返回结果作为结果RDD编程
RDD 中对应元素的值 map是一对一的关系

示例:将每个元素变成元组
scala版本

def main(args: Array[String]): Unit = {
    val conf=new SparkConf().setMaster("local[2]").setAppName("mapScala")
    val sc=new SparkContext(conf)


    val lines =sc.textFile("in/sample.txt")  //装载文件
    val mapRdd =lines.map(x=>(x.split(" ")(0),1))
    mapRdd.collect.foreach(println)
}

java版本

SparkConf conf=new SparkConf().setMaster("local[2]").setAppName("mapJava");
JavaSparkContext sc=new JavaSparkContext(conf);

JavaRDD<String> lines=sc.textFile("in/sample.txt");
JavaRDD<Iterable> mapRdd=lines.map(new Function<String, Iterable>() {
    @Override
    public Iterable call(String v2) throws Exception {
        String[] split=v2.split(" ");
        return Arrays.asList(split);
    }
});

List<Iterable> collect= mapRdd.collect();
for (Iterable it : collect){
    Iterator iterator=it.iterator();
    while (iterator.hasNext()){
        System.out.println(iterator.next());
    }
}

五、flatMap
对某个元素生成多个元素,实现该功能的操作叫作 flatMap()
faltMap的函数应用于每一个元素,对于每一个元素返回的是多个元素组成的迭代器

示例:将数据切分成词
scala版本

def main(args: Array[String]): Unit = {
    val conf=new SparkConf().setMaster("local[2]").setAppName("mapdemo")
    val sc=new SparkContext(conf)

    val lines=sc.textFile("in/sample.txt")
    val flatMapRdd=lines.flatMap(_.split(" "))
    flatMapRdd.collect.foreach(println)
}

java版本,Spark2.0版本以上

SparkConf conf=new SparkConf().setMaster("local[2]").setAppName("flatMapJava");
JavaSparkContext sc=new JavaSparkContext(conf);

JavaRDD<String> lines=sc.textFile("in/sample.txt");
JavaRdd<String> flatMapRdd=lines.flatMap(new FlatMapFunction<String,String>(){
    @override
    public Iterator<String> call(String s)throws Exception{
        String[] split=s.split("\\s+");
        return Arrays.asList(split).iterator();
    }
});
    List<String> collect =flatMapRdd.collect();
    for(String s:collect){
        System.out.println(s);
    }

六、distinct
distinct用于去重,此方法涉及到混洗,操作开销很大
scala版本

val conf=new SparkConf().setMaster("local[2]").setAppName("distinctdemo")
val sc=new SparkContext(conf)

val rdd=sc.makeRDD(List("a","b","a","c"))
rdd.distinct.collect.foreach(println)

java版本

SparkConf conf=new SparkConf().setMaster("local[2]").setAppName("distinctJava");
JavaSparkContext sc=new JavaSparkContext(conf);

List<String> strings =Arrays.asList("a","b","a","b","c");
JavaRDD<String> strRdd=sc.parallelize(strings);
JavaRDD<String> distinctRdd=strRdd.distinct();
List<String> collect=ditinctRdd.collect();
for(String s:collect){
    System.out.println(s);
}

七、union
合并两个Rdd
scala版本

val rdd1=sc.makeRDD(List("a","b"))
val rdd2=sc.makeRDD(List("c","d"))
val unionRdd=rdd1.union(rdd2)
unionRdd.collect.foreach(println)

java版本

JavaRDD<String> rdd1=sc.parallelize(Arrays.asList("a","b"));
JavaRDD<String> rdd2=sc.parallelize(Arrays.asList("c","d"));
JavaRDD<String> unionRdd=rdd1.uinon(rdd2);
List<Stirng> collect=unionRdd.collect();
for(String s:collect){
    System.out.println(s)
}

八、intersection
返回两个RDD的交集,并且去重
intersection 需要混洗数据,比较浪费性能

scala版本

val rdd1=sc.makeRDD(List("aa","bb","cc"))
val rdd2=sc.makeRDD(List("cc","bb","dd"))
val intersectionRdd = rdd1.intersection(rdd2)
intersectionRdd.collect.foreach(println)

java版本

JavaRDD<String> rdd1=sc.parallelize(Arrays.asList("aa","bb","cc"));
JavaRDD<String> rdd2=sc.parallelize(Arrays.asList("cc","bb","dd"));
JavaRDD<String> intersectionRdd=rdd1.intersection(rdd2);
List<String> collect=intersection.collect();
for(String s:collect){
    System.out.println(s)
}

九、subtract
返回在RDD1中出现,但是不在RDD2中出现的元素,不去重

scala版本

val rdd1=sc.makeRDD(List("aa","bb","cc"))
val rdd2=sc.makeRDD(List("cc","bb","dd"))
val subtractRdd = rdd1.subtract(rdd2)
subtractRdd.collect.foreach(println)

java版本

JavaRDD<String> rdd1=sc.parallelize(Arrays.asList("aa","bb","cc"));
JavaRDD<String> rdd2=sc.parallelize(Arrays.asList("cc","bb","dd"));
JavaRDD<String> subtractRdd=rdd1.subtract(rdd2);
List<String> collect=subtract.collect();
for(String s:collect){
    System.out.println(s)
}

十、cartesian
返回Rdd1和Rdd2的笛卡儿积,这个开销非常大,慎用

scala版本

val rdd1 = sc.makeRDD(List("1","2","3"))
val rdd2 = sc.makeRDD(List("a","b","c"))
val cartesianRdd=rdd1.cartesian(rdd2)
cartesian.collect.foreach(println)

java版本

JavaRDD<String> rdd1 = sc.parallelize(Arrays.asList("1","2","3"));
JavaRDD<String> rdd2 = sc.parallelize(Arrays.asList("a","b","c"));
JavaRDD<String,String> cartesianRdd=rdd1.cartesian(rdd2);
List<Tuple2<String,String>> collect=cartesianRdd.collect();
for(Tuple2 t:collect){
    System.out.print(t);
}

十一、mapToPair
将每一行的第一个单词作为键,1 作为value创建pairRDD
scala版本
scala没有mapToPair,使用map就能完成

val conf=new SparkConf().setMaster("local[2]").setAppName("maptopair")
val sc=new SparkContext(conf)
val lines=sc.textFile("D:/text/sample.txt")
val pairs = lines.map(x=>(x.split(" ")(0),1))
pairs.collect.foreach(println)

java版本

SparkConf conf=new SparkConf().setMaster("local[2]").setAppName("mapToPairJava");
JavaSparkContext sc = new JavaSparkContext(conf);

JavaRDD<String> lines=sc.textFile("D:/text/sample.txt");
JavaPairRDD<String,Integer> pairRdd=lines.mapToPair(new PairFunction<String,String,Integer>(){
    @override
    public Tuple2<String,Integer> call(String s) throws Exception{
        String[] split=s.split(" ");
        String key = split[0];
        return new Tuple2<>(key,1);
    }
});
List<Tuple2<String,Integer>> collect=pairRdd.collect();
for(Tuple2
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值