包含 pyspark SQL: TypeError: 'Column' object is not callable
Posted
技术标签:
【中文标题】包含 pyspark SQL: TypeError: \'Column\' object is not callable【英文标题】:contains pyspark SQL: TypeError: 'Column' object is not callable包含 pyspark SQL: TypeError: 'Column' object is not callable 【发布时间】:2018-12-14 22:24:39 【问题描述】:我使用的是 spark 2.0.1,
df.show()
+--------+------+---+-----+-----+----+
|Survived|Pclass|Sex|SibSp|Parch|Fare|
+--------+------+---+-----+-----+----+
| 0.0| 3.0|1.0| 1.0| 0.0| 7.3|
| 1.0| 1.0|0.0| 1.0| 0.0|71.3|
| 1.0| 3.0|0.0| 0.0| 0.0| 7.9|
| 1.0| 1.0|0.0| 1.0| 0.0|53.1|
| 0.0| 3.0|1.0| 0.0| 0.0| 8.1|
| 0.0| 3.0|1.0| 0.0| 0.0| 8.5|
| 0.0| 1.0|1.0| 0.0| 0.0|51.9|
我有一个数据框,我想使用 withColumn 向 df 添加一个新列,并且新列的值基于其他列值。我用过这样的东西:
>>> dfnew = df.withColumn('AddCol' , when(df.Pclass.contains('3.0'),'three').otherwise('notthree'))
报错
TypeError: 'Column' object is not callable
可以帮助解决这个错误。
【问题讨论】:
【参考方案1】:这是因为您试图将函数 contains
应用于列。 pyspark 中不存在函数contains
。你应该试试like
。试试这个:
import pyspark.sql.functions as F
df = df.withColumn("AddCol",F.when(F.col("Pclass").like("3"),"three").otherwise("notthree"))
或者,如果您只是希望它恰好是数字 3
,您应该这样做:
import pyspark.sql.functions as F
# If the column Pclass is numeric
df = df.withColumn("AddCol",F.when(F.col("Pclass") == F.lit(3),"three").otherwise("notthree"))
# If the column Pclass is string
df = df.withColumn("AddCol",F.when(F.col("Pclass") == F.lit("3"),"three").otherwise("notthree"))
【讨论】:
函数contains
在文档中描述,没有任何X.X版本中的新功能警告as seen here。知道为什么不可用吗?
在这种情况下,用户使用的是 pyspark 2.0.1,其中包含不可用。检查您的 pyspark 版本,因为 contains 仅适用于 2.2 及更高版本。干杯。【参考方案2】:
你应该使用 df.col(colName) 而不是 df.colName
使用 java 8 和 spark 2.1 的示例:
df.show();
+--------+------+---+-----+-----+----+
|Survived|Pclass|Sex|SibSp|Parch|Fare|
+--------+------+---+-----+-----+----+
| 0| 3| 1| 1| 0| 3|
| 1| 1| 0| 1| 0| 2|
+--------+------+---+-----+-----+----+
df = df.withColumn("AddCol", when(df.col("Pclass").contains("3"),"three").otherwise("notthree"));
df.show();
+--------+------+---+-----+-----+----+--------+
|Survived|Pclass|Sex|SibSp|Parch|Fare| AddCol|
+--------+------+---+-----+-----+----+--------+
| 0| 3| 1| 1| 0| 3| three|
| 1| 1| 0| 1| 0| 2|notthree|
+--------+------+---+-----+-----+----+--------+
【讨论】:
以上是关于包含 pyspark SQL: TypeError: 'Column' object is not callable的主要内容,如果未能解决你的问题,请参考以下文章
pyspark:TypeError:'float'对象不可迭代
# 字符串方法 TypeError: 列在 pyspark 中不可迭代
PySpark:TypeError:“行”对象不支持项目分配