我正在将社交网络的json文件读入spark。我从这些数据框中得到了我爆炸以获得对。 这个过程非常完美。后来我想将它转换为RDD(与GraphX一起使用),但RDD创建需要很长时间。
val social_network = spark.read.json(my/path) // 200MB
val exploded_network = social_network.
withColumn("follower", explode($"followers")).
withColumn("id_follower", ($"follower").cast("long")).
withColumn("id_account", ($"account").cast("long")).
withColumn("relationship", lit(1)).
select("id_follower", "id_account", "relationship")
val E1 = exploded_network.as[(VertexId, VertexId, Int)]
val E2 = E1.rdd
要检查流程的运行方式,我会计算每一步
scala> exploded_network.count
res0: Long = 18205814 // 3 seconds
scala> E1.count
res1: Long = 18205814 // 3 seconds
scala> E2.count // 5.4 minutes
res2: Long = 18205814
为什么RDD转换需要100倍?
答案 0 :(得分:2)
在Spark中,DataFrame是组织成命名列(表格格式)的分布式数据集合。它在概念上等效于关系数据库中的表或R / Python中的数据框,但具有更丰富的优化。并且由于其表格格式,它具有允许spark在后台运行多个优化的元数据。 DataFrame API使用spark的高级优化,如Tungsten执行引擎和催化剂优化器,以更好地处理数据。
在RDD中,RDD并不推断给定数据集的模式,并且要求用户提供任何模式。而且Rdd不能利用spark优化器,如Catalyst优化器和Tungsten执行引擎(如上所述)。 / p>
因此,DataFrame的性能远远优于RDD。在您的情况下,如果您必须使用RDD而不是数据帧,我建议在转换为rdd之前缓存数据帧。这应该会提高你的rdd表现。
val E1 = exploded_network.cache()
val E2 = E1.rdd
希望这有帮助。