2016-07-14 3 views
1

Я пытаюсь разбить DataFrame (DF), B на два разных (по строкам) подмножества. Я сначала sample DF, чтобы произвести новый DF, который включает прибл. половина строк от B. Затем я пытаюсь filter на DF с условием, что этот новый DF, b2 включает в себя каждую строку B с z значений, которые не равно к z ценности, включенной в b1.Ссылка на два отдельных DataFrames в операциях SparkR

Кажется, что это должно быть довольно просто. Однако выражение filter просто приводит к пустой DataFrame. Я неправильно понимаю синтаксис для filter, или вы можете просто не ссылаться на отдельные DataFrames в операциях SparkR?

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() (подумайте об этом как о! = Join в SQL):

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, когда вы используете его для больших наборов данных, для которых он предназначен. Я подозреваю, что правильный ответ на создание наборов тестов/поездов с большими данными состоит в том, чтобы взять два относительно небольших образца, а не разбивать полный набор данных. – SpiritusPrana

 Смежные вопросы

  • Нет связанных вопросов^_^