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