标题 | 举例 |
解释 | 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(): 和上面是类似的,不过只返回第1个item | rdd.first() |
rdd.take(n): 类似,但是返回n个item | rdd.take(n) |
rdd.count(): 计算RDD中item的个数 | rdd.count() |
rdd.top(n): 返回头n个items,按照自然结果排序 | 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(): 对所有有着相同key的items的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() |
Spark RDD基础操作
最新推荐文章于 2023-03-11 11:58:41 发布