如何在PySpark Dataframe show中设置显示精度

pau*_*ult 5 pyspark spark-dataframe

调用时如何在PySpark中设置显示精度.show()

考虑以下示例:

from math import sqrt
import pyspark.sql.functions as f

data = zip(
    map(lambda x: sqrt(x), range(100, 105)),
    map(lambda x: sqrt(x), range(200, 205))
)
df = sqlCtx.createDataFrame(data, ["col1", "col2"])
df.select([f.avg(c).alias(c) for c in df.columns]).show()
Run Code Online (Sandbox Code Playgroud)

哪个输出:

#+------------------+------------------+
#|              col1|              col2|
#+------------------+------------------+
#|10.099262230352151|14.212583322380274|
#+------------------+------------------+
Run Code Online (Sandbox Code Playgroud)

如何更改它,使其仅在小数点后显示3位数字?

所需的输出:

#+------+------+
#|  col1|  col2|
#+------+------+
#|10.099|14.213|
#+------+------+
Run Code Online (Sandbox Code Playgroud)

这是此scala问题的PySpark版本。我将其发布在这里是因为在搜索PySpark解决方案时找不到答案,并且我认为它将来可能会对其他人有所帮助。

pau*_*ult 6

回合

最简单的选择是使用pyspark.sql.functions.round()

from pyspark.sql.functions import avg, round
df.select([round(avg(c), 3).alias(c) for c in df.columns]).show()
#+------+------+
#|  col1|  col2|
#+------+------+
#|10.099|14.213|
#+------+------+
Run Code Online (Sandbox Code Playgroud)

这会将值保留为数字类型。

格式编号

functions对于scalapython,它们是相同的。唯一的区别是import

您可以format_number按照官方api文档中所述将数字格式设置为所需的小数位:

将数字列x的格式设置为类似于'#,###,###。##'的格式,四舍五入到d个小数位,然后将结果作为字符串列返回。

from pyspark.sql.functions import avg, format_number 
df.select([format_number(avg(c), 3).alias(c) for c in df.columns]).show()
#+------+------+
#|  col1|  col2|
#+------+------+
#|10.099|14.213|
#+------+------+
Run Code Online (Sandbox Code Playgroud)

转换后的列将以StringType和逗号用作千位分隔符:

#+-----------+--------------+
#|       col1|          col2|
#+-----------+--------------+
#|500,100.000|50,489,590.000|
#+-----------+--------------+
Run Code Online (Sandbox Code Playgroud)

如该答案的scala版本中所述,我们可以使用regexp_replace替换为所需,的任何字符串

将与regexp匹配的指定字符串值的所有子字符串替换为rep。

from pyspark.sql.functions import avg, format_number, regexp_replace
df.select(
    [regexp_replace(format_number(avg(c), 3), ",", "").alias(c) for c in df.columns]
).show()
#+----------+------------+
#|      col1|        col2|
#+----------+------------+
#|500100.000|50489590.000|
#+----------+------------+
Run Code Online (Sandbox Code Playgroud)