pyspark RDD详细教程

Spark的核心是RDD(Resilient Distributed Dataset)即弹性分布式数据集,属于一种分布式的内存系统的数据集应用,这些元素在多个节点上运行和操作,以便在集群上进行并行处理。Spark主要优势就是来自RDD本身的特性,RDD能与其他系统兼容,可以导入外部存储系统的数据集,例如,HDFS、HBase或者其他Hadoop数据源

官方API

1、RDD的基本运算

RDD运算类型 说明
转换(Transformation 转换运算将一个RDD转换为另一个RDD,但是由于RDD的lazy特性,转换运算不会立刻实际执行,它会等到执行到“动作”运算,才会实际执行。
动作(Action) RDD执行动作运算之后,不会产生另一个RDD,它会产生数值、数组或写入文件系统;RDD执行动作运算后会立刻实际执行,并且连同之前的转换运算一起执行。
持久化(Persistence) 对于那些会重复使用的RDD, 可以将RDD持久化在内存中作为后续使用,以提高执行性能。

2、基本RDD“转换”运算

首先我们要导入PySpark并初始化Spark的上下文环境:

初始化

from pyspark.sql.session import SparkSession
spark
=SparkSession.builder.master("local[*]").appName("duqu").getOrCreate()
sc = spark.sparkContext

创建RDD
创建RDD的两种方法:
1:读取一个数据集(Windows本地,服务器本地,hdfs)

#Windows本地
row = sc.textFile('./data/pytest.txt')
#服务器本地
#file:// 表示从本地文件系统读
row = sc.textFile('file:///chenhong/Python/pytest.txt')
#hdfs
#在路径前面加上hdfs://
row = sc.textFile('hdfs:///chenhong/data/pytest.txt')

2: 读取一个集合(列表/元组/混合/子元素的长度也不一定要一样)
我们使用parallelize方法创建一个RDD:

#子元素长度不一样时,不能直接转dataframe
data = [('Alex','male',3),('Nancy','female',6),['Jack','male',1,80]]
rdd = sc.parallelize(data)
#输出
[('Alex', 'male', 3), ('Nancy', 'female', 6), ['Jack', 'male',1, 80]]

RDD转换为Python数据类型

#RDD类型的数据可以使用collect方法转换为python的数据类型:
print (intRDD.collect())
print (stringRDD.collect())
#输出为:
[3, 1, 2, 5, 5]
['APPLE', 'Orange', 'Grape', 'Banana','Apple']

map和mapValues

map运算可以通过传入的函数,将每一个元素经过函数运算产生另外一个RDD。
mapValues是在不改变key值的情况下,把rdd键值对中的value传给function

#比如下面的代码中,将intRDD中的每个元素加1之后返回,并转换为python数组输出:
print (intRDD.map(lambda x:x+1).collect())
#输出为:
[4, 2, 3, 6, 6]
###########################mapValues#######################
rdd = sc.parallelize([("a", ["apple", "banana", "lemon"]), ("b", ["grapes",'pig'])])
def f(x):
    return len(x)
print(rdd.mapValues(f).collect())
#输出
[('a', 3), ('b', 2)]

filter运算

filter可以用于对RDD内每一个元素进行筛选,并产生另外一个RDD。

#下面的例子中,我们筛选intRDD中数字小于3的元素,同事筛选stringRDD中包含ra的字符串:
print (intRDD.filter(lambda x: x<3).collect())
print (stringRDD.filter(lambda x:'ra' in x).collect())
#输出为:
[1, 2]
['Orange', 'Grape']

distinct运算

distinct运算会删除重复的元素

#比如我们去除intRDD中的重复元素1:
print (intRDD.distinct().collect())
#输出为:
[1, 2, 3, 5]

randomSplit运算

randomSplit 运算将整个集合以随机数的方式按照比例分为多个RDD

#比如按照0.4和0.6的比例将intRDD分为两个RDD
sRDD = intRDD.randomSplit([0.4,0.6])
print (len(sRDD))
print (sRDD[0].collect())
print (sRDD[1].collect())
#输出为:
2
[3, 1]
[2, 5, 5]

groupBy和groupByKey

groupBy运算可以按照传入匿名函数的规则,将数据分为多个Array。
groupByKey将rdd的键值对按照Key放在一起,后面一般接一个function函数

#下面的代码将intRDD分为偶数和奇数:
result = intRDD.groupBy(lambda x 
  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值