2016-07-15 37 views
0

Ich versuche, eine Spalte von NULL-Werte zu einem SparkR Datenrahmen mit dem folgenden Code anhängen:Fügen Sie eine Spalte von NA-Werte: lit() und withColumn() geben Fehler

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)) 

Aber der letzte Ausdruck gibt den Fehler zurück: Error in FUN(X[[i]], ...) : Unsupported data type: null. Ich habe die Operation lit verwendet, um vorher eine Spalte mit Nullwerten zu erzeugen, aber ich bin mir nicht sicher, warum es diesmal nicht funktioniert.

Auch dies wurde bereits im SE behandelt, siehe this question. Ich bin völlig ahnungslos, warum mein Ausdruck diesen Fehler ergibt. Als Referenz verwende ich SparkR 1.6.1.

Antwort

1

Egal, ob es funktioniert oder nicht hinzufügen Spalte auf diese Weise ist keine gute Praxis. Da der einzige praktische Grund zum Hinzufügen einer Spalte, die nur undefinierte Werte enthält, das Erzwingen eines spezifischen Schemas für Vereinigungen oder externe Schreibvorgänge ist, sollten Sie immer Spalten eines bestimmten Typs verwenden.

Zum Beispiel:

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

Spark-Spalten numerische Typen haben, Zeichen. Mein Verständnis ist, dass Spalten anderer Datentypen nicht zulässig sind.

NA wird von SparkR nicht auf dieselbe Weise erkannt wie R es als Indikator für einen fehlenden Wert erkennt. SparkR sieht NA als einen Wert vom Typ logisch. Zum Beispiel:

dtypes(NA) 

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

Wenn Sie versuchen, eine Spalte von NA, Funken hinzuzufügen versucht, eine Spalte des Typs logisch, zu schaffen, die kein gültiger Datentyp für eine Spalte ist. Daher der Fehler.

Es gibt ein paar Stellen, an denen SparkR (1.6.2) beim Einfangen von Fehlern beim Erstellen illegaler Spaltentypen inkonsistent ist. Wie Sie gefunden, wirft SparkR einen Fehler, wenn Sie lit(NA) verwenden, aber SparkR erhalten Sie eine R data.frame mit einer Säule von NAs lassen konvertieren und es schafft erfolgreich eine illegale Spalte vom Typ „logische“

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