2015-08-18 20 views
15

Ich erstelle einen neuen Dataframe aus einem vorhandenen Datenframe, muss jedoch in diesem neuen DF eine neue Spalte ("field1" in unterem Code) hinzufügen. Wie mache ich das? Beispielcode für das Arbeiten mit Beispielcode wird geschätzt.Erstellen eines neuen Datenrahmens mit leeren Feldwerten

val edwDf = omniDataFrame 
    .withColumn("field1", callUDF((value: String) => None)) 
    .withColumn("field2", 
    callUdf("devicetypeUDF", (omniDataFrame.col("some_field_in_old_df")))) 

edwDf 
    .select("field1", "field2") 
    .save("odsoutdatafldr", "com.databricks.spark.csv"); 

Antwort

38

Es ist möglich, lit(null) zu verwenden:

import org.apache.spark.sql.functions.{lit, udf} 

case class Record(foo: Int, bar: String) 
val df = Seq(Record(1, "foo"), Record(2, "bar")).toDF 

val dfWithFoobar = df.withColumn("foobar", lit(null: String)) 

Ein Problem dabei ist, dass der Spaltentyp ist null:

scala> dfWithFoobar.printSchema 
root 
|-- foo: integer (nullable = false) 
|-- bar: string (nullable = true) 
|-- foobar: null (nullable = true) 

und es ist nicht von den csv Schriftstellern beibehalten. Wenn es eine harte Anforderung ist, können Sie Spalte auf den speziellen Typ gegossen (können sagen, String), entweder mit DataType

import org.apache.spark.sql.types.StringType 

df.withColumn("foobar", lit(null).cast(StringType)) 

oder String Beschreibung

df.withColumn("foobar", lit(null).cast("string")) 

oder ein UDF wie folgt verwenden:

val getNull = udf(() => None: Option[String]) // Or some other type 

df.withColumn("foobar", getNull()).printSchema 
root 
|-- foo: integer (nullable = false) 
|-- bar: string (nullable = true) 
|-- foobar: string (nullable = true) 
+1

@ zero323, vielen Dank für das Teilen, sehr hilfreich. Siehe meine Änderungen für Unterstützung anderer Typen. –

+0

@DmitriySelivanov Vielen Dank für Ihre hilfreiche Bearbeitung. Ich habe die Idee aufgegeben, 'Option' nach einigen fehlgeschlagenen Experimenten mit Literalen vor einer Weile zu verwenden :) – zero323

+1

hinweis:' toDF() 'erfordert' import spark.implicits._' – Boern

Verwandte Themen