如何过滤pyspark数据帧

2024-05-23 17:03:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经看到了许多与筛选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")

但是我想了解为什么“pipe”/连接语法不正确


Tags: csvtopathreadsqllocationsomefilter
2条回答

您可以使用df["purch_location"]

df = spark.read.csv("/some/path/to/file", sep=',')
df = df.filter(df["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')

相关问题 更多 >