用空/null字段值创建新的Dataframe



我正在从现有的数据框创建一个新的数据框,但需要在这个新的DF中添加新的列("field1"在下面的代码中)。我该怎么做呢?工作示例代码示例将被欣赏。

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

可以使用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))

这里的一个问题是列类型是null:

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

,不被csv写入器保留。如果这是一个硬性要求,您可以使用DataType

将列转换为特定类型(例如String)。
import org.apache.spark.sql.types.StringType
df.withColumn("foobar", lit(null).cast(StringType))

或字符串描述

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

或者像这样使用UDF:

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)

可以在这里找到对应的Python:添加一个空列到spark DataFrame

为了扩展@zero323提供的完美答案,这里有一个可以从Spark 2.2.0开始使用的解决方案。

import org.apache.spark.sql.functions.typedLit
df.withColumn("foobar", typedLit[Option[String]](None)).printSchema
root
 |-- foo: integer (nullable = false)
 |-- bar: string (nullable = true)
 |-- foobar: string (nullable = true)

与第三个解决方案类似,但不使用任何UDF。

相关内容

  • 没有找到相关文章

最新更新