PySpark:列的绝对值.TypeError:需要一个float

Yue*_*Lyu 4 python apache-spark apache-spark-sql pyspark pyspark-sql

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

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

看起来像

+---+-----+
| Id|Value|
+---+-----+
|  a|  5.0|
|  b|  1.0|
|  c| -0.3|
+---+-----+
Run Code Online (Sandbox Code Playgroud)

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

+---+-----+
| Id|Value|
+---+-----+
|  a|  5.0|
|  b|  1.0|
|  c|  0.3|
+---+-----+
Run Code Online (Sandbox Code Playgroud)

我试过了

df = df.withColumn('Value',math.fabs(df.Value))
Run Code Online (Sandbox Code Playgroud)

但它抱怨TypeError:需要一个浮点数.但是,Value列是使用FloatType()指定的.

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

mto*_*oto 14

您可以使用本机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|
+---+-----+
Run Code Online (Sandbox Code Playgroud)

  • 我认为有更好的方法来导入“abs”而不影响 python 原生“abs”。更好的方法:“... import abs as abs_” 或“from pyspark.sql import functions as F”,然后“F.abs()”。 (4认同)