使用圆形函数转换 pyspark 数据框列不起作用(pyspark)

Posted

技术标签:

【中文标题】使用圆形函数转换 pyspark 数据框列不起作用(pyspark)【英文标题】:Transforming pyspark data frame column with round function not working (pyspark) 【发布时间】:2019-07-09 15:44:58 【问题描述】:

我想创建一个火花数据框的新列,其中包含已存在列的四舍五入值。 “em”列的类型是浮点数。

我已经检查了各种帖子,但无法弄清楚。包括以下链接:Trouble With Pyspark Round Function

这是我的代码:

import pyspark.sql.functions as f
df = df.withColumn("rounded", f.round(f.col("em"), 3))
df.show()

新生成的列“rounded”与原始列“em”完全相同。我正在 Cloudera 集群上的 Zeppelin Notebook 中使用 pyspark 2.3.0 版。

更新:

尝试了以下方法:

%pyspark
s2_em = s2.select('em')
print "Datatype:", type(s2_em)
s2_em.printSchema()
s2_em = s2_em.withColumn('rounded', f.round(f.col('em'), 3))
s2_em = s2_em.withColumn('plus', f.col('em') + f.col('rounded'))
s2_em = s2_em.withColumn('minus', f.col('em') - f.col('rounded'))
s2_em = s2_em.withColumn('multiplication', f.col('em') * f.col('rounded'))
s2_em.limit(5).show()

这会产生以下结果,但四舍五入仍然不起作用。还有其他提示吗?:

Datatype: <class 'pyspark.sql.dataframe.DataFrame'>
root |-- em: float (nullable = true)
+------------+------------+------------+-----+--------------+
|          em|     rounded|        plus|minus|multiplication|
+------------+------------+------------+-----+--------------+
|1.14209626E9|1.14209626E9|2.28419251E9| 0.0|   1.3043839E18|
|1.25046528E9|1.25046528E9|2.50093056E9| 0.0|  1.56366345E18|
| 9.5720672E8| 9.5720672E8|1.91441344E9| 0.0|   9.1624469E17|
| 1.1392649E9| 1.1392649E9|2.27852979E9| 0.0|  1.29792455E18|
|1.29539699E9|1.29539699E9|2.59079398E9| 0.0|  1.67805334E18|
+------------+------------+------------+-----+--------------+

【问题讨论】:

df = df.withColumn("rounded", f.round(f.col("em"), 3)).show()中的显示不正确,你必须删除它 【参考方案1】:

用相同的代码做了一个测试,它运行完美,见下面的例子:

import pyspark.sql.functions as f
from pyspark import Row
from pyspark.shell import spark

df = spark.createDataFrame([
    Row(em=3.45631),
    Row(em=2.82945),
    Row(em=7.76261),
    Row(em=2.76790)
])

df = df.withColumn('rounded', f.round(f.col('em'), 3))
df.show()

输出:

+-------+-------+                                                               
|     em|rounded|
+-------+-------+
|3.45631|  3.456|
|2.82945|  2.829|
|7.76261|  7.763|
| 2.7679|  2.768|
+-------+-------+

更新

其实它的浮点值包含指数E9E8。例如,值1.14209626E9 等于1142096260

要将它们四舍五入,需要将值除以1e9,然后调用round函数。

请看下面的例子:

import pyspark.sql.functions as f
from pyspark import Row
from pyspark.shell import spark

df = spark.createDataFrame([
    Row(em=1.14209626E9),
    Row(em=1.25046528E9),
    Row(em=9.5720672E8)
])

df = df.withColumn('rounded', (f.round(f.col('em') / 1e9, 3)) * 1e9)
df.show()

输出:

+------------+-------+
|          em|rounded|
+------------+-------+
|1.14209626E9|1.142E9|
|1.25046528E9| 1.25E9|
| 9.5720672E8| 9.57E8|
+------------+-------+

【讨论】:

嗨@Kafels,谢谢你的例子,如果我运行你的代码,它工作得很好。但是:如果我尝试为我自己的数据框运行它,它仍然无法正常工作。我正在研究 Zeppelin Notebook。也许我的数据框有问题,“em”列不会四舍五入。我只是尝试用 + 创建另一个列,并且有效。是不是使用了round()函数的pyspark实现?

以上是关于使用圆形函数转换 pyspark 数据框列不起作用(pyspark)的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 pyspark 中加入两个临时视图后删除列不起作用,但它适用于数据框连接?

如何将数据框列转换为字符串并替换 nans(fillna 不起作用)

将列表转换为pyspark中的数据框列

pySpark - 在插入数据库之前将整个数据框列转换为 JSON 对象

如何使用 pyspark 在数据块中循环数据框列

在 Pyspark 中列出保存顺序的数据框列