Scala 更改内置Spark Sql函数的行为
有什么方法可以防止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/
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 sqlsdate\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`)