zdc*_*eng 5 python apache-spark pyspark
我有一个数据框df,列"col1"和"col2".我想创建第三列,使用其中一列作为指数函数.
df = df.withColumn("col3", 100**(df("col1")))*df("col2")
Run Code Online (Sandbox Code Playgroud)
但是,这总是会导致:
TypeError:**或pow()的不支持的操作数类型:'float'和'Column'
我知道这是由于函数将df("col1")作为"列"而不是该行的项目.
如果我表演
results = df.map(lambda x : 100**(df("col2"))*df("col2"))
Run Code Online (Sandbox Code Playgroud)
这是有效的,但我不能附加到我的原始数据框.
有什么想法吗?
这是我第一次发帖,所以我为任何格式问题道歉.
从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|
## +----+----+----+
Run Code Online (Sandbox Code Playgroud)
如果您使用旧版本,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())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6531 次 |
| 最近记录: |