一、背景知识
RDD : Resilient Distributed DataSet
回弹性 分布式 数据集合
什么是 Resilient /rɪˈzɪliənt/ ? 英文解释是这样的:
able to recoil or spring back into shape after bending, stretching,
or being compressed.(
其形状能够在弯曲、拉伸、被压缩后 恢复回原来的模样)
那么 Resilient
应用到 RDD 中是什么意思?这需要引入 RDD 操作的另一个概念:Map。
Map 是什么? Java 中有 HashMap 集合类(使用Hash算法实现的Map)
HashMap 的对象是 (Key, Value) 格式的。即:一个键 映射 一个值。
这里的 Map 也是这个意思:映射。把一个 RDD 映射为 一个新的 RDD,
通过某种映射规则(函数)。 RDD 映射完成后,还可以恢复到映射前的样子。
二、reduceByKey() 函数
在 Apache Spark 的 Quick Start 页面 有这么一行代码,是关于 MapReduce 的概念及用法的。
//
//该行代码用来统计 ReadMe.md 文件中,每个单词出现的次数。
//
scala> val textFile = sc.textFile("README.md")
scala> val wordCounts = textFile
.flatMap(line => line.split(" "))
.map(word => (word, 1))
.reduceByKey((a, b) => a + b)
scala> wordCounts.collect()
//res6: Array[(String, Int)] = Array((means,1), (under,2), (this,3),
// (Because,1), (Python,2), (agree,1), (cluster.,1), ...)
//
//
其中有这么一个函数: reduceByKey((a, b) => a + b)
经过查看 API,现记录如下:
________________________________________________________________________________
- reduceByKey(func, [numTasks])
________________________________________________________________________________
When called on a dataset of (K, V) pairs,
returns a dataset of (K, V) pairs where the values for each key
are aggregated using the given reduce function func, which must
be of type (V,V) => V.
Like in groupByKey, the number of reduce tasks is configurable
through an optional second argument.
------------------------------------------------------------------------------
解释:
reduceByKey 函数应用于(Key,Value)格式的数据集。
reduceByKey 函数的作用是把 key 相同的合并。
reduceByKey 函数同样返回一个(Key,Value)格式的数据集。
reduceByKey 函数的参数 func 的格式:(V,V) => V.
即:两个 value 作为参数;必须返回一个 Value 格式的数据。
________________________________________________________________________________
故:reduceByKey((a, b) => a + b) 的完整写法应该是这样的(大概意思):
function reduceByKey( function(value_a, value_b){
return value_a + value_b;
});
最后:
关于 Lambda 表达式,请参看我的这篇技术博文:
Java 8 之新特性介绍 及 Lambda 表达式
引用:
Apache Spark - Quick Start
http://spark.apache.org/docs/latest/quick-start.html
Apache Spark - Programming Guid: Transformations
http://spark.apache.org/docs/latest/programming-guide.html#transformations
-
转载请注明,
原文出处:http://lixh1986.iteye.com/blog/2345420
-
分享到:
相关推荐
### Apache Spark源码走读之3 -- Task运行期之函数调用关系分析 #### 概述 Apache Spark作为一款高效的大数据处理框架,在其内部有着复杂的任务调度与执行机制。本文将深入探讨Spark中Task执行期间的具体流程以及...
在Java、Scala和Python中,都通过textFile方法读取数据,使用flatMap、mapToPair和reduceByKey等函数进行数据转换和聚合,最后将结果保存到文件系统。 - DataFrame API是Spark SQL的一部分,它提供了类似于SQL的...
例如,`map`、`filter`、`reduceByKey`等都是典型的Transformation算子,它们不会立即执行,而是在触发Action操作时才会被执行。 - **其他代码**:除了Transformation算子之外,大部分代码(如变量定义、函数声明等...
在Spark中,我们还可以利用DataFrame和Dataset的转换操作,比如`map()`、`flatMap()`和`reduceByKey()`,对数据进行进一步处理。同时,Spark SQL支持将DataFrame注册为临时表,然后使用SQL查询语言进行查询,这对于...
"Spark期末复习题总结" ...10. Spark中的reduceByKey操作是一个action操作,例如val key = Array(1, 2); val value = Array("one","two"); val m = key.zip(value).toMap返回结果为m(1) 等于 "one"。
6. reduceByKey(func): 对每个键对应的值进行函数 func 的合并操作,结果以键值对的形式返回。 7. groupByKey(numPartitions): 把相同键的值聚合成一个集合,结果为键和值的集合的集合。 8. sortByKey(ascending, ...
4. **转换(Transformations)**:RDD、DataFrame和Dataset可以进行一系列转换,如`map()`, `filter()`, `flatMap()`, `groupByKey()`, `reduceByKey()`, `join()`, `distinct()`等。这些转换定义了数据处理逻辑,但...
3. **reduceByKey()**: 在键值对的RDD上操作,将具有相同键的所有值聚合在一起,使用用户定义的合并函数。这在处理分组数据时非常有用,例如计算每个类别下的总和或平均值。 4. **join()**: 将两个或多个RDD按照...
- **聚合数据**:使用`reduceByKey()`函数对键值对进行聚合,将相同单词的计数累加。 - **输出结果**:最后,使用`collect()`方法将结果收集到本地并打印。 **3. 关键API详解** - `flatMap()`: 将每个输入元素...
3. 计算词频:使用`map()`函数对每个单词生成键值对(word, 1),然后通过`reduceByKey()`函数进行聚合,实现相同单词的计数。 4. 结果输出:最后,使用`collect()`或`saveAsTextFile()`方法将结果收集或保存到指定...
在Spark中,可以使用`reduceByKey`和`takeOrdered`函数组合来实现。`reduceByKey`将相同键的数据聚合在一起,计算每个键的值(如出现次数),然后`takeOrdered`根据值进行排序并取前N个。 ```scala val topN = data...
在Spark中,可以使用`reduceByKey`或`distinct`操作来实现。首先,将两个文件的内容合并为一个DataFrame或RDD,然后通过`reduceByKey(_ + _)`对键值对进行合并,最后用`distinct()`去除重复项。 2. 求平均值:这个...
转换操作如`map`、`filter`和`reduceByKey`,它们不会立即执行,而是创建一个新的RDD。而动作如`count`、`collect`和`save`则会触发实际的计算,并返回结果或者将数据写入持久化存储。这种延迟计算(lazy evaluation...
3. 处理数据:`counts = lines.rdd.flatMap(lambda line: line.split()).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a + b)` 4. 显示结果:`counts.collect()` 以上只是基本操作的概述,实际的样例代码...
4. **reduceByKey**:对key-value对执行reduce操作,相同key的值会被聚合。 5. **groupByKey**:将具有相同key的元素分组,返回一个键值对RDD,其中键对应于原始键,值是一个包含该键所有原始值的迭代器。 6. **...
5. **数据处理**:对DStream应用转换操作,例如map、filter、reduceByKey等,进行数据清洗和分析。 6. **输出结果**:将处理后的数据写入持久化存储,如HDFS、数据库,或者使用foreachRDD直接输出到控制台或其他系统...
Spark提供了`pairWithSingleton()`方法,将每个单词映射到1,然后使用`reduceByKey()`来计算每个单词的出现次数: ```java JavaPairRDD, Integer> wordCounts = words.mapToPair(word -> new Tuple2(word, 1)) ....
然后,通过`reduceByKey`对所有("pv", 1)元组按键聚合,累加每个键对应的值,最后收集并打印结果。 2. 计算独立访客量(UV) 这个案例与PV计算类似,但关注的是独立访客。我们首先同样创建Spark配置和上下文,然后...