chenqb 发表于 2019-1-30 14:35:22

使用 Java8 也能写出优雅的 Spark 应用

Spark是目前大数据生态中比较活跃的一个项目,但Spark是scala语言开发,scala语言语法灵活,能够写出优雅的函数式编程的代码。对于一般初学大数据的朋友来说,有可能大部分都是会java语言的,Spark支持scala,java,python api接口,但是如果使用java7或java6编写Spark应用就有点繁琐了,到处都是匿名类,你再看看scala代码,你会很羡慕,这时你可能要去学scala。对于老司机来讲,学习一门语言应该很快,也能够自由切换状态,但是新手就会比较有压力。如果你是初学者或只是Spark应用开发,而且只会java语言的话,那我建议你使用java8开发spark应用,而不要去从头学习scala,等你成为老司机或者需要深入研究Spark的时候再去学习Scala也可以。重要是你能够快速的用spark解决你的大数据问题,能够先把spark用起来。
我们来几段代码对比一下,经典的wordcount:
scala版:
val textFile = sc.textFile("hdfs://...")val counts = textFile.flatMap(line => line.split(" "))
               .map(word => (word, 1))
               .reduceByKey(_ + _)counts.saveAsTextFile("hdfs://...")java7/6版:
JavaRDD textFile = sc.textFile("hdfs://...");JavaRDD words = textFile.flatMap(new FlatMapFunction() {
public Iterable call(String s) {
    return Arrays.asList(s.split(" "));
}});JavaPairRDD pairs = words.mapToPair(new PairFunction() {
public Tuple2 call(String s) {
    return new Tuple2(s, 1);
}});JavaPairRDD counts = pairs.reduceByKey(new Function2() {
public Integer call(Integer a, Integer b) {
    return a + b;
}});counts.saveAsTextFile("hdfs://...");这么一个小例子,你就可以发现scala 用3行代码,而java要10几行代码。作为java忠实粉丝有点不甘心,呵呵。
我们用java8 试一试:
JavaRDD textFile = sc.textFile("hdfs://...");JavaPairRDD counts = textFile.flatMap(line -> Arrays.asList(line.split(" ")).iterator())
    .mapToPair(w -> new Tuple2(w, 1))
    .reduceByKey((x,y) -> x + y);counts.saveAsTextFile("hdfs://...");跟scala比还是差点,但也挽回不少颜面。所有说你用java8也可以写出比较优雅的Spark应用。
java8支持lambda表达式和Stream API等新特性,java8 变得更灵活,java7已经停止更新,hadoop社区也在增加java8 的支持,相信不就将来java8将称为主流。如果对java8 感兴趣可以下面两篇文章:
《Java8新特性详解-Lambda表达式》
《Java8新特性详解-Stream API》
  




页: [1]
查看完整版本: 使用 Java8 也能写出优雅的 Spark 应用