Spark SQL 如何改变数字的格式

15

show 命令执行后,Spark 会打印以下内容:

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

有没有办法将NumberColumn的格式更改为类似于0.000043的样式?
3个回答

26

您可以使用format_number函数

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

这里的5表示您想要显示的小数位数。

正如上面的链接所示,format_number函数返回一个字符串列。

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

如果您不需要“,”,则可以调用定义为

regexp_replace(Column e, String pattern, String replacement)
用rep替换与regexp匹配的指定字符串值的所有子字符串。

并将其用作

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

因此,大数字应该去掉逗号 (comma)。


1
但是这会用NumberColumn字符串类型替换掉NumberColumn。例如,如果按NumberColumn排序,则会像字符串一样排序。 - Cherry
是的,@Cherry,你说得对。你可以将它转换为Double类型,如df.withColumn("NumberColumn", format_number($"NumberColumn", 6).cast("Double")),但这样做只会产生原始的指数值。因此,要显示所有小数位,您必须将数据类型更改为字符串。 - Ramesh Maharjan

8
您可以使用以下方式进行cast操作:
val df = sc.parallelize(Seq(0.000043)).toDF("num")    

df.createOrReplaceTempView("data")
spark.sql("select CAST (num as DECIMAL(8,6)) from data")

根据需要调整精度和比例。


2
在较新版本的pyspark中,您可以使用round()或bround()函数。这些函数返回一个数字列,并解决了逗号的问题。
例如:
df.withColumn("NumberColumn", bround("NumberColumn",5))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接