Spark orderBy(desc("col"))部分數據排序失敗


起因

對數據進行三個維度的排序,用的是orderBy(desc("col")),結果其中兩個維度上結果返回正確,另外一個維度上結果出現了大的排在后面的結果,錯誤的結果大概如下:

wang:2.072661
zhe:19.702593
rong:1.778491

正確維度上如下:

wang:17.069210
zhe:1.936609
rong:1.926417
yao:1.886525
排查
  1. 以為是數據取錯了,又重復的手工操作了一遍,發現數據還是這樣,想應該不是數據的問題
  2. 又在懷疑是不是碰到了bug,但是這么多人用,這么簡單的函數,怎么會有bug呢,又試了一下sort($"col".desc),發現結果還是這樣
  3. 只能回頭去看這個數的計算方式,用的是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!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM