zoukankan      html  css  js  c++  java
  • 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!

  • 相关阅读:
    Docker删除某个容器时失败解决方案
    Docker搭建redis
    Django优雅集成MongoDB
    MongoDB学习笔记:文档Crud Shell
    MongoDB学习笔记:MongoDB 数据库的命名、设计规范
    MongoDB学习笔记:快速入门
    MongoDB学习笔记:Python 操作MongoDB
    在Docker中安装MongoDB
    Linux 挂载盘
    java中Array/List/Map/Object与Json互相转换详解(转载)
  • 原文地址:https://www.cnblogs.com/wswang/p/8425819.html
Copyright © 2011-2022 走看看