2016-07-14 6 views
1

DataFrame(DF)、Bを2つの異なる(行単位で)サブセットに分割しようとしています。私は最初にsampleDFを含む新しいDFを生成する。行の半分はBです。その後、私はこの新しいDF、b2z値はb1に含ま等しくないにあるBzと値のすべての行が含まれていることを条件とDFにfilterにしてみてください。SparkR操作で2つの別々のDataFrameを参照する

これはかなり簡単なようです。ただし、filter式は空のDataFrameになります。 filterの構文を誤解していますか、または単にSparkR操作の個別のDataFramesを参照できませんか?

w <- rbind(3, 0, 2, 3, NA, 1) 
z <- rbind("a", "b", "c", "d", "e", "f") 

d2 <- cbind.data.frame(w, z) 
B <- as.DataFrame(sqlContext, d2) 

b1 <- sample(B, FALSE, 0.5) 
b2 <- filter(B, B$z != b1$z) 

答えて

1

ここにあり実際には二つの異なる問題:一般的に

  • あなたが最初join操作のいくつかの種類を行うことなく、フィルタ内部の別のテーブルを参照することはできません。
  • この場合、一般的な系統のために、これは非常に真の等価性を構成します(SPARK-6231と同様の問題です)。したがって、例外はありませんが空の結果セットです。

として、今のところ(1.6スパーク)SparkRはrandomSplitを提供していないので、あなたは、分割を適用することができ、手動で

seed <- stats::runif(1) 
b <- B %>% withColumn("rand", rand(seed)) 
b1 <- b %>% where(b$rand <= 0.5) 
b2 <- b %>% where(b$rand > 0.5) 
+0

これは素晴らしいことでした。ありがとう。 – kathystehl

1

SparkRは、有用なデータ操作能力を提供スパークSQL上に構築された機能のセットを提供しています。これを実現する方法はSparkR except()コマンドです(SQLの!= joinのように考える!):

w <- rbind(3, 0, 2, 3, NA, 1) 
z <- rbind("a", "b", "c", "d", "e", "f") 

d2 <- cbind.data.frame(w, z) 
B <- as.DataFrame(sqlContext, d2) 

b1 <- sample(B, FALSE, 0.5) 
b2 <- except(B, b1) 
+0

'except 'の問題は、サンプリングに高価になるフルシャッフルが必要だということです。 – zero323

+0

ありがとうございます@ zero323 ...洞察力に感謝します。これらのナゲットは、RからSparkRに変換する人々のために見つけるのは本当に難しいです。特に私たちの大部分は小さなデータセットの例でSparkRを学習しようとしています... SparkRを使用する際に、それが設計された大規模なデータセットに使用する正しい方法が何であるかを知ることは難しいです。大きなデータを持つテスト/トレインセットの作成に関する正しい答えは、完全なデータセットを分割するのではなく、比較的小さな2つのサンプルを取ることです。 – SpiritusPrana

関連する問題