在SparkR操作中引用两个单独的数据帧

在SparkR操作中引用两个单独的数据帧,r,apache-spark,apache-spark-sql,sparkr,R,Apache Spark,Apache Spark Sql,Sparkr,我试图将一个数据帧(DF),B拆分为两个不同的(按行)子集。我首先对DF进行采样以生成一个新的DF,该DF包含B中大约一半的行。然后,我尝试对DF进行过滤,条件是这个新的DF,b2包括B的每一行,其中z值不等于b1中包含的z值 这似乎应该相当简单。但是,过滤器表达式只会产生一个空数据帧。我是否误解了过滤器的语法,或者您不能简单地在SparkR操作中引用不同的数据帧 w <- rbind(3, 0, 2, 3, NA, 1) z <- rbind("a", "b", "c", "d",

我试图将一个数据帧(DF),
B
拆分为两个不同的(按行)子集。我首先对DF进行
采样
以生成一个新的DF,该DF包含
B
中大约一半的行。然后,我尝试对DF进行
过滤
,条件是这个新的DF,
b2
包括
B
的每一行,其中
z
值不等于
b1
中包含的
z

这似乎应该相当简单。但是,
过滤器
表达式只会产生一个空数据帧。我是否误解了
过滤器的语法
,或者您不能简单地在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)

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

  • 通常,如果不先执行某种类型的
    join
    操作,就无法引用筛选器中的另一个表
  • 在这一点上,由于公共沿袭,这构造了一个微不足道的真正相等(这与问题类似),因此没有例外,只有空的结果集
由于目前(Spark 1.6)SparkR不提供
randomSplit
,因此您可以手动应用split

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

seedSparkR提供了一组基于sparksql的函数,这些函数提供了有用的数据操作能力。实现这一点的一种方法是使用SparkR except()命令(将其视为SQL中的!=连接):


w除了
之外,
的问题是它需要一次完全的洗牌,这使得采样成本非常高。谢谢@zero323。。。谢谢你的洞察力。这些金块对于从R转换到SparkR的人来说真的很难找到。特别是当我们大多数人都试图用小数据集示例学习SparkR时。。。当您将SparkR用于为其设计的大型数据集时,很难知道使用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 <- except(B, b1)