PySpark:TypeError:条件应该是字符串或列
Posted
技术标签:
【中文标题】PySpark:TypeError:条件应该是字符串或列【英文标题】:PySpark: TypeError: condition should be string or Column 【发布时间】:2016-10-05 17:27:11 【问题描述】:我正在尝试过滤基于如下的 RDD:
spark_df = sc.createDataFrame(pandas_df)
spark_df.filter(lambda r: str(r['target']).startswith('good'))
spark_df.take(5)
但出现以下错误:
TypeErrorTraceback (most recent call last)
<ipython-input-8-86cfb363dd8b> in <module>()
1 spark_df = sc.createDataFrame(pandas_df)
----> 2 spark_df.filter(lambda r: str(r['target']).startswith('good'))
3 spark_df.take(5)
/usr/local/spark-latest/python/pyspark/sql/dataframe.py in filter(self, condition)
904 jdf = self._jdf.filter(condition._jc)
905 else:
--> 906 raise TypeError("condition should be string or Column")
907 return DataFrame(jdf, self.sql_ctx)
908
TypeError: condition should be string or Column
知道我错过了什么吗?谢谢!
【问题讨论】:
这里有一个完美的答案;) 【参考方案1】:DataFrame.filter
是DataFrame.where
的别名,它需要一个表示为Column
的SQL 表达式:
spark_df.filter(col("target").like("good%"))
或等效的 SQL 字符串:
spark_df.filter("target LIKE 'good%'")
我相信您在这里尝试使用RDD.filter
,这是完全不同的方法:
spark_df.rdd.filter(lambda r: r['target'].startswith('good'))
并且不能从 SQL 优化中受益。
【讨论】:
【参考方案2】:我已经经历过这个并决定使用 UDF:
from pyspark.sql.functions import udf
from pyspark.sql.types import BooleanType
filtered_df = spark_df.filter(udf(lambda target: target.startswith('good'),
BooleanType())(spark_df.target))
更易读的是使用普通函数定义而不是 lambda
【讨论】:
【参考方案3】:将数据帧转换为rdd。
spark_df = sc.createDataFrame(pandas_df)
spark_df.rdd.filter(lambda r: str(r['target']).startswith('good'))
spark_df.take(5)
我认为它可能有效!
【讨论】:
它肯定会起作用。但是数据框提供的优化将会丢失以上是关于PySpark:TypeError:条件应该是字符串或列的主要内容,如果未能解决你的问题,请参考以下文章
# 字符串方法 TypeError: 列在 pyspark 中不可迭代
PySpark向现有DataFrame添加列 - TypeError:无效参数,不是字符串或列
TypeError:无效参数,不是字符串或列:pyspark UDF
Pyspark Dataframe TypeError:预期的字符串或缓冲区