调用 .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|
#+------+------+
这是此Scala问题的Pyspark版本。我在这里发布它是因为在搜索Pyspark解决方案时找不到答案,并且我认为这对其他人可能会有所帮助。
圆形
最简单的选择是使用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|
#+-----------+--------------+
如此答案的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|
#+----------+------------+
只需包含一个功能女巫的答案,只处理浮点和双列即可。
import pyspark.sql.functions as F
from pyspark.sql import DataFrame
def dataframe_format_float(df: DataFrame, num_decimals=4) -> DataFrame:
r = []
for c in df.dtypes:
name, dtype = c[0], c[1]
if dtype in ['float', 'double']:
r.append(F.round(name, num_decimals).alias(name))
else:
r.append(name)
df = df.select(r)
return df