【发布时间】:2016-05-06 06:52:03
【问题描述】:
我是 spark 新手,并试图了解普通 RDD 和对 RDD 之间的区别。与普通 RDD 相比,使用 pair RDD 的用例是什么?如果可能的话,我想通过一个例子来了解 Pair RDD 的内部结构。谢谢
【问题讨论】:
标签: apache-spark
我是 spark 新手,并试图了解普通 RDD 和对 RDD 之间的区别。与普通 RDD 相比,使用 pair RDD 的用例是什么?如果可能的话,我想通过一个例子来了解 Pair RDD 的内部结构。谢谢
【问题讨论】:
标签: apache-spark
Pair RDD 只是引用包含键/值对(即数据元组)的 RDD 的一种方式。这并不是使用一个而不是使用另一个的问题。例如,如果您想根据 ID 计算某些内容,您可以按 ID 将输入分组在一起。这个例子只是分割了一行文本,并使用第一个单词作为键 [1] 返回一个 Pair RDD:
val pairs = lines.map(x => (x.split(" ")(0), x))
您最终得到的 Pair RDD 允许您减少值或根据键对数据进行排序,仅举几个例子。
阅读底部的链接可能对你有好处,我无耻地复制了这个例子,因为理解 Pair RDD 以及如何使用元组对于你将要做的许多事情都是非常基础的火花。阅读“对 RDD 的转换”,以了解一旦你有了你的对,你通常会想要做什么。
[1]https://www.safaribooksonline.com/library/view/learning-spark/9781449359034/ch04.html
【讨论】:
主要区别在于:
pairRDD 操作(如 map、reduceByKey 等)产生键值对。而 RDD 上的操作(例如 flatMap 或 reduce)为您提供值的集合或单个值
pairRDD 操作并行应用于每个键/元素。RDD 上的操作(如 flatMap)应用于整个集合。
【讨论】:
Spark 对包含键/值对的 RDD 提供特殊操作。这些 RDD 称为对 RDD。 Pair RDD 在许多程序中是一个有用的构建块,因为它们公开了允许您并行处理每个键或跨网络重新组合数据的操作。例如,pair RDD 有一个 reduceByKey() 方法可以为每个 key 单独聚合数据,还有一个 join() 方法可以通过将具有相同 key 的元素分组来将两个 RDD 合并在一起。从 RDD 中提取字段(例如表示事件时间、客户 ID 或其他标识符)并将这些字段用作 Pair RDD 操作中的键是很常见的。
【讨论】:
PairRDD 是 KEY/VALUE 对。
示例: 如果您有一个包含某个国家/地区机场详细信息的 csv。 我们通过从路径读取该 CSV 来创建正常的 RDD。(列:机场 ID、机场名称、机场服务的主要城市、机场所在的县)
JavaRDD<String> airports = sc.textFile("in/airports.text");
如果我们想要一个包含机场名称和所在国家/地区的 RDD,这里我们必须从上面的 RDD 创建对 RDD。
JavaPairRDD<String,String> AirportspairRDD = airports.mapToPair((PairFunction<String, String, String>) s -> {
return new Tuple2<>(s.split(",")[1],s.split(",")[3]);
});
【讨论】: