起因
对数据进行三个维度的排序,用的是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!