2017-07-02 9 views
1

spark SQL関数がnull値から保護される方法はありますか?例えばビルトインSpark Sql関数の動作の変更

私はYear Published列にスパークSQL文date_format機能を適用したい、次のデータフレーム

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| 

を持っています。元の値が他の日付と異なる日付形式にあったよう

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にします。

私のデータセットでは、さまざまな日付形式と、データが破棄され、値が解析不能なものがあります。私はユースケースを持っています。ここでは、セルの値を書式設定できない場合、nullとは違って現在の値を返したいと考えています。

df2の機能を正しく適用できない場合、ゼロの代わりにdfに元の値を使用する方法がありますか?

私は

を試してみた私はorg.apache.spark.sql.catalyst.expressionsに巻き付け式を見てきましたが、既存の機能を交換する方法を見ることができませんでした。

私が見つけた唯一の解決策は、自分でdate_formatを作成してudfとして登録することですが、これはすべての機能にとって実用的ではありません。私は、関数への入力がnullでない場合、または既存のすべてのspark関数をラップする自動化された方法では、nullを返すことのないソリューションを探しています。

答えて

1

あなたはおそらく、あなたの目的に​​3210機能を使用することができます。

coalesce(date_format(`Year Published`, 'MM/yyyy'), `Year Published`) 
関連する問題