PySpark----Action操作

本文详细介绍了PySpark中的一系列Action操作,包括aggregate、aggregateByKey、collect、count、mean、reduce等,涵盖了数据聚合、数据收集、统计计算等多个方面,帮助理解如何在PySpark中对数据进行处理和分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.aggregate(zeroValue, seqOp, combOp)

2..aggregateByKey(zeroValue, seqFunc, combFunc, numPartitions=None, partitionFunc= )

3.collect方法

4.collectAsMap()

5.count()方法

6.countApprox(timeout, confidence=0.95)

7.countApproxDistinct(relativeSD=0.05)

8..countByKey()

9.countByValue()

10..first()

11.fold(zeroValue, op)

12.foreach(f)

13..foreachPartition(f)

14.getNumPartitions()

15.getStorageLevel()

16.id()

17.isCheckpointed()

18.isEmpty()

19.lookup(key)

20.mean()

21.meanApprox(timeout, confidence=0.95)

22.min(key=None)

23.name()

24.reduce(f)

25.reduceByKeyLocally

26.sampleStdev()

27.sampleVariance()

28..saveAsTextFile

29.saveAsSequenceFile(path, compressionCodecClass=None)

30.stats()

31.stdev()

32.sum()

33..sumApprox(timeout, confidence=0.95)

34.take(num)

35.takeOrdered(num, key=None)

36.takeSample(withReplacement, num, seed=None)

37.toDebugString()

38.toLocalIterator()

39.top(num, key=None)

40.treeAggregate(zeroValue, seqOp, combOp, depth=2)

41.treeReduce(f, depth=2)

42.variance()


1.aggregate(zeroValue, seqOp, combOp)

这属于一个聚合操作, spark先把数据分区,每个分区由任务调度器分发到不同的节点分别计算和,计算的结果返回 driver节点,在driver节点将所有节点的返回值相加,就得到了整个数据集的和了。

zeroValue是每个节点相加的初始值,seqOp为每个节点上调用的运算函数,combOp为节点 返回结果调用的运算函数。

sc = spark.sparkContext
import numpy as np
rdd = sc.parallelize(np.arange(11),3)
rdd.collect()
rdd.aggregate(0,lambda x,y:x+y,lambda x,y:x+y)
rdd.aggregate(8,lambda x,y:x+y,lambda x,y:x+y)
rdd.aggregate(3,lambda x,y:x+y,lambda x,y:x+y)

从结果看到每个分区上调用seqOp函数都要加上zeroValue,最后运行combOp也要加上 zeroValue。3个分区加上最后的combOp所以总共加了四次zeroValue。

2..aggregateByKey(zeroValue, seqFunc, combFunc, numPartitions=None, partitionFunc= )

这个方法用来对相同的key值进行聚合操作,同样的是指定 zeroValue,seqFunc,numPartitoins为分区数,partitionFunc为作用在分区上的函数。

这个方法同aggregate方法名字相似,但是它却是一个transformation方法,不会触发作 业的提交!

datas = [('a',22),('b',33),('c',44),('b',55),('a',66)]
rdd = sc.parallelize(datas,3)
rdd.collect()
rdd.aggregateByKey(0,lambda x,y:x+y,lambda x,y:x+y)
rdd.aggregateByKey(1,lambda x,y:x+y,lambda x,y:x+y,1).collect()

3.collect方法

该放回会触发作业的提交,返回一个结果的列表,注意:若结果集较大,使用collect方法 可能使driver程序崩溃,因为collect方法会返回所有节点的结果数据到driver节点,造成OOM 或其他的异常。

rdd.collect()

4.collectAsMap()

这个方法仍然是action方法,会触发作业的执行,顾名思义该方法返回的结 果是一个字典结构

dd = rdd.collectAsMap()

5.count()方法

统计RDD中元素的个数

rdd.count()

6.countApprox(timeout, confidence=0.95)

带有超时限制的count统计函数,时间一到,即便所有任务还没有完成,该方法也会返回已经完 成的任务的统计结果。

rdd = sc.parallelize(range(1000000), 100)
rdd.countApprox(1000, 1.0)

7.countApproxDistinct(relativeSD=0.05)

返回大概的RDD数据集中没有重复数据的数据条数。

rdd1 = sc.parallelize(range(1000000), 100)
rdd2 = sc.parallelize(np.arange(1,1000001),100)
rdd3 = sc.union([rdd1,rdd2])
rdd3.countApproxDistinct()
rdd3.countApproxDistinct(relativeSD=0.01)
rdd3.countApproxDistinct(relativeSD=0.001)

8..countByKey()

统计相同key的个数,以字典形式返回

datas = [('a',11),('b',22),('b',88),('c',56)]
rdd = sc.parallelize(datas,3)
rdd.countByKey()
### Python Spark Transformation 和 Action 算子简介 Apache Spark 提供了一组丰富的算子来操作分布式数据集,这些算子分为 **Transformation** 和 **Action** 两大类。对于 Python 用户来说,PySpark 是 Spark 的官方 Python 接口,允许开发者通过 Python 编写 Spark 应用程序。 #### 常见的 PySpark Transformation 算子 以下是一些常用的 PySpark Transformation 算子及其功能描述: 1. `map(func)` 对 RDD 中的每一个元素应用函数 `func` 并返回一个新的 RDD[^1]。 2. `filter(func)` 返回一个新 RDD,其中只包含使函数 `func` 返回 True 的元素。 3. `flatMap(func)` 类似于 map,但是每个输入项可以映射为多个输出项。 4. `groupByKey()` 当作用在一个键值对 RDD 上时,会将相同 key 的所有 value 聚合在一起形成一组。 5. `reduceByKey(func)` 在键值对 RDD 上执行 reduce 操作,按 key 合并具有相同 key 的 values。 6. `join(otherDataset, [numPartitions])` 执行两个键值对 RDD 的内部连接操作。 7. `cartesian(otherDataset)` 计算当前 RDD 和另一个 RDD 的笛卡尔积。 --- #### 常见的 PySpark Action 算子 以下是一些常见的 PySpark Action 算子及其功能描述: 1. `collect()` 将整个 RDD 收集到 Driver 程序中作为列表返回[^3]。 2. `count()` 返回 RDD 中元素的数量。 3. `first()` 返回 RDD 中的第一个元素。 4. `take(n)` 返回由前 n 个元素组成的数组。 5. `foreach(func)` 遍历 RDD 的每个元素,并对其调用指定的函数 `func`[^4]。 --- #### 示例代码:PySpark Transformation 和 Action 算子的实际使用 下面提供了一些具体的例子展示如何在 Python 中使用上述算子。 ##### 创建初始 RDD ```python from pyspark import SparkContext sc = SparkContext.getOrCreate() rdd = sc.parallelize([1, 2, 3, 4, 5]) ``` ##### 使用 `map` 算子 ```python squared_rdd = rdd.map(lambda x: x * x) print(squared_rdd.collect()) # 输出: [1, 4, 9, 16, 25] ``` ##### 使用 `filter` 算子 ```python filtered_rdd = rdd.filter(lambda x: x % 2 == 0) print(filtered_rdd.collect()) # 输出: [2, 4] ``` ##### 使用 `reduceByKey` 算子 ```python kv_rdd = sc.parallelize([("a", 1), ("b", 2), ("a", 3)]) reduced_kv_rdd = kv_rdd.reduceByKey(lambda a, b: a + b) print(reduced_kv_rdd.collect()) # 输出: [('a', 4), ('b', 2)] ``` ##### 使用 `foreach` 算子 ```python def print_element(x): print(f"Element: {x}") rdd.foreach(print_element) # 控制台打印: Element: 1 ... Element: 5 ``` ##### 使用 `collect` 算子 ```python collected_data = rdd.collect() # 将 RDD 数据收集到驱动器节点上 print(collected_data) # 输出: [1, 2, 3, 4, 5] ``` --- ### 总结 以上展示了部分 PySpark 中的核心 Transformation 和 Action 算子的功能与实际应用场景。每种算子都有其特定用途,在开发过程中应根据需求合理选用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值