RDD与DataFrame(存储数据类型)

时间:2018-08-08 19:38:20

标签: apache-spark apache-spark-sql

我正在阅读一本有关Apache Spark的书,并且在比较RDD和DataFrame时,有以下说法:

  

RDD和DataFrame之间的主要区别在于DataFrame存储   有关数据的更多信息,例如数据类型和名称   列数,而不是RDD。这使DataFrame可以优化   比Spark转换和Spark更有效地处理   在RDD上进行处理的动作。

但是,当使用Scala处理RDD时,我注意到实际上是存储了数据类型。例如:

val acTuplesByAmount = acBalTuples.map{case (amount, accno) => (amount.toDouble, accno)}
acTuplesByAmount.collect()
res5: Array[(Double, String)] = Array((50000.0,SB10001), (12000.0,SB10002), (8500.0,SB10004), (5000.0,SB10005), (3000.0,SB10003))

如您所见,它跟踪我们想要Double和String的事实。在我绘制地图之前,我认为可能是两个字符串。

那本书是错的吗?还是DataFrame仍然以某种方式具有更出色的数据类型?

3 个答案:

答案 0 :(得分:0)

这本书是正确的。您看到的类型对于Spark引擎是透明的。换句话说,数据集具有schema,用于定义每列的类型。您可以使用dataset.printSchema()打印它。这些类型对引擎而言不是透明的,并且Spark可以识别某些优化对性能有好处,例如可以替换某些表达式或将其推送到源代码中

答案 1 :(得分:0)

实际上,下面的答案和书是正确的,但是1)DF可以使用sql方法,2)rdds允许处理元组和结构化程度较低的数据类型,以及不同的用例。

答案 2 :(得分:0)

在DataFrame中,由于所有执行程序都知道数据架构,因此火花仅对数据进行洗牌。在RDD中,它们是序列化的Java对象,洗牌要昂贵得多,并且再次携带有关数据的所有信息。