我尝试使用以下代码将一列空值附加到SparkR DataFrame:
w <- rbind(3, 0, 2, 3, NA, 1)
z <- rbind("a", "b", "c", "d", "e", "f")
x <- rbind(3, 3, 3, 3, 3, 3)
d <- cbind.data.frame(w, z, x)
B <- as.DataFrame(sqlContext, d)
B1 <- sample(B, withReplacement = FALSE, fraction = 0.5)
B2 <- except(B, B1)
col_sub <- c("z", "x")
B2 <- select(B2, col_sub)
B2 <- withColumn(B2, "w", lit(NA))
但是,最后一个表达式返回错误:Error in FUN(X[[i]], ...) : Unsupported data type: null
。我之前使用lit
操作生成了一列空值,但我不确定为什么这次它不会工作。
此外,之前已在SE上讨论过此问题,请参阅this question。我完全不知道为什么我的表达会产生错误。作为参考,我使用SparkR 1.6.1。
答案 0 :(得分:1)
无论是否有效,以这种方式添加列都不是一个好习惯。由于添加仅包含未定义值的列的唯一实际原因是强制执行联合或外部写入的特定架构,因此应始终使用特定类型的列。
例如:
withColumn(B2, "w", cast(lit(NULL), "double"))
答案 1 :(得分:1)
Spark列可以包含numeric,character类型。我的理解是,其他数据类型的列是非法的。
SparkR无法识别NA,就像R将其识别为缺失值的指示器一样。 SparkR将NA视为逻辑类型的值。例如:
dtypes(NA)
unable to find an inherited method for function ‘dtypes’ for signature ‘"logical"’
如果您尝试添加NA列,Spark会尝试创建逻辑类型的列,该列不是列的有效数据类型。因此错误。
有几个地方SparkR(1.6.2)在创建非法列类型时陷阱错误不一致。如您所见,如果您使用lit(NA)
,SparkR会抛出错误,但SparkR会让您使用一列NA转换R data.frame并成功创建一个类型为“logical”的非法列
x <- c(NA,NA,NA, NA, NA)
dfX <- data.frame(x)
colnames(dfX) <- c("Empty")
sdfX <- createDataFrame(sqlContext, dfX)
str(sdfX)
'DataFrame': 1 variables:
$ Empty: logi NA NA NA NA NA