python - Spark withColumn() 执行幂函数

标签 python apache-spark pyspark

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

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

但是,这总是导致:

TypeError: unsupported operand type(s) for ** or pow(): 'float' and 'Column'

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

如果我执行

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

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

有什么想法吗?

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

最佳答案

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

关于python - Spark withColumn() 执行幂函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33271558/

相关文章:

python - Py4JJavaError : An error occurred while calling o389. parquet 尝试将 rdd 数据帧写入本地目录上的 parquet 文件

python - 异常 : Failed to start new browser session: Error while launching browser Selenium in Python

python - 仅更改 pandas DataFrame 中的数值数据

python - cv2.aruco.detectMarkers 不检测 python 中的标记

java - 在 Spark 中执行两次 groupbykey 的最佳实践?

python - 使用 PySpark 在数据框上应用 sklearn 训练模型

python - 删除列表列表中每个列表中的重复值

scala - 使用Scala将Map映射到Spark appln中的可变列表

apache-spark - Spark Dataset/Dataframe join NULL skew key

java - 在 Pyspark 中访问 JavaRDD