【问题标题】:Spark SQL change format of the numberSpark SQL 更改数字的格式
【发布时间】:2017-07-10 08:51:27
【问题描述】:

show 命令 spark 打印以下内容后:

+-----------------------+---------------------------+
|NameColumn             |NumberColumn               |
+-----------------------+---------------------------+
|name                   |4.3E-5                     |
+-----------------------+---------------------------+

有没有办法将NumberColumn 格式更改为0.000043 之类的格式?

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    你可以使用format_numberfunction作为

    import org.apache.spark.sql.functions.format_number
    df.withColumn("NumberColumn", format_number($"NumberColumn", 5))
    

    这里 5 是你要显示的小数位

    正如您在上面的链接中看到的那样,format_number 函数返回一个 字符串列

    format_number(列 x,int d)
    将数字列 x 格式化为类似 '#,###,###.##' 的格式,四舍五入到 d 位小数,并将结果作为字符串列返回。

    如果您不需要,,您可以调用regexp_replace 函数,该函数定义为

    regexp_replace(e 列,字符串模式,字符串替换)
    将指定字符串值的所有与正则表达式匹配的子字符串替换为rep。

    并将其用作

    import org.apache.spark.sql.functions.regexp_replace
    df.withColumn("NumberColumn", regexp_replace(format_number($"NumberColumn", 5), ",", ""))
    

    因此 逗号 (,) 应该删除大数字。

    【讨论】:

    • 但这会将NumberColumn 替换为NumberColumn 字符串类型。例如。如果我按NumberColumn 订购,它将像字符串一样订购。
    • 是的@Cherry,你是对的。您可以将其转换为 Double as df.withColumn("NumberColumn", format_number($"NumberColumn", 6).cast("Double")),但这样做只会产生原始指数值。因此,要显示所有十进制值,您必须将数据类型更改为字符串。
    【解决方案2】:

    您可以使用cast操作如下:

    val df = sc.parallelize(Seq(0.000043)).toDF("num")    
    
    df.createOrReplaceTempView("data")
    spark.sql("select CAST (num as DECIMAL(8,6)) from data")
    

    相应地调整精度和比例。

    【讨论】:

      【解决方案3】:

      在较新版本的 pyspark 中,您可以使用 round() 或 bround() 函数。 这些函数返回一个数字列并用“,”解决问题。

      应该是这样的:

      df.withColumn("NumberColumn", bround("NumberColumn",5))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-11
        • 1970-01-01
        • 1970-01-01
        • 2018-01-11
        • 2021-12-31
        • 1970-01-01
        相关资源
        最近更新 更多