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