AICon 上海站|日程100%上线,解锁Al未来! 了解详情
写点什么

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

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

关注

评论

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

大厂边缘组VS小厂核心组,要怎么选?

王中阳Go

Go 面试 后端 面经 简历

ChatGPT功能更新:用户可将对话内容分享给搜索引擎

科技热闻

Spring 中如何控制 Bean 的加载顺序?

江南一点雨

Java spring

模型训练、结果存储、API 调用的系列优化|ModelWhale 版本更新

ModelWhale

ide 模型开发 模型服务

全新市场阶段,Partisia BlockChain 将向 RWA、DeFi 等领域布局

股市老人

全新市场阶段,Partisia BlockChain 将向 RWA、DeFi 等领域布局

石头财经

Partisia BlockChain 将向 RWA、DeFi 等领域布局,进入全新市场阶段

西柚子

Eudic欧路词典 for Mac(英语词典翻译查询工具) v4.6.5

Rose

专业级的音乐制谱软件Steinberg Dorico Pro for Mac中文破解版

Rose

全能pdf编辑阅读 PDF Reader Pro for mac v4.0.2直装激活版

Rose

即时通讯平台及门户系统WorkPlus打造移动应用管理平台

BeeWorks

Partisia BlockChain 将向 RWA、DeFi 等领域布局,进入全新市场阶段

股市老人

JWT 签名用对称加密还是非对称加密?

江南一点雨

Java spring spring security

全新市场阶段,Partisia BlockChain 将向 RWA、DeFi 等领域布局

加密眼界

全新范式的Layer1-Partisia BlockChain,向 RWA、DeFi 等领域布局

BlockChain先知

破除软件开发困局,基于容器平台的DevOps转型实践

华为云开发者联盟

容器 云原生 数字化转型 华为云 华为云开发者联盟

文献解读-遗传病-第四期|《来自印度的自称健康个体的 1029 个基因组揭示了流行且临床相关的心脏离子通道病变异》

INSVAST

基因数据分析 生信服务 遗传病测序 遗传病

Iris for Mac 轻松地录制屏幕、摄像头和麦克风

Rose

企业im即时通讯WorkPlus私有化部署适配国产信创环境

BeeWorks

C++中的注释作用

芯动大师

c++ 编程 语法

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