Spark RDD基础操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Norsaa/article/details/77561827
标题 举例
解释 Spark的基本信息
Spark 1个driver(笔记本电脑或者集群网关机器上)和若干个executor(在各个节点上)组成。通过SparkContext(简称sc)连接Spark集群、创建RDD、累加器(accumlator)、广播变量(broadcast variables),简单可以认为SparkContext是Spark程序的根本。
Driver 把计算任务分成一系列小的task,然后送到executor执行。executor之间可以通信,在每个executor完成自己的task以后,所有的信息会被传回。
RDD Resilient Distributed Dataset(弹性分布式数据集,既可以保存在本地,也可以保存在集群上,简称RDD).是一个包含诸多元素、被划分到不同节点上进行并行处理的数据集合。在节点发生错误时RDD也可以自动恢复。RDD就像一个NumPy array或者一个Pandas Series,可以视作一个有序的item集合。只不过这些item并不存在driver端的内存里,而是被分割成很多个partitions,每个partition的数据存在集群的executor的内存中。
   
初始化RDD 调用库--设置路径--初始化文件为RDD文件
调用Spark库 from pyspark import SparkContext
sc = SparkContext('local', 'pyspark')
#sc = SparkContext('spark://ha-nn-001:7077', 'pyspark')
a.从本地内存中构造 1:makeRDD方法
val rdd01 = sc.makeRDD(List(1,2,3,4,5,6))
2:parallelize方法
val rdd01 = sc.parallelize(List(1,2,3,4,5,6))
b.通过文件系统构造,即将已有文件初始化为RDD  
b.1文件路径处理 #使用os.path.join()拼接路径
import os
path=os.path.join('user','home','nave.txt')
#path会自动返回user/home/nave.txt,好处是会根据不同的系统选择连接符为/  或  \

#直接拼路径
import os
cwd = os.getcwd()   #记录当前的python路径
rdd = sc.textFile("file://" + cwd + "/names/yob1880.txt")  #file:// 是告诉spark到本地去找文档
b.2 初始化本地文件,初始化后每一行会被看成一个item rdd = sc.textFile("file://" + cwd + "/names/yob1880.txt")  #file:// 是告诉spark到本地去找文档
导入整个文档,整个文档作为一个item
rdd = sc.wholeTextFiles("file://" + cwd + "/names")
b.2 初始化集群HDFS上的文件 rdd = sc.textFile(cwd + "/names/yob1880.txt") 
   
查看RDD信息 查看RDD文件的内容
rdd :查看RDD的打开地址 直接输入rdd文件名
rdd.first():显示rdd的第一条item rdd文件名.first()
rdd.count():查看rdd中的记录数 rdd文件名.count()
   
transformation:转化操作 仅仅是对RDD下达操作指令,Spark仅仅会记录要进行的操作,并不执行操作,直到需要执行action指令时才会执行操作。
rdd.map(func):
对rdd中的每一条item执行func,并返回一个新的rdd文件
quaresRDD = numbersRDD.map(lambda x: x**2) 
rdd.flatMap():
对RDD中的item执行同一个操作以后得到一个list,然后以平铺的方式把这些list里所有的结果组成新的list类似append
sentencesRDD = sc.parallelize(['Hello world', 'My name is Patrick'])
wordsRDD = sentencesRDD.flatMap(lambda sentence: sentence.split(" "))
结果:['Hello', 'world', 'My', 'name', 'is', 'Patrick']
若使用map:
wordsRDD = sentencesRDD.map(lambda sentence: sentence.split(" "))
结果:['Hello', 'world', 'My', 'name', 'is', 'Patrick']
rdd.fiiter(func):
过滤功能,将所有符合函数条件的item组成一个新的list输出
rddM = (rdd.filter(lambda x: x is not None and x.startswith('M')))
rdd.distinct():
 对RDD中的item去重
rdd文件名.distinct()
rdd.sample(withReplacement, fraction, seed):
取样函数
withReplacement:这个值如果是true时,采用PoissonSampler抽样器(Poisson分布),否则使用BernoulliSampler的抽样器.
Fraction:一个大于0,小于或等于1的小数值,用于控制要读取的数据所占整个数据集的概率.
Seed:这个值如果没有传入,默认值是一个0~Long.maxvalue之间的整数.
rdd1.union(rdd2): 
所有rdd1和rdd2中的item组合
numbersRDD.union(moreNumbersRDD).collect()
rdd1.intersection(rdd2):
 rdd1 和 rdd2的交集
numbersRDD.intersection(moreNumbersRDD).collect()
rdd1.substract(rdd2): 
所有在rdd1中但不在rdd2中的item(差集)
numbersRDD.subtract(moreNumbersRDD).collect()
rdd1.cartesian(rdd2): 
rdd1 和 rdd2中所有的元素笛卡尔乘积
numbersRDD.cartesian(moreNumbersRDD).collect()
   
action:执行操作 输出transformation的执行结果
rdd.collect()
计算所有的items并返回所有的结果到driver端,接着 collect()会以Python list的形式返回结果
rdd.collect()
rdd.first()
和上面是类似的,不过只返回第1item
rdd.first()
rdd.take(n):
 
类似,但是返回nitem
rdd.take(n)
rdd.count()
计算RDDitem的个数
rdd.count()
rdd.top(n):
 
返回头nitems,按照自然结果排序
rdd.top(n)
rdd.reduce()
RDD中的items做聚合
rdd = sc.parallelize(range(1,10+1))
rdd.reduce(lambda x, y: x + y)  
 #实际上是对rdd里面所有的元素进行求和,reduce 可以设定两个未知数,并对两个未知数进行处理
#处理方式,元素1=x,元素2=y,xy计算的结果作为x,元素3作为y,直到对所有的结果执行了操作
   
pair RDDs transformation操作 以元组形式组织的k-v对(key, value),叫做pair RDDs
生成pair Tdd rdd = sc.parallelize(["Hello hello", "Hello New York", "York says hello"])
resultRDD = (
    rdd
    .flatMap(lambda sentence: sentence.split(" "))  # split into words
    .map(lambda word: word.lower())                 # lowercase
    .map(lambda word: (word, 1))                    # count each appearance
    .reduceByKey(lambda x, y: x + y)                # add counts for each word
    .sortByKey()
)
resultRDD.collect()
reduceByKey()
对所有有着相同keyitems的value执行reduce操作
参照上例
groupByKey()
返回类似(key, listOfValues)元组的RDD,后面的value List 是同一个key下面的
resultRDD.groupByKey().collect()
sortByKey()
按照key排序
参照上例
countByKey():
 
按照key去对item个数进行统计
RDD.countByKey()
collectAsMap():
 
collect有些类似,但是返回的是k-v的字典
 
join:
只合并具有相同键值的项,没有相同的不显示
homesRDD.join(lifeQualityRDD).collect() 
   

猜你喜欢

转载自blog.csdn.net/Norsaa/article/details/77561827