Scala 更改内置Spark Sql函数的行为

Scala 更改内置Spark Sql函数的行为,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,有什么方法可以防止spark sql函数为空值 例如,我有以下数据帧 df.show +--------------------+--------------+------+------------+ | Title|Year Published|Rating|Length (Min)| +--------------------+--------------+------+------------+ | 101 Dalmatians| 01/

有什么方法可以防止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\u 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|
发布年份
列的第一行已为空,因为原始值的日期格式与其他日期不同

此行为不是
date\u format
独有的,例如
format\u number
将为非数字类型设置为空

对于我的数据集,我期望不同的日期格式和脏数据具有不可解析的值。我有一个用例,如果单元格的值无法格式化,那么我希望返回当前值,而不是null

如果无法正确应用
df2
的函数,是否有办法使spark使用
df
中的原始值而不是null

我尝试过的

我在
org.apache.spark.sql.catalyst.Expressions
中查看了包装表达式,但没有找到替换现有函数的方法


我能找到的唯一可行的解决方案是创建自己的
date\u格式
,并将其注册为udf,但这并不适用于所有函数。我正在寻找一种解决方案,如果某个函数的输入为非null,则该解决方案将永远不会返回null,或者是一种自动包装所有现有spark函数的方法。

您可能会出于自己的目的使用
coalesce
函数:

coalesce(date_format(`Year Published`, 'MM/yyyy'), `Year Published`)