scala - 使用空/空字段值创建新的数据框

标签 scala apache-spark dataframe apache-spark-sql

我正在从现有数据框创建一个新的数据框,但是需要在此新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:Add an empty column to spark DataFrame

关于scala - 使用空/空字段值创建新的数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32067467/

相关文章:

scala - Actor 模型中 Actor 的生命周期

apache-spark - ORC 文件上的 Spark SQL 不返回正确的架构(列名)

python - 如何将整数数据表(来自 Python 数据表库)正确转换为 pandas Dataframe

python - 按日期之间的最小绝对差按组选择行

Scala 元组到字符串(使用 mkString)

Scala 编写 lisp-like progn 的方法?

mysql - 我的代码中的 SlickConfig 和 Guice 配置错误

apache-spark - Spark无法解析时间戳字段

java - Spark sql如何在不丢失空值的情况下爆炸

python - 根据值的条件对数据框中的列重新排序