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

Append a column of NA values: lit() and withColumn() giving error

我正在尝试使用以下代码将一列空值附加到 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))

但是,最后一个表达式returns错误:Error in FUN(X[[i]], ...) : Unsupported data type: null。我之前用lit操作产生了一列空值,但我不知道为什么这次不行。

此外,之前在 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 会让您将 R data.frame 转换为一列 NA,并且它会成功创建类型为 "logical"[ 的非法列=14=]

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