java spark 教程_Spark基础教程——向Spark传递函数(Java篇)

Spark大部分转化操作和一部分行动操作,都需要依赖开发人员传递的函数进行计算。在Spark支持的3种开发语言(Java、Python、Scala)里,传递的方式略有不同。下面苦李介绍Java如何向Spark传递函数。

1、标准接口

在Java中,函数需要作为实现了Spark的org.apache.spark.api.java.function包中的任一函数接口的对象来传递。根据不同的返回类型,我们定义了一些不同的接口。

下面是标准的Java函数接口:函数名实现方法用途FunctionR call(T)接收一个输入值,并返回一个输出值,用于类似map()和filter()等操作中

Function2R call(T1, T2)接收两个输入值,并返回一个输出值,用于类似aggregate()和fold()等操作中

FlatMapFunctionIterable call(T)接收一个输入值,并返回任意个输出值,用于类似flatMap()等操作中

2、传递方法

在Java里,我们可以通过匿名内部类、具名类和lambda(java8中)的方式进行函数传递,下面通过统计日志文件中的404请求,依次给出代码示例。

(1)在java中使用匿名内部类进行函数传递JavaRDD lines = spark.read().textFile(args[0]).javaRDD();

JavaRDD lines_404 = lines.filter(

new Function() {

@Override

public Boolean call(String s) throws Exception {

return s.contains("404");

}

}

);

System.out.println(":::: 404 lines count: " + lines_404.count());

(2)在java中使用具名类进行函数传递JavaRDD lines = spark.read().textFile(args[0]).javaRDD();

class Contains_404 implements Function {

public Boolean call(String x) {

return x.contains("404");

}

}

JavaRDD lines_404 = lines.filter(new Contains_404());

System.out.println(":::: 404 lines count: " + lines_404.count());

具体使用哪种方式可以根据自己的编程习惯进行选择,苦李建议大家在大型项目中最好使用具名类的方式进行参数传递,这种方式可以让我们的代码更加清晰,提升可读性,而且这种方式可以让我们在构造函数中添加参数。

例如,修改过的代码:class Contains_404 implements Function {

private String query_str;

private Contains_404(String query_str){

this.query_str = query_str;

}

public Boolean call(String x) {

return x.contains(query_str);

}

}

JavaRDD lines_404 = lines.filter(new Contains_404("404"));

System.out.println(":::: 404 lines count: " + lines_404.count());

(3)在Java8中,还可以通过lambda的方式进行函数传递

在java8里,我们还可以通过lambda的方式进行函数传递,上述代码可精简如下:JavaRDD lines = spark.read().textFile(args[0]).javaRDD();

JavaRDD lines_404 = lines.filter(s -> s.contains("404"));

System.out.println(":::: 404 lines count: " + lines_404.count());

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值