先来介绍一下spark中的RDD、DataFrame和DataSet:
RDD(弹性分布式数据集)数据元素的不可变的分布式集合,在集群中的节点之间进行分区,可以与提供转换和操作的低水平的API并行操作。
DataFrame是一个不可变的分布式数据集合。与RDD不同,数据被组织成命名列,就像关系数据库中的表,为了使大数据集处理变得更加容易,DataFrame允许开发人员将结构强加于分布式数据集合,从而可以使用更高层次的抽象; 它提供了一个API来操纵您的分布式数据; 可以使得不懂编3程的人也可以使用。
DataFrame和Dataset API构建在Spark SQL引擎之上,所以它使用Catalyst来生成优化的逻辑和物理查询计划。通过R,Java,Scala或Python DataFrame / Dataset API,所有关系类型查询都经历相同的代码优化器,提供空间和速度效率。而数据集[T]类型的API针对数据工程任务进行了优化,untyped Dataset[Row](DataFrame的别名)更快,适合交互式分析。
果您需要丰富的语义,高级抽象和域特定的API,请使用DataFrame或Dataset。
如果您的处理需要高层次表达式 filters, maps, aggregation, averages, sum, SQL queries, columnar access和对半结构化数据使用lambda函数,请使用DataFrame或Dataset。
如果要在编译时要求更高程度的类型安全性,则需要类型化的JVM对象,利用Catalyst优化,并从Tungsten的高效代码生成中受益,使用Dataset。
如果要在Spark Libraries之间统一和简化API,请使用DataFrame或Dataset。
这些情况下建议使用RDD:
数据是非结构化的时候,例如 :media streams or streams of text
使用功能编程构造来操纵您的数据而不是域特定表达式时;
放弃针对结构化和半结构化数据的DataFrames和Datasets提供的一些优化和性能时。
网友评论