在 SparkR 操作中引用两个单独的 DataFrame

Reference two separate DataFrames in SparkR operations

我正在尝试将 DataFrame (DF) B 拆分为两个不同的(按行)子集。我首先 sample DF 生成一个新的 DF,其中包括大约。 B 中的一半行。然后,我尝试在 DF 上 filter,条件是这个新的 DF,b2 包括 B 的每一行,其中 z 的值不是 等于 b1.

中包含的 z

这看起来应该相当简单。但是,filter 表达式只会产生一个空的 DataFrame。我是否误解了 filter 的语法,或者您是否可以简单地在 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)

这里实际上有两个不同的问题:

  • 一般来说,如果不先执行某种类型的 join 操作,就不能引用另一个 table 内部过滤器。
  • 在这个特殊情况下,由于共同的血统,这构造了一个平凡的真相等(它与 SPARK-6231 类似),因此没有例外,但结果集为空。

因为目前 (Spark 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)

SparkR 提供了一组基于 Spark SQL 构建的函数,这些函数提供了有用的数据操作能力。实现此目的的一种方法是使用 SparkR except() 命令(将其视为 != join in 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)