火花地图RDD vs加入

时间:2016-12-13 01:02:10

标签: mongodb apache-spark

想知道两者中哪一个对大型数据集更有效。

假设我已经从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。

1 个答案:

答案 0 :(得分:2)

随着Spark(> 2.0)的最新进展,当谈到RDD与DataFrame时,几乎100%的时间正确答案是DataFrames。我建议你总是试着留在DaraFrame世界,不要过渡到RDD。

更详细: RDD将始终为每行记录所有字段。它还将实现Scala案例类和所有字符串都是重量级Java字符串等。另一方面,带有钨的数据框架(全阶段代码生成器及其优化的编码器)和催化剂使一切变得更快。

  • RDD就是Scala / Java。 DataFrames将自己的超薄编码用于对同一数据具有更多压缩/缓存友好表示的类型。

  • RDD代码没有通过Catalyst,这意味着什么都不会实际获得(查询)优化。

  • 最后,DataFrames有一个代码生成器,它可以在不同阶段优化链式操作。

read确实是必须的。