在scala spark中,当源列为null时,如何为派生列添加默认值?

fruv7luv  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(524)

我有一个列“学生”与下列模式

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”。
在这里,理解查询可能并不重要。它是一个工作查询,从“students”类型的列派生出两列(类型:map)
但是,问题是当列(“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()

xeufq47z

xeufq47z1#

例如,假设您知道新派生列的类型,在您的例子中是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)

相关问题