2017-03-20 154 views
1

我正在閱讀社交網絡的json文件爲spark。我從這些數據框中獲得了我爲了獲得配對而爆炸的數據。 這個過程很完美。稍後我想將其轉換爲RDD(用於GraphX),但創建RDD需要很長時間。火花數據幀轉換爲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

在Spark中,DataFrame是一個分佈式數據集合,組織成命名列(表格格式)。它在概念上等同於關係數據庫中的表或R/Python中的數據框,但具有更豐富的優化。而且由於其表格格式,它具有允許spark在後臺運行優化次數的元數據。 DataFrame API使用Spark的高級優化,如鎢執行引擎和催化劑優化器來更好地處理數據。

在RDD中,RDD不推斷給定數據集的模式,並要求用戶提供任何模式。另外,Rdd不能利用Spark優化器(如Catalyst優化器和鎢執行引擎)(如上所述)。

所以DataFrame的性能比RDD好得多。在你的情況下,如果你必須使用RDD而不是數據幀,那麼我建議在轉換爲rdd之前緩存數據幀。這應該會提高你的rdd性能。

val E1 = exploded_network.cache() 
val E2 = E1.rdd 

希望這有助於。

相關問題