【spark使用】2.向Spark算子中传递函数方式

介绍

filter的例子
例1:Python 版本筛选的例子

lines = sc.textFile("README.md")
pythonLines = lines.filter(lambda line: "Python" in line)

例2:Scala 版本筛选的例子

val lines = sc.textFile("README.md") // 创建一个叫lines的RDD
val pythonLines = lines.filter(line => line.contains("Python"))

如果你对例1 和例2 中的lambda 或者=> 语法不熟悉,可以把它们理解为Python 和 Scala 中定义内联函数的简写方法。当你在这些语言中使用Spark 时,你也可以单独定义一个函数,然后把函数名传给Spark。比如,Python 中可以这样做:

def hasPython(line):
    return "Python" in line
pythonLines = lines.filter(hasPython)

在Java 中向Spark 传递函数也是可行的,但是在这种情况下,我们必须把函数定义为
实现了Function 接口的类。例如:

JavaRDD<String> pythonLines = lines.filter(
     new Function<String, Boolean>() {
       Boolean call(String line) { return line.contains("Python"); }
     }
);

注意参数类型,前面是输入类型,后面是返回类型,这里是filter函数,需要用到Boolean类型的返回值来进行过滤
在这里插入图片描述

flatMap的小例子

public class test {
    public static void main(String[] args) {
   SparkConf conf = new SparkConf().setAppName("jiangtao_demo").setMaster("local");
        JavaSparkContext jsc = new JavaSparkContext(conf);
        JavaRDD lines = jsc.parallelize(Arrays.asList("pandas pip", "numpy", "pip", "pip", "pip"));
        JavaRDD<String> flatMapResult = lines.flatMap(new FlatMapFunction<String, String>() {
            @Override
            public Iterator<String> call(String line) throws Exception {
                return Arrays.asList(line.toString().split(" ")).iterator();
            }
        });

        flatMapResult.foreach(s -> {
            System.out.println(s);
        });
    }
}

在这里插入图片描述

最终输出的是这样的,在这flatMap函数需要得到一个Iterator迭代器类型的返回值,之后会将其拆分成单个元素

 // 与输入是一对多的关系,返回的是可迭代的lis
 // pandas
 // pip
 // numpy
 // pip
 // pip
 // pip

map的例子

public class test {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf().setAppName("jiangtao_demo").setMaster("local");
        JavaSparkContext jsc = new JavaSparkContext(conf);
        JavaRDD lines = jsc.parallelize(Arrays.asList("pandas pip", "numpy", "pip", "pip", "pip"));
        JavaRDD<Iterable<Tuple2<String, Integer>>> maprdd = lines.map(new Function<String, Iterable<Tuple2<String, Integer>>>() {
            public Iterable<Tuple2<String, Integer>> call(String line) throws Exception {
                String[] fields = line.split(" ");
                ArrayList<Tuple2<String, Integer>> al = new ArrayList<Tuple2<String, Integer>>();
                for (int i = 0; i < fields.length; i++) {
                    al.add(new Tuple2(fields[i], 1));
                }
                return al;
            }
        });
        
    }
}
        

将每行String类型转为Iterable<Tuple2<String, Integer>类型的

// [(pandas, 1),(pip, 1)]
// [(numpy, 1)]
// [(pip, 1)]
// [(pip, 1)]
// [(pip, 1)]

flatMapToPair的例子
是将每行元素拆分后 再转为键值对类型的RDD

JavaPairRDD<String, Integer> result1 = lines.flatMapToPair(new PairFlatMapFunction<String, String, Integer>() {
    @Override
    public Iterator<Tuple2<String, Integer>> call(String line) throws Exception {
        String[] fields = line.split(" ");
        ArrayList<Tuple2<String, Integer>> al = new ArrayList<Tuple2<String, Integer>>();
        for (int i = 0; i < fields.length; i++) {
            al.add(new Tuple2<String, Integer>(fields[i], 1));
        }
        return al.iterator();
    }
});

转后的结果为

(pandas,1)
(pip,1)
(numpy,1)
(pip,1)
(pip,1)
(pip,1)

lambda 简写语法

filter的例子
Java 8 提供了类似Python 和Scala 的lambda 简写语法。下面就是一个使用这种语法的
代码的例子:

JavaRDD<String> pythonLines = lines.filter(line -> line.contains("Python"));

flatMap的例子

JavaRDD<String> flatMapResult = lines.flatMap( line->Arrays.asList(line.toString().split(" ")).iterator());

map的例子

JavaRDD<Iterable<Tuple2<String, Integer>>> maprdd = lines.map(line -> {
     String[] fields = line.toString().split(" ");
     ArrayList<Tuple2<String, Integer>> al = new ArrayList<Tuple2<String, Integer>>();
     for (int i = 0; i < fields.length; i++) {
         al.add(new Tuple2(fields[i], 1));
     }
     return al;
 });

flatMap例子 return al.iterator();有红色波浪线但是运行是正常的,IDEA 中

 JavaPairRDD<String, Integer> result1 = lines.flatMapToPair(line-> {
     String[] fields = line.toString().split(" ");
     ArrayList<Tuple2<String, Integer>> al = new ArrayList<>();
     for (int i = 0; i < fields.length; i++) {
         al.add(new Tuple2<>(fields[i], 1));
     }
     return al.iterator();
 });

参考

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值