Spark withColumn()执行幂函数

时间:2015-10-22 00:36:32

标签: python apache-spark pyspark

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

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"))

这有效,但我无法附加到原始数据框。

有什么想法?

这是我第一次发帖,所以我为任何格式问题道歉。

1 个答案:

答案 0 :(得分:7)

从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())