写点什么

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:309792
用户头像

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

关注

评论

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

敏捷团队的最佳测试实践:自动化金字塔

禅道项目管理

测试 自动化测试

华为云PB级数据库GaussDB(for Redis)揭秘:如何搞定推荐系统存储难题

华为云开发者联盟

数据库 推荐系统 存储 华为云 GaussDB(for Redis)

深入分析3种线程池执行任务的逻辑方法

华为云开发者联盟

Java 线程 线程池 ThreadPoolExecutor类

云小课|细数那些VMware虚拟机的恢复招式

华为云开发者联盟

vmware 云小课 云备份 VMware恢复 恢复数据

架构学习模块一

George

国产接口管理工具APIPOST中的常见设置项

Proud lion

大前端 后端 Postman 开发工具 接口文档

聊聊什么样的代码是可读性强的代码?

卢卡多多

代码质量 代码 9月日更

电信运营商基于 MQTT 协议构建千万级 IoT 设备管理平台

EMQ映云科技

物联网 IoT mqtt 通信运营商 emq

netty系列之:搭建自己的下载文件服务器

程序那些事

Java Netty io nio 程序那些事

API与ESB 、ServiceMesh、微服务究竟关系如何?

BoCloud博云

云管理

第一波场DAPP系统搭建,DAPP介绍

合肥艾数199四②43⑧797

值钱的数据放在云上安全吗?怎样才能保障其安全性?

行云管家

网络安全 信息安全 数据安全 企业上云

服务器运维是什么意思?日常工作包含哪些?

行云管家

运维 服务器 IT运维 服务器运维

再启动!零代码第四期训练营报名开放中

明道云

祝贺 StreamNative 工程师张勇成功跻身 Apache BookKeeper Committer

Apache Pulsar

bookKeeper Apache Pulsar StreamNative

浪潮云说丨上云迁移——快,准,稳!

云计算

❤️用武侠小说的形式来阅读LinkedList的源码,绝了!

沉默王二

Java

携手伙伴,共赴星海-百度飞桨应急行业AI私享会成功举办

百度大脑

人工智能 飞桨

一周信创舆情观察(8.23~8.29)

统小信uos

柯基数据通过Rainbond完成云原生改造,实现离线持续交付客户

北京好雨科技有限公司

云原生 需求落地 离线部署 可持续交付

就靠这一篇文章,我就弄懂了 Python Django 的 django-admin 命令行工具集

梦想橡皮擦

9月日更

企业级即时通信市场能否告别“孤岛时代”?

BeeWorks

移动数字化底座 企业即时通讯平台 移动数字化平台 即时通讯IM 移动办公

拥抱开源,云智慧发布AIOps社区

BeeWorks

阅读

国资云横空出世,云上安全监管再加码

行云管家

云计算 数据安全 企业上云 国资云

波场链DAPP智能合约系统搭建|波场链DAPP开发

Geek_23f0c3

DAPP智能合约交易系统开发 波场DAPP 波场链DAPP开发

如何设计企业特色的数字化转型架构?

博文视点Broadview

华为云IoT如何连接边缘和云,实现海量IoT数据就地处理的技术实践

华为云开发者联盟

IoT 边缘 IoT边缘 实时数据 IoT Edge

全球教育行业机构遭受的攻击增长了 29%

BeeWorks

阅读

Dogfooding-爱奇艺移动端后台灰度环境优化实践

爱奇艺技术产品团队

测试 开发 灰度发布

IDC:2021年全球大数据和分析支出预计达2157亿美元

BeeWorks

阅读

如何采购ARM六核RK3399安卓工控开发主板?

双赞工控

安卓主板 工控主板 rk3399主板

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