起因
對資料進行三個次元的排序,用的是
orderBy(desc("col"))
,結果其中兩個次元上結果傳回正确,另外一個次元上結果出現了大的排在後面的結果,錯誤的結果大概如下:
wang:2.072661
zhe:19.702593
rong:1.778491
正确次元上如下:
wang:17.069210
zhe:1.936609
rong:1.926417
yao:1.886525
排查
- 以為是資料取錯了,又重複的手工操作了一遍,發現資料還是這樣,想應該不是資料的問題
- 又在懷疑是不是碰到了bug,但是這麼多人用,這麼簡單的函數,怎麼會有bug呢,又試了一下
,發現結果還是這樣sort($"col".desc)
- 隻能回頭去看這個數的計算方式,用的是udf函數,如下
def getRate(end_rate: Double, start_rate: Double): String = {
((end_rate - start_rate) / start_rate).formatted("%.6f")
}
val rateUDF = udf( (end_rate: Double, start_rate: Double) => {getRate(end_rate, start_rate)} )
恍然大悟,開始寫的時候,傳回的是一個
Double
類型,但是由于要
formatted
,結果傳回的是
String
,我就把傳回類型寫成了
String
,程式可以跑起來了,我就忽略了這個事情,結果就發生了錯誤。
也就是說,這些看上去雖然是數字,但是實際上是字元串,此時排序也是按照字元串排序了,正确的次元上,首字元都是1,也隻有1位,是以就說正确的排序;但是錯誤的次元上,19那個雖然是兩位數,但是首字元是1,是以排到了後面。隻需要講udf函數改成傳回Double,然後排序後再進行format就可以了。
Done!