【问题标题】:PySpark: Absolute value of a column. TypeError: a float is requiredPySpark:列的绝对值。类型错误:需要浮点数
【发布时间】: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() 指定的。

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

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql


    【解决方案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()。
    猜你喜欢
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多