我有一个列“学生”与下列模式
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()
1条答案
按热度按时间xeufq47z1#
例如,假设您知道新派生列的类型,在您的例子中是map[k,v]。
你可以试试这样的