如何过滤pyspark数据帧

赛勒斯·穆罕默德(Cyrus Mohammadian)

我已经看到许多与过滤pyspark数据帧有关的问题,但是尽管我已尽了最大努力,但我仍无法使任何非SQL解决方案都能正常工作。

+----------+-------------+-------+--------------------+--------------+---+
|purch_date|  purch_class|tot_amt|       serv-provider|purch_location| id|
+----------+-------------+-------+--------------------+--------------+---+
|03/11/2017|Uncategorized| -17.53|             HOVER  |              |  0|
|02/11/2017|    Groceries| -70.05|1774 MAC'S CONVEN...|     BRAMPTON |  1|
|31/10/2017|Gasoline/Fuel|    -20|              ESSO  |              |  2|
|31/10/2017|       Travel|     -9|TORONTO PARKING A...|      TORONTO |  3|
|30/10/2017|    Groceries|  -1.84|         LONGO'S # 2|              |  4|

这不起作用:

df1 = spark.read.csv("/some/path/to/file", sep=',')\
            .filter((col('purch_location')=='BRAMPTON')

而且这没有用

df1 = spark.read.csv("/some/path/to/file", sep=',')\
            .filter(purch_location == 'BRAMPTON')

这个(SQL表达式)有效,但需要很长时间,我想有一种更快的非SQL方法

df1 = spark.read.csv("/some/path/to/file", sep=',')\
            .filter(purch_location == 'BRAMPTON')

更新我应该提到我能够使用类似的方法(其运行速度比SQL表达式快):

df1 = spark.read.csv("/some/path/to/file", sep=',')
df2 = df1.filter(df1.purch_location == "BRAMPTON")

但是要了解为什么“管道”/连接语法不正确。

麦克

如果您坚持使用反斜杠,则可以执行以下操作:

from pyspark.sql.functions import col

df = spark.read.csv('/some/path/to/file', sep=',') \
     .filter(col('purch_location') == 'BRAMPTON')

您的第一次尝试失败,因为方括号不平衡。

此外,在字符串之后似乎还有一些空格BRAMPTON,因此您可能trim要先进入该列:

from pyspark.sql.functions import col, trim

df = spark.read.csv('/some/path/to/file', sep=',') \
     .filter(trim(col('purch_location')) == 'BRAMPTON')

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章