4

我試圖篩選基於類似下面的RDD:pyspark:類型錯誤:條件應該是字符串或列

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 

任何想法,我錯過了什麼?謝謝!

+0

有一個完美的答案正下方位置; ) – javadba

回答

14

DataFrame.filter,這是DataFrame.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

我經歷過這一點,紛紛落戶到使用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)) 

更可讀的是使用普通函數定義而不是拉姆達的

相關問題