写点什么

Lambda 表达式让 Spark 编程更容易

  • 2014-04-16
  • 本文字数:1224 字

    阅读完需:约 4 分钟

近日,Databricks 官方网站发表了一篇博文,用示例说明了lambda 表达式如何让Spark 编程更容易。文章开头即指出,Spark 的主要目标之一是使编写大数据应用程序更容易。Spark 的Scala 和Python 接口一直很简洁,但由于缺少函数表达式,Java API 有些冗长。因此,随着Java 8 增加了 lambda 表达式,他们更新了 Spark 的 API。Spark 1.0 将提供 Java 8 lambda 表达式支持,而且与 Java 的旧版本保持兼容。该版本将在 5 月初发布。

文中举了两个例子,用于说明 Java 8 如何使代码更简洁。第一个例子是使用 Spark 的 filter 和 count 算子在一个日志文件中查找包含“error”的行。这很容易实现,但在 Java 7 中需要向 filter 传递一个 Function 对象,这有些笨拙:

复制代码
JavaRDD<String> lines = sc.textFile("hdfs://log.txt").filter(
new Function<String, Boolean>() {
public Boolean call(String s) {
return s.contains("error");
}
});
long numErrors = lines.count();

在 Java 8 中,代码更为简洁:

复制代码
JavaRDD<String> lines = sc.textFile("hdfs://log.txt")
.filter(s -> s.contains("error"));
long numErrors = lines.count();

当代码更长时,对比更明显。文中给出了第二个例子,读取一个文件,得出其中的单词数。在 Java 7 中,实现代码如下:

复制代码
JavaRDD<String> lines = sc.textFile("hdfs://log.txt");
// 将每一行映射成多个单词
JavaRDD<String> words = lines.flatMap(
new FlatMapFunction<String, String>() {
public Iterable<String> call(String line) {
return Arrays.asList(line.split(" "));
}
});
// 将单词转换成 (word, 1) 对
JavaPairRDD<String, Integer> ones = words.mapToPair(
new PairFunction<String, String, Integer>() {
public Tuple2<String, Integer> call(String w) {
return new Tuple2<String, Integer>(w, 1);
}
});
// 分组并按键值添加对以产生计数
JavaPairRDD<String, Integer> counts = ones.reduceByKey(
new Function2<Integer, Integer, Integer>() {
public Integer call(Integer i1, Integer i2) {
return i1 + i2;
}
});
counts.saveAsTextFile("hdfs://counts.txt");

而在 Java 8 中,该程序只需要几行代码:

复制代码
JavaRDD<String> lines = sc.textFile("hdfs://log.txt");
JavaRDD<String> words =
lines.flatMap(line -> Arrays.asList(line.split(" ")));
JavaPairRDD<String, Integer> counts =
words.mapToPair(w -> new Tuple2<String, Integer>(w, 1))
.reduceByKey((x, y) -> x + y);
counts.saveAsTextFile("hdfs://counts.txt");

要了解更多关于 Spark 的信息,可以查看官方文档。Spark 只需下载解压即可运行,而无须安装。


感谢辛湜对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-04-16 00:309426
用户头像

发布了 256 篇内容, 共 88.8 次阅读, 收获喜欢 12 次。

关注

评论

发布
暂无评论
发现更多内容

跨域问题之Spring的跨域的方案

急需上岸的小谢

7月月更

新星计划Day2【JavaSE】 枚举类与注解

京与旧铺

7月月更

MySQL灵魂16问,你能撑到第几问?

了不起的程序猿

Java MySQL 面试题 java程序员

你以为,设计一个RPC框架很简单?应该从哪入手,深入剖析? Java架构新资讯

了不起的程序猿

Java RPC java程序员 java 编程

PPT制作

逝缘~

PPT 7月月更

Java基础:IO流最全汇总

百思不得小赵

io Java’ 7月月更

GitHub标星1w+超牛的微服务项目,开发脚手架

冉然学Java

Java 编程 程序员 面试 Spring Cloud

Cgroup memory子系统

总想做点什么

深入理解Linux 进程管理之CFS负载均衡

C++后台开发

Linux 负载均衡 C++后台开发 进程管理 C++开发

机器学习-异常检测

AIWeker

机器学习 异常检测 7月月更

wxPython界面设计初体验-值得学习的 Python GUI 库 (2)

迷彩

GUI 7月月更 WxPython

重新签名 iOS 51启蒙英语 App

贾献华

7月月更

【玩转 RT-Thread】I2C 内核

攻城狮杰森

I2C协议 7月月更 RT-Thread

TCP拥塞控制详解 | 4. 控制算法

俞凡

算法 网络 TCP拥塞控制

微信小程序骨架屏的应用与实现步骤

猪痞恶霸

微信小程序 前端 7月月更

Flutter 实现爱心三连动画效果

岛上码农

flutter ios 安卓 移动端开发 7月月更

Java 技术栈中间件优雅停机方案设计与实现全景图

bin的技术小屋

dubbo 优雅停机 netty SpringFramework Graceful Shutdown

DFINITY 整合技术解读——阈值ECDSA 实现 IC 与比特币、以太坊整合

TinTinLand

去中心化的底层是共识——Polkadot 混合共识机制解读

One Block Community

Qt|实现边加载数据边显示页面

中国好公民st

qt 7月月更

Arbitrum 推出 AnyTrust 链,满足生态项目多元需求

TinTinLand

携手共建安全生态|海泰方圆正式加入申威产业发展联盟

电子信息发烧客

基于STM32+华为云IOT设计的智能家居控制系统_语音+环境检测

DS小龙哥

7月月更

ThreeJS 动画之 Noisy Lines

南城FE

CSS 前端 动画 7月月更

彻底清除本地的MySQL数据库

Java学术趴

7月月更

什么时候会触发fullGC

技术小生

JVM GC 7月月更

【C语言】进阶指针Two

謓泽

7月月更

面试官灵魂暴击:如何保障消息100%投递成功及保证消息的幂等性?

冉然学Java

Java后端 #技术干货#

Substrate 技术及生态6月大事记 | Polkadot Decoded 圆满落幕,黑客松获胜项目为生态注入新生力量

One Block Community

PoS机制随机性解读,波卡的随机性原理如何运作?

One Block Community

第三届中国工业互联网大赛在杭州闭幕 第四届大赛即日启动

科技热闻

Lambda表达式让Spark编程更容易_语言 & 开发_马德奎_InfoQ精选文章