PySpark:列的绝对值。类型错误:需要浮点数

Posted

技术标签:

【中文标题】PySpark:列的绝对值。类型错误:需要浮点数【英文标题】:PySpark: Absolute value of a column. TypeError: a float is required 【发布时间】:2017-05-18 12:27:58 【问题描述】:

我有一个数据框df 创建如下,

schema = StructType([StructField('Id', StringType(), False),
                     StructField('Value', FloatType(), False)])  
df = spark.createDataFrame([('a',5.0),('b',1.0),('c',-0.3)],schema)

看起来像

+---+-----+
| Id|Value|
+---+-----+
|  a|  5.0|
|  b|  1.0|
|  c| -0.3|
+---+-----+

现在我想取Value 的绝对值,它应该返回

+---+-----+
| Id|Value|
+---+-----+
|  a|  5.0|
|  b|  1.0|
|  c|  0.3|
+---+-----+

我试过了

df = df.withColumn('Value',math.fabs(df.Value))

但它抱怨TypeError: a float is required. 但是值列是用FloatType() 指定的。

关于如何正确执行此操作的任何线索?谢谢!

【问题讨论】:

【参考方案1】:

可以使用原生的Spark函数abs()

from  pyspark.sql.functions import abs

df1 = df.withColumn('Value',abs(df.Value))
df1.show()
+---+-----+
| Id|Value|
+---+-----+
|  a|  5.0|
|  b|  1.0|
|  c|  0.3|
+---+-----+

【讨论】:

太棒了。我以前试过这个,但没有导入 abs,得到一个 TypeError: 'Column' object is not callable,这对我来说有点误导。谢谢! 我认为有更好的方法来导入abs,而不影响python原生abs。更好的方法:... import abs as abs_from pyspark.sql import functions as F 然后F.abs()

以上是关于PySpark:列的绝对值。类型错误:需要浮点数的主要内容,如果未能解决你的问题,请参考以下文章

核心 OCaml 中浮点数的绝对值

不能在 QTableWidget 中添加两列。错误 - DeprecationWarning:需要一个整数(获取类型浮点数)

浮点数和整数相加并取绝对值

PySpark:使用过滤器功能后取一列的平均值

Pyspark - ValueError:无法将字符串转换为浮点数/浮点()的无效文字

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