Spark RDD基础操作

来源:互联网 发布:淘宝知识产权申诉 编辑:程序博客网 时间:2024/05/21 10:56
标题举例解释Spark的基本信息Spark1个driver(笔记本电脑或者集群网关机器上)和若干个executor(在各个节点上)组成。通过SparkContext(简称sc)连接Spark集群、创建RDD、累加器(accumlator)、广播变量(broadcast variables),简单可以认为SparkContext是Spark程序的根本。Driver把计算任务分成一系列小的task,然后送到executor执行。executor之间可以通信,在每个executor完成自己的task以后,所有的信息会被传回。RDDResilient 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 初始化本地文件,初始化后每一行会被看成一个itemrdd = 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的第一条itemrdd文件名.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类似appendsentencesRDD = 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()
和上面是类似的,不过只返回第1itemrdd.first()rdd.take(n):
 
类似,但是返回nitemrdd.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 Tddrdd = 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()