Spark API

本文介绍了Spark RDD API中关键的几个操作:aggregate通过seqOp和combOp函数聚合数据;aggregateByKey针对相同key进行局部聚合;cartesian计算两个RDD的笛卡尔积;coalesce和repartition用于调整RDD分区数。

Spark RDD API使用说明(一)

1、aggregate

1.1  函数声明

def aggregate[U: ClassTag](zeroValue: U)(seqOp: (U, T) => U, combOp: (U, U)=> U): U

1.2函数说明

aggregate函数通过两个函数来操作RDD。第一个reduce函数(seqOp)对每个partition聚合,然后将初始值(zeroValue)和所有partitions的结果进行(combOp)操作,生成最终结果。应用两个reduce函数十分方便,比如:第一个用于求各个partition的最大值,第二个用于汇总每个partition的和。

1.3  实例

scala> def seqOp(a:Int , b:Int) : Int = {
     | math.max(a, b)
     | }
seqOp: (a: Int, b: Int)Int

scala> def combOp(a:Int, b:Int) : Int = {
     | a + b
     | }
combOp: (a: Int, b: Int)Int

scala> val v = sz.parallelize(List(1,2,3,4,5,6), 3)
scala> v.aggregate(4)(seqOp, combOp)
结果:18
计算过程:
	首先分为三个区:(1,2) ,(3,4) ,(5,6)
	然后 调用max(4,1,2),max(4,3,4),max(4,5,6)。计算三个区的结果分别为:4,4,6
	在对三个区和初始值4进行聚合:4+4=8;8+4=12;12+6=18
注意:初始值zeroValue使用了两次:1在各个partition使用;2,对partition合并的适合使用

2、aggregateByKey

2.1函数声明       

def aggregateByKey[U](zeroValue: U)(seqOp: (U, V) ⇒ U, combOp: (U, U) ⇒ U)(implicitarg0: ClassTag[U]): RDD[(K, U)]
def aggregateByKey[U](zeroValue: U, numPartitions: Int)(seqOp: (U, V) ⇒ U, combOp: (U, U) ⇒ U)(implicitarg0: ClassTag[U]): RDD[(K, U)]
def aggregateByKey[U](zeroValue: U, partitioner: Partitioner)(seqOp: (U, V) ⇒ U, combOp: (U, U) ⇒ U)(implicitarg0: ClassTag[U]): RDD[(K, U)]

2.2 函数说明

         和aggregate类似,区别是:1,只对具有相同key的值进行聚合;2,初始值只出现在第一个reduce函数(seqOp)

2.3 实例        

val pariRDD = sc.parallelize(List( ("cat", 2), ("cat", 5),("mouse", 4), ("cat", 12), ("dog", 12),("mouse", 2)), 2)
 //定义函数,显示分区情况
def func(index:Int, iter:Iterator[(String, Int)]):Iterator[String] = {
           iter.toList.map(x => "[partID:" +index + ", val:" + x + "]").iterator
}
//查看分区情况
pairRDD.mapPartitionsWithIndex(func).collect
//结果:Array[String]= Array([partID:0, val:(cat,2)], [partID:0, val:(cat,5)], [partID:0,val:(mouse,4)], [partID:1, val:(cat,12)], [partID:1, val:(dog,12)], [partID:1,val:(mouse,2)])
pairRDD.aggregateByKey((0))(math.max(_,_),_+_).collect
//结果:Array[(String,Int)] = Array((dog,12), (cat,17), (mouse,6))
pairRDD.aggregateByKey(100)(math.max(_,_), _ + _).collect
//结果:Array((dog,100), (cat,200), (mouse,200))

3、cartesian

3.1函数声明

def cartesian[U:ClassTag](other: RDD[U]): RDD[(T, U)]

3.2 函数说明

         计算两个RDD的笛卡尔积,然后返回一个新的RDD(注意:应用此函数内存消耗很快)

3.3 实例

valx = sc.parallelize(List(1,2,3,4,5))
val y = sc.parallelize(List(6,7,8,9,10))
x.cartesian(y).collect
res0: Array[(Int, Int)] = Array((1,6),(1,7), (1,8), (1,9), (1,10), (2,6), (2,7), (2,8), (2,9), (2,10), (3,6), (3,7),(3,8), (3,9), (3,10), (4,6), (5,6), (4,7), (5,7), (4,8), (5,8), (4,9), (4,10),(5,9), (5,10))

4、coalesce,repartition

4.1函数声明

         def coalesce ( numPartitions : Int , shuffle : Boolean = false ): RDD [T]

def repartition( numPartitions : Int ): RDD [T]

4.2 函数说明

         将partition合并成指定数目的partition

4.3实例

val y = sc.parallelize(1 to 10, 10)
val z = y.coalesce(2, false)
z.partitions.length
结果: Int = 2

### 关于 Spark API 文档和使用案例 Apache Spark 提供了一套全面的官方文档,涵盖了核心功能以及各个模块的具体实现细节。以下是关于如何获取 Spark API 的文档及相关使用案例的信息。 #### 官方文档资源 Spark 官网提供了详细的 API 文档,适用于不同编程语言绑定(Scala、Java、Python 和 R)。这些文档可以通过访问 Apache Spark 的官方网站找到[^4]。具体路径如下: - **Scala/Java**: `https://spark.apache.org/docs/latest/api/java/index.html` - **Python (PySpark)**: `https://spark.apache.org/docs/latest/api/python/index.html` - **R (SparkR)**: `https://spark.apache.org/docs/latest/sparkr.html` 每种语言都有对应的函数定义、参数描述及其返回值说明。此外,在每个类或方法页面下方通常会附带一些简单的代码示例来展示其基本用法。 #### 使用实例分析 下面是一些常见的 Spark 功能及其实现方式的例子: 1. **读取整个文件作为单条记录** 新增的方法 `SparkContext.wholeTextFiles` 可用于处理小型文本文件并将它们视为单独的数据项[^1]。 ```python from pyspark import SparkConf, SparkContext conf = SparkConf().setAppName("Whole Text Files Example") sc = SparkContext(conf=conf) fileRDD = sc.wholeTextFiles("/path/to/directory/") ``` 2. **调整 Shuffle Service 名称** 如果需要更改默认 shuffle 服务名,则需同步修改 YARN 配置与 Spark 应用程序设置中的对应字段[^2]。例如: ```bash spark.shuffle.service.name=my_custom_shuffle_service_name yarn.nodemanager.aux-services=my_custom_shuffle_service_name ``` 3. **解决 SQL Optimizer 迭代次数不足问题** 当遇到优化器迭代上限错误时,可通过增加配置项 `spark.sql.optimizer.maxIterations` 来解决问题[^3]。此操作应在启动 SparkSession 或 SparkContext 前完成设定。 ```scala val session = SparkSession.builder() .appName("SQL Optimization Adjustment") .config("spark.sql.optimizer.maxIterations", "200") // 设置更高数值 .getOrCreate() ``` #### 社区支持与其他学习材料 除了官方文档外,还有许多第三方教程可以帮助理解并实践 Spark API 的高级特性。推荐关注以下几个平台上的相关内容: - Databricks Academy – 提供免费课程讲解各种场景下的最佳实践; - Stack Overflow – 用户分享的经验贴往往能快速定位特定需求解决方案; - GitHub 上开源项目源码阅读也是提升技能的好办法之一;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值