4

列でなければなりません:pyspark:例外TypeError:条件は文字列または私は以下のようにベース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 

私は逃したものを任意のアイデア?ありがとうございました!

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

または同等のSQL文字列:

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

私はあなたがここにしようとしていると信じていDataFrame.whereの別名である

+0

ここで、右下の完璧な答えがあります。 ) – javadba

答えて

14

DataFrame.filterは、SQL式はどちらかColumnように表現を期待します全く異なる方法である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)) 

より読みラムダのではなく、通常の関数定義を使用することです

関連する問題