Eda*_*ame 10 python dataframe apache-spark apache-spark-sql pyspark
我试图过滤基于如下的RDD:
spark_df = sc.createDataFrame(pandas_df)
spark_df.filter(lambda r: str(r['target']).startswith('good'))
spark_df.take(5)
Run Code Online (Sandbox Code Playgroud)
但是得到了以下错误:
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
Run Code Online (Sandbox Code Playgroud)
知道我错过了什么吗?谢谢!
use*_*411 25
DataFrame.filter,这是一个别名DataFrame.where,期望一个SQL表达式表达为Column:
spark_df.filter(col("target").like("good%"))
Run Code Online (Sandbox Code Playgroud)
或等效的SQL字符串:
spark_df.filter("target LIKE 'good%'")
Run Code Online (Sandbox Code Playgroud)
我相信你在这里尝试使用RDD.filter哪种方法完全不同:
spark_df.rdd.filter(lambda r: r['target'].startswith('good'))
Run Code Online (Sandbox Code Playgroud)
并且不会受益于SQL优化.
我已经经历过这个并且已经决定使用 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))
Run Code Online (Sandbox Code Playgroud)
更具可读性的是使用普通函数定义而不是 lambda
| 归档时间: |
|
| 查看次数: |
13562 次 |
| 最近记录: |