在什么情况下使用RDD?
下面是使用RDD的场景和常见案例:
1) 你希望可以对你的数据集进行最基本的转换、处理和控制;
2) 你的数据是非结构化的,比如流媒体或者字符流;
3) 你想通过函数式编程而不是特定领域内的表达来处理你的数据;
4) 你不希望像进行列式处理一样定义一个模式,通过名字或字段来处理或访问数据属性;
5) 你并不在意通过DataFrame和Dataset进行结构化和半结构化数据处理所能获得的一些优化和性能上的好处;
DataFrame
与RDD相似,DataFrame也是数据的一个不可变分布式集合。但与RDD不同的是,数据都被组织到有名字的列中,就像关系型数据库中的表一样。设计DataFrame的目的就是要让对大型数据集的处理变得更简单,它让开发者可以为分布式的数据集指定一个模式,进行更高层次的抽象。
该什么时候使用DataFrame或Dataset呢?
1) 如果你需要丰富的语义、高级抽象和特定领域专用的API,那就使用DataFrame或Dataset;
2) 如果你的处理需要对半结构化数据进行高级处理,如filter、map、aggregation、average、sum、SQL查询、列式访问或使用lambda函数,那就使用DataFrame或Dataset;
3) 如果你想在编译时就有高度的类型安全,想要有类型的JVM对象,用上Catalyst优化,并得益于Tungsten生成的高效代码,那就使用Dataset;
4) 如果你想在不同的Spark库之间使用一致和简化的API,那就使用DataFrame或Dataset;
5) 如果你是R语言使用者,就用DataFrame;
6) 如果你是Python语言使用者,就用DataFrame,在需要更细致的控制时就退回去使用RDD;
上图直观地体现了DataFrame和RDD的区别。左侧的RDD[Person]虽然以Person为类型参数,但Spark框架本身不了解Person类的内部结构。而右侧的DataFrame却提供了详细的结构信息,使得Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。DataFrame多了数据的结构信息,即schema。RDD是分布式的Java对象的集合。DataFrame是分布式的Row对象的集合。