我正在阅读一本有关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仍然以某种方式具有更出色的数据类型?
答案 0 :(得分:0)
这本书是正确的。您看到的类型对于Spark引擎是透明的。换句话说,数据集具有schema
,用于定义每列的类型。您可以使用dataset.printSchema()
打印它。这些类型对引擎而言不是透明的,并且Spark可以识别某些优化对性能有好处,例如可以替换某些表达式或将其推送到源代码中
答案 1 :(得分:0)
实际上,下面的答案和书是正确的,但是1)DF可以使用sql方法,2)rdds允许处理元组和结构化程度较低的数据类型,以及不同的用例。
答案 2 :(得分:0)
在DataFrame中,由于所有执行程序都知道数据架构,因此火花仅对数据进行洗牌。在RDD中,它们是序列化的Java对象,洗牌要昂贵得多,并且再次携带有关数据的所有信息。