2016-10-27 20 views
0

Sparkを使用して値のない数値フィールドにnullを設定する必要があるソリューションを探しています。私が書いたコードは以下の通りである:sparkを使用してHiveテーブルの数値データ型にnullを設定する

val myDF = sqlContext.sql("from mystg.my_acct_table select id,amt,tot_amt where id=12345") 
myDF.map(row => {val row1 = row.getAs[Double]("tot_amt") 
     val my_tot_amt = { 
      if(row1.isNaN()) 
       null.asInstanceOf[Double] 
      else 
       Math.abs(row1.toDouble) 
     } 
    Row(row(0),row(1),my_tot_amt) 
    }) 

Iはまた、行(ロウ(0)、行(1)、my_tot_amt)上記論理を入れてみました。

Row(row(0),row(1),(if(row1.isNaN()) 
        null.asInstanceOf[Double] 
       else 
        Math.abs(row1.toDouble))) 

しかし、私は出力を としています。 8687992537618075 | 1163.35 | 0.0 |

予想される出力は です。 8687992537618075 | 1163.35 | null |

答えて

1

null.asInstanceOf[Double]は、0.0である。ちょうどそれをキャストしないでください:

val my_tot_amt = if(row1.isNaN()) 
    null 
else 
    Math.abs(row1.toDouble) 

(これはmy_tot_amtAnyの種類になります。val my_tot_amt: java.lang.Double = ...は、より正確なですが、この特定の場合には必要ありません)動作するはずです。

0.0ここで、row("tot_amt")はすでにnullです。これは意図的なのでしょうか?

+0

ハイブの値をチェックすると空になります。つまり、そのフィールドにはnullが設定されていません。だから私はそのようなレコードをチェックし、値をnullに更新する必要があります。はい、私は値を0.0にしたくないが、nullにする必要があります。 –

関連する問題