【问题标题】:RDD vs DataFrame (storing data types) [duplicate]RDD vs DataFrame(存储数据类型)[重复]
【发布时间】:2018-08-08 19:38:19
【问题描述】:

我正在阅读一本关于 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 的事实。在我的地图之前,我想它可能是两个字符串。

那本书有错吗?或者 DataFrames 是否仍然具有更好的数据类型?

【问题讨论】:

标签: apache-spark apache-spark-sql


【解决方案1】:

这本书是正确的。您看到的类型对于 Spark 引擎是透明的。另一方面,Dataset 有schema,它定义了每一列的类型。您可以使用dataset.printSchema() 打印它。这些类型对引擎来说是不透明的,Spark 可以即替换一些表达式或将其推送到源,如果它认识到这种优化对性能有好处

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      在 DataFrame 中,spark 只对数据进行洗牌,因为所有执行者都知道数据架构。在 RDD 中,它们是序列化的 java 对象,洗牌的成本要高得多,并且再次携带有关数据的所有信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-09
        • 2014-06-23
        • 1970-01-01
        • 2011-04-12
        • 1970-01-01
        • 1970-01-01
        • 2017-08-16
        相关资源
        最近更新 更多