spark的抽象数据集包括RDD、DataFrame、Dataset,其实就是三种API,理一下这几个东西的异同,适用场景。
RDD
首先RDD是spark最早提供给开发者的一种API,RDD即 Resilient Distributed Datase 弹性分布式数据集,意味着RDD的数据是分布在不同的机器上的,一台机器即一个分区。
通过map等算子,可以在每台机器上对数据做相同的操作;通过reduce等算子,可以将不同机器上的数据重新洗牌进行一个聚合,这个过程叫做shuffle,其间会发生机器之间数据传输,所以是比较消耗资源的;还有可以通过collect等算子将数据拉到driver端,driver端即提交任务的机器,所以有collect算子时是要注意driver端内存分配的。
另外,需要知道的是RDD是不可变的,我们对rdd操作的算子不是修改rdd的数据,而是把一个RDD转化为另一个RDD。
DataFrame
DataFrame和RDD其实是类似的东西,不同的是DataFrame支持SparkSQL,这就意味着DataFrame里面的是结构化数据,但是DataFrame的字段类型约束不是严格的,它每一行的类型为row,所以每一列的值无法直接访问,还需要解析,来看下面两个例子:
1.row对象可以直接通过getA