我正在从现有数据框架创建新的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");
答案 0 :(得分:61)
可以使用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
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等效项:Add an empty column to spark DataFrame
答案 1 :(得分:6)
只是为了扩展@ 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。