有没有办法防止spark sql函数归零值?
例如,我有以下数据框
df.show
+--------------------+--------------+------+------------+
| Title|Year Published|Rating|Length (Min)|
+--------------------+--------------+------+------------+
| 101 Dalmatians| 01/1996| G| 103|
|101 Dalmatians (A...| 1961| G| 79|
|101 Dalmations II...| 2003| G| 70|
我想将spark sqls date_format
函数应用于Year Published
列。
val sql = """date_format(`Year Published`, 'MM/yyyy')"""
val df2 = df.withColumn("Year Published", expr(sql))
df2.show
+--------------------+--------------+------+------------+
| Title|Year Published|Rating|Length (Min)|
+--------------------+--------------+------+------------+
| 101 Dalmatians| null| G| 103|
|101 Dalmatians (A...| 01/1961| G| 79|
|101 Dalmations II...| 01/2003| G| 70|
Year Published
列的第一行已被清零,因为原始值的日期格式与其他日期不同。
此行为并非date_format
所独有,例如format_number
将使非数字类型为空。
使用我的数据集,我希望不同的日期格式和脏数据具有不可解析的值。我有一个用例,如果无法格式化单元格的值,那么我想返回当前值而不是null。
如果df
的函数无法正确应用,有没有办法让spark使用df2
中的原始值而不是null?
我尝试了什么
我已经考虑过在org.apache.spark.sql.catalyst.expressions
中包装表达式,但看不到替换现有功能的方法。
我能找到的唯一可行解决方案是创建自己的date_format
并将其注册为udf,但这对所有函数都不实用。我正在寻找一种解决方案,如果函数的输入是非null或者是一种自动封装所有现有spark函数的方法,它将永远不会返回null。
答案 0 :(得分:1)
您可以将coalesce
功能用于您的目的:
coalesce(date_format(`Year Published`, 'MM/yyyy'), `Year Published`)