PySpark。TypeError: condition应该是字符串或柱子

18 人关注

我正在尝试过滤一个基于以下内容的RDD。

spark_df = sc.createDataFrame(pandas_df)
spark_df.filter(lambda r: str(r['target']).startswith('good'))
spark_df.take(5)

But got the following errors:

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)
TypeError: condition should be string or Column

知道我错过了什么吗?谢谢你!"。

1 个评论
这里下面有一个完美的答案;)
python
apache-spark
dataframe
pyspark
apache-spark-sql
Edamame
Edamame
发布于 2016-10-06
3 个回答
zero323
zero323
发布于 2019-01-10
已采纳
0 人赞同

DataFrame.filter DataFrame.where 的别名,它期望一个SQL表达式被表达为 Column

spark_df.filter(col("target").like("good%"))

或相当的SQL字符串。

spark_df.filter("target LIKE 'good%'")

I believe you're trying here to use RDD.filter which is completely different method:

spark_df.rdd.filter(lambda r: r['target'].startswith('good'))

并且不受益于SQL优化。

architectonic
architectonic
发布于 2019-01-10
0 人赞同

我已经经历过这个问题,并且已经解决了使用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

Ashok v
Ashok v
发布于 2019-01-10
0 人赞同

将数据框架转换为rdd。

spark_df = sc.createDataFrame(pandas_df)