从文件系统中加载数据:
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)
类型 | 说明 |
---|---|
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。 |
①.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中的所有元素上。
①.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()的区别:
⑥.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中没有对应键的元素。
①.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()的结构。