spark read functions example español scala apache-spark dataframe spark-dataframe apache-spark-sql

scala - read - Crear un nuevo marco de datos con valores de campo vacíos/nulos



spark sql functions (1)

Estoy creando un nuevo marco de datos a partir de un marco de datos existente, pero necesito agregar una nueva columna ("campo1" en el siguiente código) en este nuevo DF. ¿Cómo lo hago? Se apreciará un ejemplo de código de muestra de trabajo.

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


Es posible usar 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 aquí es que el tipo de columna es null :

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

y no es retenido por el escritor csv . Si es un requisito difícil, puede convertir la columna al tipo específico (digamos String), con DataType

import org.apache.spark.sql.types.StringType df.withColumn("foobar", lit(null).cast(StringType))

o descripción de la cadena

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

o use un UDF como este:

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)

Aquí se puede encontrar un equivalente de Python: agregue una columna vacía para generar DataFrame