想知道两者中哪一个对大型数据集更有效。
假设我已经从mongo加载了订单,Orders
的架构是
case class Orders(organization: String, orderId: Long, recipient: String)
val orders = MongoSpark.load[Orders](spark)
现在我看到有两种方法可以进行下一步,我想查找每个归属于订单的公司。
选项1是MapRDD
val companies = MongoSpark.load[Company](spark, ReadConfig(...)).map { c => (c.id, c)}
val companiesMap = IndexedRDD(companies.rdd)
或第二个选项是运行连接
val joined = orders.join(MongoSpark.load[Company(spark), $orderId === $companyId"
生产服务器上的此数据集范围为500 gb - 785 gb。
答案 0 :(得分:2)
随着Spark(> 2.0)的最新进展,当谈到RDD与DataFrame时,几乎100%的时间正确答案是DataFrames。我建议你总是试着留在DaraFrame世界,不要过渡到RDD。
更详细: RDD将始终为每行记录所有字段。它还将实现Scala案例类和所有字符串都是重量级Java字符串等。另一方面,带有钨的数据框架(全阶段代码生成器及其优化的编码器)和催化剂使一切变得更快。
RDD就是Scala / Java。 DataFrames将自己的超薄编码用于对同一数据具有更多压缩/缓存友好表示的类型。
RDD代码没有通过Catalyst,这意味着什么都不会实际获得(查询)优化。
最后,DataFrames有一个代码生成器,它可以在不同阶段优化链式操作。
这read确实是必须的。