内置Spark Sql函数的更改行为

时间:2017-07-02 20:59:33

标签: scala apache-spark apache-spark-sql

有没有办法防止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。

1 个答案:

答案 0 :(得分:1)

您可以将coalesce功能用于您的目的:

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