想知道对于大型数据集来说,两者中哪一个的性能更好。
假设我已经从 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。
最佳答案
随着 Spark (>2.0) 的最新进展,当谈到 RDD 与 DataFrame 时,几乎 100% 的情况下正确答案是 DataFrame。我建议您始终尝试留在 DaraFrame 世界中,根本不要过渡到 RDD。
更详细: RDD 总是会柯里化(Currying)每一行的所有字段。它还将实现 Scala 案例类,所有字符串都是重量级 Java 字符串等。另一方面,带有 tungsten(全阶段代码生成器及其优化编码器)和催化剂的 DataFrame 使一切变得更快。
RDD 都是 Scala/Java。 DataFrames 对类型使用自己的超薄编码,这些类型对相同的数据具有更加压缩/缓存友好的表示。
RDD 代码不经过 Catalyst,这意味着实际上不会对任何内容进行(查询)优化。
最后,DataFrames 有一个代码生成器,可以真正优化不同阶段的链式操作。
这个read确实是必须的。
关于mongodb - Spark Map RDD 与连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41112172/