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

分享 青牛 ⋅ 于 2016-12-05 19:28:29 ⋅ 最后回复由 青牛 2016-12-25 02:16:31 ⋅ 4572 阅读

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<String> textFile = sc.textFile("hdfs://...");
JavaRDD<String> words = textFile.flatMap(new FlatMapFunction<String, String>() {
  public Iterable<String> call(String s) {
    return Arrays.asList(s.split(" "));
  }
});
JavaPairRDD<String, Integer> pairs = words.mapToPair(new PairFunction<String, String, Integer>() {
  public Tuple2<String, Integer> call(String s) {
    return new Tuple2<String, Integer>(s, 1);
  }
});
JavaPairRDD<String, Integer> counts = pairs.reduceByKey(new Function2<Integer, Integer, Integer>() {
  public Integer call(Integer a, Integer b) {
    return a + b;
  }
});
counts.saveAsTextFile("hdfs://...");

这么一个小例子,你就可以发现scala 用3行代码,而java要10几行代码。作为java忠实粉丝有点不甘心,呵呵。
我们用java8 试一试:

JavaRDD<String> textFile = sc.textFile("hdfs://...");
JavaPairRDD<String, Integer> counts = textFile.flatMap(line -> Arrays.asList(line.split(" ")).iterator())
    .mapToPair(w -> new Tuple2<String, Integer>(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

版权声明:原创作品,允许转载,转载时务必以超链接的形式表明出处和作者信息。否则将追究法律责任。来自海汼部落-青牛,http://hainiubl.com/topics/14
本帖由 青牛 于 6年前 解除加精
点赞
成为第一个点赞的人吧 :bowtie:
回复数量: 1
  • 青牛 海汼部落创始人,80后程序员一枚,曾就职于金山,喜欢倒腾技术做产品
    2016-12-25 02:16:31

    scala也使用Java虚拟机,Java表示不服。

暂无评论~~
  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,可用Emoji的自动补全, 在输入的时候只需要 ":" 就可以自动提示了 :metal: :point_right: 表情列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif,教程
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
Ctrl+Enter