感谢关注天善智能,走好数据之路↑↑↑
欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定!
对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tstoutiao,邀请你进入数据爱好者交流群,数据爱好者们都在这儿。
第四章-第六章主要讲了三个内容:键值对、数据读取与保存与Spark的两个共享特性(累加器和广播变量)。
键值对(PaiRDD)
1.创建
1 #在Python中使用第一个单词作为键创建一个pairRDD,使用map()函数
2 pairs = lines.map(lambda x:(x.split(" ")[0],x))
2.转化(Transformation)
转化操作很多,有reduceByKey,foldByKey(),combineByKey()等,与普通RDD中的reduce()、fold()、aggregate()等类似,只不过是根据键来进行操作。
reduceByKey():与recude()类似,只不过是根据键进行聚合
foldByKey():与fold()类似
combineByKey():与aggregate()类似
#用Python对第二个元素进行筛选
result = pairs.filter(lambda keyValue:len(keyValue[1]) < 20)
#在Python中使用reduceByKey()和mapValues()计算每个键对应的平均值
rdd.mapValues(lambda x:(x,1)).reduceByKey(lambda x,y:(x[0]+y[0],x[1]+y[1]))
#用Python实现单词计数
rdd.sc.textFile("文件地址")
words = rdd.flatMap(lambda x:x.split(" "))
result = words.map(lambda x:(x,1)).reduceByKey((x,y)=>x+y)
#在Python中使用combineByKey()求每个键对应的平均值
sumCount = nums.combineByKey((lambda x:(x,1)),
(lambda x,y:(x[0]+y,x[1]+1)),
(lambda x,y:(x[0]+y[0],x[1]+y[1])))
sumCount.map(lambda key,xy:(key.xy[0]/xy[1])).collectAsMap()
#在Python中自定义reduceByKey()的并行度
data = [("a",3),("b",4),("a",1)]
sc.parallelize(data).reduceByKey(lambda x,y:x+y)#默认并行度
sc.parallelize(data).reduceByKey(lambda x,y:x+y,10)#自定义并行度
#在Python中以字符串顺序对整数进行自定义排序
rdd.sortByKey(ascending = True,numPartitions = None,keyFunc = lambda x: str(x))
3.行动操作(Action)
数据分区:数据比较大时,可以用partitionBy()转化为哈希分区。即通过向partitionBy传递一个spark.HashPartitioner对象来实现该操作。在Python中不能将HashPartitioner对象传递给partitionBy,只需要把需要的分区数传递过去(如 rdd.partitionBy(100))。
在spark中,会为生成的结果RDD设好分区方式的操作有:cogroup(),groupWith(),join(),leftOuterJoin(),rightOutJoin,groupByKey(),reduceByKey(),combineByKey(),partitionBy(),sort(),mapValues(),flatMapValues(),filter()。最后三种只有当父RDD有分区方式时,结果RDD才会有分区RDD。其他的操作生成的结果都不会存在特定的分区方式。
自定义分区方式:
#Python自定义分区方式
#Python自定义分区方式
import urlparse
def hash_domain(url):
return hash(urlparse.urlparse(url).netloc)
rdd.partitionBy(20,hash_domain) #创建20个分区
数据的读取与保存
文件格式
1 #读