Spark orderBy(desc("col"))部分数据排序失败

Posted Python,Docker,Linux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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!

以上是关于Spark orderBy(desc("col"))部分数据排序失败的主要内容,如果未能解决你的问题,请参考以下文章

如何对包含子句“order by”、“desc”和“Limit”的多个列使用 distinct

SQL 的 增删改查 语句?

在对象 (ROOT_QUERY) 上找不到字段 allProjects("first":5,"skip":0,"orderBy":"

语句之间的 Spark SQL

SQL 数据库常用命令及语法举例

LINQ to Entities中数据分页时,必须要OrderBy吗