r语言 - 附加一列 NA 值:lit() 和 withColumn() 给出错误



我正在尝试使用以下代码将一列空值附加到 SparkR 数据帧:

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 操作来生成一列 null 值,但我不确定为什么这次它不起作用。

另外,这之前已经在SE上讨论过,请参阅此问题。我完全不知道为什么我的表达式会产生这个错误。作为参考,我使用的是SparkR 1.6.1。

无论它是否有效,以这种方式添加列都不是一种好的做法。由于添加仅包含未定义值的列的唯一实际原因是对联合或外部写入强制实施特定架构,因此应始终使用特定类型的列。

例如:

withColumn(B2, "w", cast(lit(NULL), "double"))

Spark 列可以具有数字、字符的类型。 我的理解是,其他数据类型的列是非法的。

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,并成功创建一个类型为"逻辑"的非法列

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

最新更新