2015-08-18 10 views
15

Sto creando un nuovo Dataframe da un dataframe esistente, ma è necessario aggiungere una nuova colonna ("campo1" nel codice sottostante) in questo nuovo DF. Come faccio a farlo? L'esempio di codice di esempio funzionante sarà apprezzato.Crea nuovo Dataframe con valori di campo vuoto/nullo

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

risposta

38

E 'possibile utilizzare lit(null):

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

Un problema qui è che il tipo di colonna è null:

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

e non è trattenuto dal csv scrittore. Se si tratta di un requisito difficile si può lanciare colonna al tipo specifico (diciamo String), sia con DataType

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

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

o stringa di descrizione

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

o utilizzare un'UDF come questo:

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, grazie per aver condiviso questo, molto utile. Vedi le mie modifiche per supportare altri tipi. –

+0

@DmitriySelivanov Grazie per la tua utile modifica. Ho rinunciato all'idea di usare 'Option' dopo alcuni esperimenti falliti con letterali qualche tempo fa :) – zero323

+1

nota:' toDF() 'richiede' import spark.implicits._' – Boern