Spark学习之路(六)——Spark编程基础(RDD)

1、RDD创建方式:①从文件系统中加载数据,②通过并行集合(数组)。

从文件系统中加载数据:
Spark的SparkContext通过TextFile()读取数据生成内存中的RDD(字符串类型)。
.textFile()方法支持的数据类型:①本地文件系统(例:sc.textFile(“file:///[输入文件路径]”),注意:file后是3个“/”);②分布式文件系统(例:sc.textFile (“hdfs:// hostname:port/[输入文件路径]”) ,注意:hdfs后是2个“/”);③Amazon S3云端。

以下三条语句等价:

sc.textFile (“hdfs://hostname:port/user/hadoop/readme.txt”) 
sc.textFile (“user/hadoop/readme.txt”)
sc.textFile (“readme.txt”)

#注:用户登录了Linux系统时,HDFS对应的用户主目录为hdfs://hostname:port/user/hadoop(hostname:主机名;port:端口号)

通过并行集合(数组):
parallelize方法,例:

array0 = [1,2,3,4,5]
rdd0 = sc.parallelize(array0)
#parallelize(c,numSlices=None),c表示参数(集合)传入,numSlices指定所需的分区数。

rdd1 = sc.range(0, 100, 1, 2)	#返回0-99的数
#range(start, end=0, step=1, numSlices=None)

2、RDD的类型

类型说明
PairRDD由键值对组成的RDD。
DoubleRDD仅由一组双精度浮点数组成的RDD。
DataFrame按一组有固定名字和类型的列来组织的分布式数据集。DataFrame等价于Spark SQL中的关系型表。
SequenceFileRDD从压缩的或未压缩的SequenceFile创建出的RDD。
HadoopRDD从hdfs读取数据生成的RDD。
NewHadoopRDD从Hadoop(HDFS、HBase、S3等)读取数据生成的RDD。
CoGroupedRDD对多个父RDD进行共同分组得到的RDD。
JdbcRDD从JDBC连接进行SQL查询获得的RDD。
PartitionPruningRDD用来裁剪RDD分区以避免在所有分区上启动任务的RDD。
ShuffledRDD数据混洗产生的RDD。
UnionRDD对两个以上的RDD进行union()操作产生的RDD。

3、RDD的基本操作

转换操作:

①.map()
语法:rdd.map(function,perservesPartitioning=False)
功能:.map()操作将一个具名函数或匿名函数对数据集内所有的元素进行求值。无共享操作,产生的结果为一个列表的列表

②.flatMap()
语法:rdd.flatMap(function,perservesPartitioning=False)
功能:类似.map()操作,产生一个组合的列表

③.fifter()
语法:rdd.fifter(function)
功能:.fifter()操作将一个Boolean类型的表达式对数据集里的每个元素进行求值。

④.distinct()
语法:rdd.distinct(numPartitions=None)
功能:.distinct()操作可用来去除重复的值,返回一个仅包含输入RDD中去重后的元素。参数numPartitions为新RDD的分区数。

⑤.groupBy()
语法:rdd.groupBy(function,numPartitions=None)
功能:.groupBy()操作返回一个按指定函数对元素进行分组的RDD。
#注意:.groupBy()返回的是一个可迭代(resultiterable)对象。

⑥.sortBy()
语法
rdd.sortBy(keyfunc,ascending=True,numPartitions=None)
功能:.sortBy()操作将RDD按照keyfunc参数选出的指定数据集的键进行排序。ascending默认为True,指定按照升序排序,False为降序排序。

行动操作:

①.count()
语法:rdd.count()
功能:.count()操作不接收任何参数,返回一个long类型的值,代表RDD中元素的个数。

②.collect()
语法:rdd.collect()
功能:.collect()操作向Spark驱动器进程返回一个由RDD中所有元素组成的列表

③.take()
语法:rdd.take(n)
功能:.take()操作返回RDD的前n个元素列表。选取的元素没有特定的顺序。.take()操作返回的元素是不确定的列表。

④.top()
语法:rdd.top(n,key=None)
功能:.top()操作返回一个RDD中的前n个元素列表(元素按降序输出)。

⑤.first()
语法:rdd.first()
功能:.first()操作返回一个RDD中的前n个元素(元素按降序输出)。.first()操作与take()、collect()类似,不考虑元素的顺序。
#first()和take(1)最主要的区别在于first()返回一个原子的数据元素,而take(1)返回的是由数据元素组成的列表。

⑥.reduce()
语法:rdd.reduce(function)
功能:.reduce()操作使用指定的满足交换律和/或结合律的运算符来规约RDD中的所有元素。

⑦.fold()
语法:rdd.fold(zeroValue,function)
功能:.fold()操作使用给定的function和zeroValue把RDD中每个分区的元素聚合,再把每个分区的元素聚合。

rdd = sc.range(0, 10, 1, 5)
rdd.fold(1,lambda x,y:x+y)

#output:51		1+…+9=45 + 分区(5)*1 + 1

⑧.foreach()
语法:rdd.foreach(function)
功能:.foreach()操作把指定的具名函数或匿名函数应用到RDD中的所有元素上。

键值对RDD的转化操作:

①.key()
语法:rdd.key()
功能:.key()操作返回键值对RDD中所有键组成的RDD,或者说是由键值对RDD中每个二元组的第一个元素组成的RDD。

②.values()
语法:rdd.values()
功能:.values()操作返回键值对RDD中所有值组成的RDD,或者说是由键值对RDD中每个二元组的第二个元素组成的RDD。

③.keyBy()
语法:rdd.keyBy(function)
功能:.keyBy()操作创建出由从RDD中的元素里提取的键与值组成的元组,其中function参数给定的函数将原元素转为输出元素的键,而原来的整个元组是输出的值。

④.mapValues()
语法:rdd.mapValues(function)
功能:.mapValues()操作把键值对RDD的每个值都传给函数function处理,而键保持不变。

⑤.flatMapValues()
语法:rdd.flatMapValues(function)
功能:.flatMapValues()操作把键值对RDD的每个值都传给函数function处理,而键保持不变,并生成拍平的列表。

⑥.groupByKey()
语法
rdd.groupByKey(numPartitions=None,partitionFunc=hash_fn)
功能:.groupByKey()操作把键值对RDD按各个键对值进行分组,把同组的值整合成一个序列。返回一个可迭代(resultiterable)对象。

⑦.reduceByKey()
语法
rdd.reduceByKey(function,numPartitions=None,partitionFunc=hash_fn)
功能:.reduceByKey()操作使用满足结合律的函数合并键值对的值。

keyval = [(“one”,1),(“one”,2), (“two”,3),(“two”,3)]
rdd0 = sc.parallelize(keyval)
rdd1 = rdd0.groupByKey().map(lambda x:(x[0],sum(x[1])))
rdd2 = rdd0.groupByKey().mapValues(lambda x:sum(x))
rdd3 = rdd0.reduceByKey(lambda a,b:a+b)

rdd0.collect()
rdd1.collect()
rdd2.collect()
rdd3.collect()

#output:
#[('one', 1), ('one', 2), ('two', 3), ('two', 4)]
#[('two', 7), ('one', 3)]
#[('two', 7), ('one', 3)]
#[('two', 7), ('one', 3)]

⑧.foldByKey()
语法
rdd.foldByKey(zeroValue,function,numPartitions=None,partitionFunc=hash_fn)
功能:.foldByKey()是转化操作,功能上类似.fold行动操作。

⑨.sortByKey()
语法
rdd.sortByKey(ascending=True,numPartitions=None,keyfunc=function)
功能:.sortByKey()操作把键值对RDD按照键进行排序,keyfunc可通过对原键使用另一个函数而修改原键。

连接转化操作:

①.join()
语法:rdd.join(otherRDD,numPartitions=None)
功能:.join()操作是内连接的一个实现,根据键来匹配两个键值对RDD。返回同时存在指定键的两个数据集中的所有元素。

②.leftOuterJoin()
语法:rdd.leftOuterJoin(otherRDD,numPartitions=None)
功能:.leftOuterJoin()操作返回第一个RDD中包含的所有元素或记录。如果左RDD中包含的键在右RDD中存在,则右RDD中匹配的记录会和左RDD的记录一起返回。否则,右RDD的记录为None(空)。

③.rightOuterJoin()
语法:rdd.rightOuterJoin(otherRDD,numPartitions=None)
功能:.rightOuterJoin()操作返回第二个RDD中包含的所有元素或记录。如果右RDD中包含的键在左RDD中存在,则左RDD中匹配的记录会和右RDD的记录一起返回。否则,左RDD的记录为None(空)。

④.fullOuterJoin()
语法:rdd.fullOuterJoin(otherRDD,numPartitions=None)
功能:.fullOuterJoin()操作,无论是否有匹配的键,都返回两个RDD中的所有元素。左数据集或右数据集没有匹配的元素都用None(空)来表示。

⑤.cogroup()
语法:rdd.cogroup(otherRDD,numPartitions=None)
功能:.cogroup()操作将多个键值对数据集按键进行分组。返回可迭代对象,如果一个RDD中没有另一个RDD中包含的给定键的值,相应的可迭代对象则为空。
.cogroup()与.fullOuterJoin()的区别:

  • .cogroup()返回可迭代对象,类似.groupByKey();
  • .cogroup()将两个RDD中的多个元素进行分组,而.fullOuterJoin()则对同一个键创建出多个分开的输出元素;
  • .cogroup()可以通过Scala API或者函数别名groupWith()对三个以上的RDD进行分组。

⑥.cartesian()
语法:rdd.cartesian(otherRDD)
功能:.cartesian()操作,即笛卡尔积,交叉连接。它会根据两个RDD的记录生成所有可能的组合。该操作生成的记录调速等于第一个RDD的记录条数乘以第二个RDD的记录条数。该操作可能会生成过于大量的数据

集合转化操作:

①.union()
语法:rdd.union(otherRDD)
功能:.union()操作将另一个RDD追加到RDD的后面,组合出一个输出RDD。两个RDD不一定要有相同的结构,并且不会过滤掉重复的数据。

②.intersection()
语法:rdd.intersection(otherRDD)
功能:.intersection()操作返回两个RDD中共有的元素。

③.subtract()
语法:rdd.subtract(otherRDD,numPartitions=None)
功能:.subtract()操作返回第一个RDD中所有没有出现在第二个RDD中的元素。

④.subtractByKey()
语法:rdd.subtractByKey(otherRDD,numPartitions=None)
功能:.subtractByKey()操作返回一个键值对RDD中所有在另一个键值对RDD中没有对应键的元素。

数值型RDD的行动操作:

①.min()
语法:rdd.min(key=None)
功能:.min()操作返回计算数值型RDD中一组数据的最小值。通过参数key指定一个函数。

②.max()
语法:rdd.max(key=None)
功能:.max()操作返回计算数值型RDD中一组数据的最大值。

③.mean()
语法:rdd.mean()
功能:.mean()操作返回计算数值型RDD中一组数据的平均数。

④.sum()
语法:rdd.sum()
功能:.sum()操作返回计算数值型RDD中一组数据的和。

⑤.stdev()
语法:rdd.stdev()
功能:.stdev()操作返回计算数值型RDD中一组数据的标准差。

⑥.variance()
语法:rdd.variance()
功能:.variance()操作返回计算数值型RDD中一组数据的方差。

⑦.stats()
语法:rdd.stats()
功能:.stats()操作返回StatCounter对象,一次调用即可获得包括count()、mean()、stdev()、max()和min()的结构。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值