天天看点

pyspark之RDD与dataframerddpairRDDDataframeRDD和DataFrame的区别

pysaprk中drr与dataframe

  • rdd
  • pairRDD
  • Dataframe
  • RDD和DataFrame的区别

rdd

RDD是一个抽象的分布式数据集,拥有丰富的操作函数,包括基本的map()、flatmap(),filter()函数,集合类函数如union()函数,intersection()函数,subtract()函数,和行动类函数,如collect(),count(),take(),top(),ruduce(),foreach()。

换句话说,RDD是非常灵活数据集合,其中可以储存类型相同或者不同的数据,同时也可以指定定制化函数进行数据处理。

RDD主要有两种形式,一个是RDD,一个是pairRDD(以key,value形式进行储存的数据结构)

pairRDD

Pair RDD由于有key的存在,与普通的RDD相比更加格式化,这种特性就会给Pair RDD赋予一些特殊的操作,例如groupByKey()可以将具有相同key进行分组,其结果仍然得到Pair RDD,然后利用mapValues()对相同key的value进行函数计算;reduceByKey()、countByKey()和sortByKey()等一系列“ByKey()”操作同理。

另外,两个Pair RDD具有像SQL一样的连接操作,例如两个Pair RDD进行join()后,具有相同key的元素的value会被放在一个元组里,key不相同的元素会被舍弃。leftOuterJoin()、rightOuterJoin()、fullOuterJoin()等操作同理。

Pair RDD已经被一定程度的格式化了,它的每个元素会具有key,但是value仍然具有很大的灵活性。DataFrame是一种完全格式化的数据集合,和数据库中的表的概念比较接近,它每列数据必须具有相同的数据类型。也正是由于DataFrame知道数据集合所有的类型信息,DataFrame可以进行列处理优化而获得比RDD更优的性能。

Dataframe

在内部实现上,DataFrame是由Row对象为元素组成的集合,每个Row对象存储DataFrame的一行,Row对象中记录每个域=>值的映射,因而Row可以被看做是一个结构体类型。可以通过创建多个tuple/list、dict、Row然后构建DataFrame。

注:用dict构建DataFrame已经废弃了,推荐用Row。

虽然DataFrame被完全格式化了,但是其中每列可以存储的类型仍然是非常丰富的,包括基本的数据类型、list、tuple、dict和Row,这也就意味着所有的复杂数据类型都可以相互嵌套,从而解除了完全格式化的限制。

RDD和DataFrame的区别

  • RDD:没有列名称,只能使用数字来索引;具有map()、reduce()等方法并可指定任意函数进行计算;
  • DataFrame:一定有列名称(即使是默认生成的),可以通过.col_name或者[‘col_name’]来索引列;具有表的相关操作(例如select()、filter()、where()、join),但是没有map()、reduce()等方法。

什么样的RDD可以转换为DataFrame?

RDD灵活性很大,并不是所有RDD都能转换为DataFrame,而那些每个元素具有一定相似格式的时候才可以。

为什么RDD需要转换为DataFrame?

当RDD进行类似表的相应操作时,都需要指定相应的函数,转换为DataFrame书写更简单,并且执行效率高。