如何在调用.show()
时在PySpark中设置显示精度?
考虑以下示例:
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()
哪个输出:
#+------------------+------------------+
#| col1| col2|
#+------------------+------------------+
#|10.099262230352151|14.212583322380274|
#+------------------+------------------+
如何更改它以便它只显示小数点后的3位数?
期望的输出:
#+------+------+
#| col1| col2|
#+------+------+
#|10.099|14.213|
#+------+------+
这是this scala question的PySpark版本。我在这里发帖是因为在搜索PySpark解决方案时找不到答案,我认为将来对其他人有帮助。
答案 0 :(得分:4)
最简单的选择是使用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|
#+------+------+
这会将值保持为数字类型。
scala 和 python 的functions
相同。唯一的区别是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|
#+------+------+
转换后的列为StringType
,逗号用作千位分隔符:
#+-----------+--------------+
#| col1| col2|
#+-----------+--------------+
#|500,100.000|50,489,590.000|
#+-----------+--------------+
正如此answer的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|
#+----------+------------+