web-dev-qa-db-fra.com

Créer un nouveau Dataframe avec des valeurs de champ vide / nul

Je crée un nouveau Dataframe à partir d'un dataframe existant, mais je dois ajouter une nouvelle colonne ("field1" dans le code ci-dessous) dans ce nouveau DF. Comment dois-je procéder? Un exemple de code de travail sera apprécié.

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

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 n'est pas conservé par le rédacteur csv. S'il s'agit d'une exigence difficile, vous pouvez convertir la colonne en un type spécifique (disons String), avec DataType

import org.Apache.spark.sql.types.StringType

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

ou description de chaîne

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

ou utilisez un 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)

Un Python équivalent peut être trouvé ici: Ajouter une colonne vide à spark DataFrame

67
zero323