起因
對數據進行三個維度的排序,用的是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!
