2015-08-18 1 views
15

Je crée une nouvelle trame de données à partir d'une trame de données existante, mais besoin d'ajouter une nouvelle colonne (« field1 » dans le code ci-dessous) dans ce nouveau DF. Comment je fais ça? Un exemple de code de travail sera apprécié.Créer un nouveau champ vide avec dataframe/valeurs nulles

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

Répondre

38

Il est possible d'utiliser 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 problème ici est que le type de colonne est null:

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

et il est pas retenu par l'écrivain csv. S'il est une exigence difficile, vous pouvez lancer la colonne du type spécifique (permet de dire String), soit avec DataType

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

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

ou description chaîne

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

ou utilisez une UDF comme celui-ci:

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, merci pour le partage cela, très utile. Voir mes modifications pour le soutien d'autres types. –

+0

@DmitriySelivanov Merci pour votre aide. J'ai abandonné l'idée d'utiliser 'Option' après quelques expériences ratées avec des littéraux il y a quelques temps :) – zero323

+1

note:' toDF() 'nécessite' import spark.implicits._' – Boern