2017-03-20 14 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変換は100Xを取っている時にカウント?

答えて

0

DataFrameは、名前付き列(表形式)にまとめられたデータの分散コレクションです。概念的にはR/Pythonのリレーショナルデータベースやデータフレームのテーブルと同等ですが、より豊かな最適化が可能です。また、表形式のため、バックグラウンドで多数の最適化を実行できるようにするメタデータも備えています。 DataFrame APIは、タングステン実行エンジンや触媒オプティマイザのようなsparkの高度な最適化を使用してデータをよりよく処理します。

RDDでは、与えられたデータセットのスキーマを推測せず、ユーザーにスキーマを提供する必要があります。また、RddはCatalystオプティマイザやタングステン実行エンジン(前述)のようなスパークのオプティマイザを利用できません。

DataFrameの方がRDDよりもはるかに優れたパフォーマンスです。あなたの場合、データフレームの代わりにRDDを使用する必要がある場合は、rddに変換する前にデータフレームをキャッシュすることをお勧めします。それはあなたのrddのパフォーマンスを向上させるはずです。

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

希望します。

関連する問題