PySpark:TypeError:condition应该是string或Column

时间:2016-10-05 17:27:11

标签: python apache-spark dataframe pyspark apache-spark-sql

我正在尝试过滤基于以下内容的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

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

3 个答案:

答案 0 :(得分:22)

DataFrame.filterDataFrame.where的别名,期望SQL表达式表示为Column

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优化中受益。

答案 1 :(得分:4)

我已经完成了这个并且已经决定使用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

答案 2 :(得分:-1)

将数据帧转换为rdd。

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

我认为这可能有效!