2016-07-15 3 views
0

Я пытаюсь добавить столбец нулевых значений в SparkR DataFrame со следующим кодом:Append столбца значений NA: освещенный() и withColumn() дает ошибку

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.

ответ

1

Независимо от того, работает ли это или нет, этот столбец не является хорошей практикой. Поскольку единственной практической причиной добавления столбца, который содержит только неопределенные значения, является принудительная реализация определенной схемы для союзов или внешней записи, вы всегда должны использовать столбцы определенного типа.

Например:

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

Свечи столбцы могут иметь типы цифровой, характер. Я понимаю, что предполагается, что столбцы других типов данных являются незаконными.

NA не распознается SparkR так же, как R распознает его как индикатор недостающего значения. SparkR видит NA как значение логического типа. Например:

dtypes(NA) 

unable to find an inherited method for function ‘dtypes’ for signature ‘"logical"’

Если вы пытаетесь добавить колонку НС, Спарк пытается создать столбец типа логического, который не является допустимым типом данных столбца. Отсюда и ошибка.

Есть несколько мест, где SparkR (1.6.2) не соответствует ошибкам захвата при создании запрещенных типов столбцов. Как вы нашли, SparkR выдает ошибку, если вы используете lit(NA), но SparkR позволит вам преобразовать 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