在 Scala Spark 中,当源列为 NULL 时如何为派生列添加默认值?

Posted

技术标签:

【中文标题】在 Scala Spark 中,当源列为 NULL 时如何为派生列添加默认值?【英文标题】:In Scala Spark, How to add default values for derived columns when source column is NULL? 【发布时间】:2020-08-03 11:23:54 【问题描述】:

我的“学生”列具有以下架构

    root
 |-- t1: integer (nullable = true)
 |-- t2: integer (nullable = true)
 |-- StudentsInfo: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- rollNumber: integer (nullable = true)
 |    |    |-- complaints: map (nullable = true)
 |    |    |    |-- key: string
 |    |    |    |-- value: struct (valueContainsNull = true)
 |    |    |    |    |-- severityOfComplaintX: integer (nullable = true)
 |    |    |    |    |-- numInstancesofComplaintX: integer (nullable = true)

我想将此“studentInfo”列转换为两个派生列

我正在派生以下两列(每一列都是“Map”类型):“compaintSeverityOfComplaintX” “compaintNumInstancesofComplaintX”。

在这里理解查询可能并不重要。它的一些工作查询从“学生”类型的列中派生出两列(类型:地图)

但是,问题是列 ("studentInfo") 的值为 NULL 时。它会跳过整行(如预期的那样)。

我想更新我的 SQL 查询,以便当 rowX 的“studentInfo”列的值为 NULL 时,它应该添加空 MAP 作为派生列“compaintSeverityOfComplaintX”和“compaintNumInstancesofComplaintX”的值

这里有什么更好的处理空值?喜欢

For row-i:
    when "students" == null:
       set newly derived column compaintSeverityOfComplaintX = empty Map
       set newly derived column compaintNumInstancesofComplaintX = empty Map
    else
       run above SQL to set proper values for newly derived columns compaintSeverityOfComplaintX and compaintNumInstancesofComplaintX

更新: 我尝试添加虚拟 studentInfo 但它给出了错误


withColumn("students", when($"students".isNull, typedLit(Seq.empty[Any])).otherwise($"students"))

错误: java.lang.RuntimeException:不支持的文字类型类 scala.collection.immutable.Nil$ List()

【问题讨论】:

【参考方案1】:

例如,假设您知道新派生列的类型,在您的例子中是 Map[K,V]。

你可以试试这样的

val derivedColumn = joinMap(col("severityOfComplaintXMapList"))

dataframe.withColumn("compaintSeverityOfComplaintX", when(col("students").isNull, typeLit[Map[String, Int]](Map.empty[String, Int]))).otherwise(derivedColumn)

【讨论】:

好的,如何修改原始查询,使其仅在 studentInfo 不为 NULL 时运行? 您可以使用 col("students").isNotNull 的其他方式。请阅读文档

以上是关于在 Scala Spark 中,当源列为 NULL 时如何为派生列添加默认值?的主要内容,如果未能解决你的问题,请参考以下文章

Spark Scala:在使用 spark 按不同日期排序后,需要获取具有 NULL 日期的记录

Scala Spark用NULL替换空String

使用窗口 Hive 或 spark scala 进行数据排列

当源表的一行中的多个列与目标表中单行的相同列匹配时,从目标 spark delta 表中删除一行

在scala./Spark代码中获取NullPointerException

当结构中的所有值都为空时,如何在 Scala spark 中使结构为空?