**(转)**pyspark的使用和操作(基础整理)02

本文深入讲解了Apache Spark中RDD的基本操作,包括并集、交集、差集和笛卡尔积等集合运算,以及通过类似SQL的方式进行join操作。此外,还介绍了Spark的惰性计算特性及其常见actions如collect、first、take、count、top和reduce,以及如何使用cache来优化重复计算。

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

RDD间的操作

(1)如果有2个RDD,可以通过下面这些操作,对它们进行集合运算得到1个新的RDD

rdd1.union(rdd2): 所有rdd1和rdd2中的item组合(并集)
rdd1.intersection(rdd2): rdd1 和 rdd2的交集
rdd1.substract(rdd2): 所有在rdd1中但不在rdd2中的item(差集)
rdd1.cartesian(rdd2): rdd1 和 rdd2中所有的元素笛卡尔乘积(正交和)

import pyspark
from pyspark import SparkContext as sc
from pyspark import SparkConf
conf=SparkConf().setAppName(“miniProject”).setMaster(“local[*]”)
sc=SparkContext.getOrCreate(conf)

#初始化两个RDD
numbersRDD = sc.parallelize([1,2,3])
moreNumbersRDD = sc.parallelize([2,3,4])

numbersRDD.union(moreNumbersRDD).collect() #union()取并集

#Output:[1, 2, 3, 2, 3, 4]

numbersRDD.intersection(moreNumbersRDD).collect() #intersection()取交集

#Output:[2, 3]

numbersRDD.subtract(moreNumbersRDD).collect() #substract()取差集

#Output:[1]

numbersRDD.cartesian(moreNumbersRDD).collect() #cartesian()取笛卡尔积

#Output:[(1, 2), (1, 3), (1, 4), (2, 2), (2, 3), (2, 4), (3, 2), (3, 3), (3, 4)]

(2)在给定2个RDD后,可以通过一个类似SQL的方式去join它们

from pyspark import SparkContext
from pyspark import SparkConf
conf=SparkConf().setAppName(“miniProject”).setMaster(“local[*]”)
sc=SparkContext.getOrCreate(conf)

Home of different people

homesRDD = sc.parallelize([
(‘Brussels’, ‘John’),
(‘Brussels’, ‘Jack’),
(‘Leuven’, ‘Jane’),
(‘Antwerp’, ‘Jill’),
])

Quality of life index for various cities

lifeQualityRDD = sc.parallelize([
(‘Brussels’, 10),
(‘Antwerp’, 7),
(‘RestOfFlanders’, 5),
])

homesRDD.join(lifeQualityRDD).collect() #join

#Output:
#[(‘Antwerp’, (‘Jill’, 7)),

homesRDD.leftOuterJoin(lifeQualityRDD).collect() #leftOuterJoin

#Output:
#[(‘Antwerp’, (‘Jill’, 7)),

homesRDD.rightOuterJoin(lifeQualityRDD).collect() #rightOuterJoin

#Output:
#[(‘Antwerp’, (‘Jill’, 7)),

homesRDD.cogroup(lifeQualityRDD).collect() #cogroup

#Output:

(homesRDD
.cogroup(lifeQualityRDD)
.map(lambda x:(x[0], (list(x[1][0]), list(x[1][1]))))
.collect())

#Output:

惰性计算,actions方法

特别注意:Spark的一个核心概念是惰性计算。当你把一个RDD转换成另一个的时候,这个转换不会立即生效执行!!!Spark会把它先记在心里,等到真的有actions需要取转换结果时,才会重新组织transformations(因为可能有一连串的变换)。这样可以避免不必要的中间结果存储和通信。

常见的action如下,当它们出现的时候,表明需要执行上面定义过的transform了:

collect(): 计算所有的items并返回所有的结果到driver端,接着 collect()会以Python list的形式返回结果
first(): 和上面是类似的,不过只返回第1个item
take(n): 类似,但是返回n个item
count(): 计算RDD中item的个数
top(n): 返回头n个items,按照自然结果排序
reduce(): 对RDD中的items做聚合

from pyspark import SparkContext
from pyspark import SparkConf
conf=SparkConf().setAppName(“miniProject”).setMaster(“local[*]”)
sc=SparkContext.getOrCreate(conf)

rdd = sc.parallelize(range(1,10+1))
rdd.reduce(lambda x, y: x + y) #reduce(): 对RDD中的items做聚合

#Output:55

reduce的原理:先在每个分区(partition)里完成reduce操作,然后再全局地进行reduce。

有时候需要重复用到某个transform序列得到的RDD结果。但是一遍遍重复计算显然是要开销的,所以我们可以通过一个叫做cache()的操作把它暂时地存储在内存中。缓存RDD结果对于重复迭代的操作非常有用,比如很多机器学习的算法,训练过程需要重复迭代。

from pyspark import SparkContext
from pyspark import SparkConf
conf=SparkConf().setAppName(“miniProject”).setMaster(“local[*]”)
sc=SparkContext.getOrCreate(conf)
import numpy as np
numbersRDD = sc.parallelize(np.linspace(1.0, 10.0, 10))
squaresRDD = numbersRDD.map(lambda x: x**2)

squaresRDD.cache() # Preserve the actual items of this RDD in memory

avg = squaresRDD.reduce(lambda x, y: x + y) / squaresRDD.count()
print(avg)

#Output:38.5

作者:Young_id
来源:优快云
原文:https://blog.youkuaiyun.com/cymy001/article/details/78483723
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值