pyspark之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书写更简单,并且执行效率高。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值