Learning Spark (Python版) 学习笔记(二)----键值对、数据读取与保存、共享特性

感谢关注天善智能,走好数据之路↑↑↑

欢迎关注天善智能,我们是专注于商业智能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 #读

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值