写点什么

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

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

关注

评论

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

TiCDC 应用场景解析

TiDB 社区干货传送门

实践案例

【TiDB 最佳实践系列】HAProxy

TiDB 社区干货传送门

实践案例

速度收藏!TiDB 读、写性能慢问题排查思路汇总

TiDB 社区干货传送门

管理与运维

TiDB 在茄子科技的应用实践及演进

TiDB 社区干货传送门

实践案例

TiDB 在金融场景里面那些不得不说的事

TiDB 社区干货传送门

【优质技术文章推荐】TiDB for PostgreSQL—牛刀小试

TiDB 社区干货传送门

实践案例

TiDB-4.0.0-rc-性能测试

TiDB 社区干货传送门

TiDB in Action 开源电子书

TiDB 社区干货传送门

【理财实践】 开科唯识-互联网理财为什么会选TiDB

TiDB 社区干货传送门

体验升级至4.0

TiDB 社区干货传送门

TiDB 在小米的落地及云原生探索

TiDB 社区干货传送门

TiUP升级TiFlash重启失败解决方案

TiDB 社区干货传送门

TiDB v5.1 体验: 我用 TiDB 训练了一个机器学习模型

TiDB 社区干货传送门

TIDB 3.0.5 性能压测

TiDB 社区干货传送门

数据库架构选型

Tiflash 尝鲜小案例

TiDB 社区干货传送门

管理与运维

TiDB 性能分析工具——PProf

TiDB 社区干货传送门

TiDB 底层架构

TIDB--不容易发现的 lightning tidb-backend 模式导入优化

TiDB 社区干货传送门

迁移 性能调优 TiDB 底层架构 管理与运维 性能测评

隐藏esc坑之jbd2进程io占用奇高 系统长期io占用100%

TiDB 社区干货传送门

故障排查/诊断

如何分析和解决 TiDB 4.0 的写热点问题

TiDB 社区干货传送门

TiDB 多Socket 服务器性能扩展问题分析-续

TiDB 社区干货传送门

性能调优 性能测评

insert引发的TiDB hang死血案(案情一)

TiDB 社区干货传送门

故障排查/诊断

TiDB 与 Flink 联合发布实时数仓最佳实践白皮书

TiDB 社区干货传送门

TiFlash5.0.1与4.0.10 对比测试

TiDB 社区干货传送门

版本测评

记一场DM同步引发的Auto_Increment主键冲突漫谈

TiDB 社区干货传送门

故障排查/诊断

记一次使用TiUP半自动升级TiDB集群经验

TiDB 社区干货传送门

版本升级

HTAP 会成为数据库的未来吗?

TiDB 社区干货传送门

TiDB升级、TiFlash测试及对比ClickHouse

TiDB 社区干货传送门

解决方案之:DM relay 处理单元报错

TiDB 社区干货传送门

以TiDB热点问题来谈Region的调度流程

TiDB 社区干货传送门

实践案例

内容主数据 TiDB 集群写入热点优化实践

TiDB 社区干货传送门

猜一猜 TiDB 4.0 GA 第一个上线用户花落谁家?有惊喜!

TiDB 社区干货传送门

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