PySpark-RDD Basics

导包

import numpy as np
import pandas as ps
from pyspark import SparkContext,SparkConf
%config ZMQInteractiveShell.ast_node_interactivity='all'

初始化sparkcontent

#方法一:
sc = SparkContext(master='local[2]')#只能初始化一次
#方法二:通过设置的方式先设置sparkconf,然后在初始化sparkcontent
conf = (SparkConf()
        .setMaster('local')
        .setAppName('My app')
        .set('spark.executor.memory','1g'))
sc = SparkContext(conf=conf)

spark参数信息

sc.version
sc.pythonVer
sc.master
str(sc.sparkHome)
str(sc.sparkUser())
sc.appName
sc.applicationId
sc.defaultParallelism
sc.defaultMinPartitions
sc.stop()

Rdd初始化

#rdd 初始化
rdd = sc.parallelize([('a',7),('a',2),('b',2)])
rdd2 = sc.parallelize([('a',2),('d',1),('b',1)])
rdd3 = sc.parallelize(range(100))
rdd4 = sc.parallelize([ ('a',['x','y','z']),('b',['p','r' ]) ])

textFile = sc.textFile('/my/directory/*.txt') #遍历文件每一行 返回一个array
textFile2 = sc.wholeTextFiles('/my/directory') #把这个目录下的所有文件遍历 返回的是 (文件路径,内容)的一个元组

Rdd函数

#检索rdd信息
rdd.getNumPartitions() #1
rdd.count() #3
rdd.countByKey() #defaultdict(int, {'a': 2, 'b': 1})
rdd.collectAsMap() #{'a': 2, 'b': 2}
rdd3.sum() #4950
sc.parallelize([]).isEmpty()#判断这个rdd是否为空

#检索rdd信息(count)
rdd3.max() #99
rdd3.min() #0
rdd3.mean() #平均值49.5
rdd3.stdev() #标准值28.86607
rdd3.variance() #方差
rdd3.histogram(3) #柱状图
rdd3.stats() #(count: 100, mean: 49.5, stdev: 28.86607004772212, max: 99.0, min: 0.0)

#applying function
rdd.map(lambda x : x+(x[1],x[0])).collect()
rdd5 =rdd.flatMap(lambda x:x+(x[1],x[0]))
rdd5.collect()
rdd4.flatMapValues(lambda x : x).collect() #打平k 与每一个value

#查询数据
#Getting
rdd.collect()
rdd.take(2)
rdd.first()
rdd.top(2)

#Sampleing
rdd3.sample(False,0.15,81).collect() #[3, 4, 27, 28, 35, 41, 43, 49, 53, 58, 85, 93]

#Filtering
rdd.filter(lambda x : "a" in x).collect() #[('a', 7), ('a', 2)]
rdd5.distinct().collect() #['a', 7, 2, 'b']
rdd.keys().collect()

#Iterating
def g(x):print(x)
rdd.foreach(g)

#reshaping data
#reducint
rdd.reduceByKey(lambda x,y:x+y).collect()
rdd.reduce(lambda a,b:a+b)

#grouping by
rdd3.groupBy(lambda x : x%2).mapValues(list).collect()
rdd.groupByKey().mapValues(list).collect()

#aggregating
nums = sc.parallelize([1,2,3,4,5])
seqOp=(lambda x,y:(x[0]+y,x[1]+1)) #计算每个分区的总和与总个数
combOp = (lambda x,y:(x[0]+y[0],x[1]+y[1])) #计算所有分区的数
nums.aggregate((0,0),seqOp,combOp) #总数等于15  一共5个数 x[0]表示元组的第一个数也就是总和 x[1]表示总个数

rdd.aggregateByKey((0,0),seqOp,combOp).collect() #[('a', (9, 2)), ('b', (2, 1))] 统计所有的values遍历所有rdd的key

def add(x,y): return x+y
rdd3.fold(0,add) #聚合rdd的每个分区 第一个参数为初始值,op为方法

rdd3.keyBy(lambda x:x+x).collect() #通过f方法为rdd所有元素创建元组,返回值作为key

#Mathematical Operations
rdd.subtract(rdd2).collect() #rdd-rdd2相同的元组[('a', 7), ('b', 2)]
rdd2.subtractByKey(rdd).collect() #rdd2-rdd相同的key [('d', 1)]
rdd.cartesian(rdd2).collect() #rdd1对rdd2笛卡尔积

#sort
rdd2.sortByKey(lambda x:x[1]).collect()
rdd2.sortByKey().collect()  #按key去排序

#Repartitioning
rdd.repartition(4)#reparation是coalesce(numPartitions, shuffle = true),repartition不仅会调整Partition数,也会将Partitioner修改为hashPartitioner,产生shuffle操作。
rdd.coalesce(1)#coalesce函数可以控制是否shuffle,但当shuffle为false时,只能减小Partition数,无法增大

#Saving
rdd.saveAsTextFile('rdd.txt')
rdd.saveAsHadoopFile('hdfs://namenodehost/parent/child','org.apache.hadoop.mapred.TextOutputFormat')

stopping SparkContext

sc.stop()

你可能感兴趣的:(Spark,pyspark,spark)