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》