【问题标题】:PySpark: TypeError: condition should be string or ColumnPySpark:TypeError:条件应该是字符串或列
【发布时间】:2017-02-14 06:29:40
【问题描述】:

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

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

【问题讨论】:

  • 这里有一个完美的答案;)

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


【解决方案1】:

DataFrame.filterDataFrame.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)
      

      我认为它可能有效!

      【讨论】:

      • 它肯定会起作用。但是数据框提供的优化将会丢失
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多