在 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 日期的记录
使用窗口 Hive 或 spark scala 进行数据排列
当源表的一行中的多个列与目标表中单行的相同列匹配时,从目标 spark delta 表中删除一行