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!

  • 相关阅读:
    awk常用命令
    Linux 指令篇:使用者管理--sudo
    sax解析xml案例一
    DefaultHandler类
    Linux上vi(vim)编辑器使用教程
    SecureCRT上传下载数据的方法
    K近邻的决策边界以及K的影响
    KNN交叉验证,找出合适的K值
    KNN(K邻近值算法)手动版与库函数调用版
    linear_model.LinearRegression()线性回归之身高预测体重
  • 原文地址:https://www.cnblogs.com/wswang/p/8425819.html
Copyright © 2011-2022 走看看