#RDD创建
#1. parallelize方法:创建RDD,参数为list,返回RDD
sc.parallelize(param:list)
#demo
sc.parallelize(['tom','jack','black'])
#2. textFile方法:读取文件,创建RDD,参数为hdfs文件地址或者本地文件地址,返回RDD
sc.textFile(param:filepath)
#demo
sc.textFile("hdfs://master:9000/input/words")
sc.textFile("../../input/words")
#转换
#1. map方法:将每个元素传递到func进行转换,生成新的RDD,参数为func方法,返回RDD
sc.map(func)
#demo:
intRdd = sc.parallelize([1,2,3,4,5])
intRdd.map(lambda x:x**2)
#2. filter方法:筛选除满足func的元素,并返回一个新的RDD,参数func,返回RDD
sc.filter(func)
#demo:
intRdd.filter(lambda x:x>2 and x<4)
#3. flatMap方法:与map相似,但每个输入元素都可以被映射到0或者多个输出结果,参数func,返回RDD
strRdd = sc.parallelize(['work,start','tom,jack'])
strRdd.flatMap(lambda x:(x.split(",")))
#--->'work','start','tom','jack'相对于map存在一个压平效果
strRdd.map(lambda x:(x.split(",")))
#--->['work','start'],['tom','jack']
#4. groupBy方法:将RDD分为多个RDD,参数func,返回多个RDD,可以通过遍历获取元素
intRdd = sc.parallelize([1,2,3,4,5])
gRdd = intRdd.groupBy(lambda x:'even' if x%2==0 else 'odd')
#循环打印---多个RDD,每个都为:[key,Iterable]类型,可以通过sorted解析Iterable,或者[x for x
in Iterable] 或者sum(Iterable)
gRdd.foreach(print)
gRdd.map(lambda x:(x[0],sum(x[1]))).foreach(print)
#5. union方法:多个RDD合并,参数为RDD
intRdd.union(strRdd)
#6. intersection方法:两个RDD交集,参数为RDD
intRdd.intersection(strRdd)
#7. substract方法:两个RDD差集,aRdd-bRdd,aRdd剔除在bRdd中存在的元素
aRdd.substract(bRdd)
#8. cartesian方法:两个RDD进行笛卡尔积
intRdd.cartesian(strRdd)
#9. sortBy方法:排序,非元组型
intRdd = sc.parallelize([2,1,3,5,6,4])
intRdd.sortBy(lambda x:-int(x)).foreach(print)
#10.groupByKey方法:应用于元组数据集,返回(key,iterable)类型数据集
testRdd = sc.parallelize([['tom','math',32],['tom','english',22],['jack','math',22]])
testRdd.map(lambda x:[x[0],x[1]]).groupByKey().foreach(print)
#---输出:(tom,iterable),(jack,iterable)
testRdd.map(lambda x:[x[0],x[1]]).groupByKey().map(lambda x:(x[0],[y for y in
x[1]])).foreach(print)
#---输出:(tom,['math','english']),('jack','math')
#11.reduceByKey方法:应用于(K,V)元组数据集,返回一个新的(K,V)数据集,其中每个值是将每个key传递到函
数func中进行聚合后的结果
kvRdd = sc.parallelize([['hadoop',1],['spark',1],['hadoop',1],['flume',1]])
kvRdd.reduceByKey(lambda x,y:x+y).foreach(print)
#---输出('hadoop',2) ('spark',1) ('flume',1)
#12.mapValues()方法:应用于(K,V)元组数据集,返回一个新的(K,V)数据集,其中每个值是将value传递到函
数func中运算的结果
kvRdd = sc.parallelize([['hadoop',1],['spark',1],['hadoop',1],['flume',1]])
kvRdd.mapValues(lambda x:x+2).foreach(print)
#---输出('hadoop',3)('hadoop',3)('spark',3) ('flume',3)
#13.sortedByKey方法:应用于(K,V)元组数据集,按照key进行排序
print(kvRdd.sortByKey(ascending=True).collect())
#14.keys方法:获取(K,V)元组数据集的key值
kvRdd.keys().foreach(print)
#15.values方法:获取(K,V)元组数据集的value值
kVRdd.values().foreach(print)
#16.join方法:应用于(K,V)元组数据集关联,如果两个kvRdd的key相同,则合并为一个,返回一个RDD
kvRdd.join(kvRdd).foreach(print)
#---输出('hadoop',(1,1))('hadoop',(1,1))('spark',(1,1))('flume',(1,1))
#17.leftOuterJoin方法,类比于sql中leftjoin
#18.rightOuterJoin方法,类比于sql中的rightjoin
#19.substractByKey方法,如果key相同,则aRdd剔除该元素
print(kvRdd.subtractByKey(sc.parallelize([('hadoop',3)])).collect())
#---输出('spark',1),('flume',1)
#20.combineByKey方法:combineByKey方法需要三个参数:
#第一个参数表示:将相同key的第一个数据进行结构转换,实现操作
#第二个参数:分区内的计算规则
#第三个参数:分区间的计算规则
#计算公司的年度总收入---#期待返回(公司,总收入,月平均收入):company_1,54,27 company_2,76,38
companyRdd = sc.parallelize([('company_1',32),('company_1',22),('company_2',32),('company_2',44)])
companyInfo = companyRdd.combineByKey(
lambda x:(int(x),1),#此处x为key对应的value值
lambda acc,x:(acc[0]+int(x),acc[1]+1), #此处acc为第一个的输出结果
lambda acc0,acc1:(acc0[0]+acc1[0],acc0[1]+acc1[1])
)
companyInfo.map(lambda x:(x[0],x[1][0],x[1][0]/x[1][1])).foreach(print)
#21.distinct方法:显示Rdd内不同的元素
#作业
#1.first():获取第一个元素
intRdd.first() #--->2
#2.take(param:int):param为数字,如2,则获取前两个元素
#3.takeOrdered():排序后获取前几个元素
intRdd = sc.parallelize([5,1,1,2,3,4])
print(intRdd.takeOrdered(3)) #--->1,1,2
print(intRdd.takeOrdered(3,key=lambda x:-int(x))) #--->5,4,3
#4.stats:统计基本数据情况
#5.stdev:标准差
#6.count:总数
#7.mean:平均数
#8.sum:求和
#9.max:最大
#10.min:最小
#11.countByKey:统计key的数量,返回{key1:key1数量,key2:key2数量}
#12.countByValue:统计value的数量,返回{value1:value1数量,value2:value2数量}
#13.lookup:根据key查找对应的value
#14.collectAsMap:将此RDD中的键值对作为字典返回给master