【问题标题】:Spark withColumn() performing power functionsSpark withColumn() 执行幂函数
【发布时间】:2023-04-03 19:28:01
【问题描述】:

我有一个数据框 df,其中包含“col1”和“col2”列。我想创建第三列,它使用其中一列作为指数函数。

df = df.withColumn("col3", 100**(df("col1")))*df("col2")

但是,这总是会导致:

TypeError:** 或 pow() 不支持的操作数类型:'float' 和 'Column'

我知道这是因为函数将 df("col1") 作为“列”而不是该行的项目。

如果我执行

results = df.map(lambda x : 100**(df("col2"))*df("col2"))

这可行,但我无法附加到我的原始数据框。

有什么想法吗?

这是我第一次发帖,所以对于任何格式问题,我深表歉意。

【问题讨论】:

    标签: python apache-spark pyspark


    【解决方案1】:

    从 Spark 1.4 开始你可以使用pow 函数如下:

    from pyspark.sql import Row
    from pyspark.sql.functions import pow, col
    
    row = Row("col1", "col2")
    df = sc.parallelize([row(1, 2), row(2, 3), row(3, 3)]).toDF()
    
    df.select("*", pow(col("col1"), col("col2")).alias("pow")).show()
    
    ## +----+----+----+
    ## |col1|col2| pow|
    ## +----+----+----+
    ## |   1|   2| 1.0|
    ## |   2|   3| 8.0|
    ## |   3|   3|27.0|
    ## +----+----+----+
    

    如果您使用旧版本,Python UDF 应该可以解决问题:

    import math
    from pyspark.sql.functions import udf
    from pyspark.sql.types import DoubleType
    
    my_pow = udf(lambda x, y: math.pow(x, y), DoubleType())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-28
      • 2021-11-09
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 2021-07-13
      相关资源
      最近更新 更多