PySpark按数据框列过滤

时间:2018-10-02 12:05:44

标签: join filter pyspark

我最近刚开始使用PySpark,所以我是一个完整的初学者。我想做的是从一个数据框基于另一个数据框进行过滤。 简单来说,我有df1的A,B,C列和df2的A列。我只想输出df2值以内的A列值的df1行。

目前,我将其设置如下:

df_final = df1.join(df2, df2.A == df1.A)

我在网上找到的也是以下解决方案:

df_final = df1.join(df2, Seq("A"), "left_anti")

似乎它做同样的事情,但是我想知道哪个更正确/更好地执行?

与此同时,我还发现可以使用.filter,但我不知道如何使用它的数据框/列表。

实际上,主要问题是-执行此任务以尽快运行作业的最佳方法是什么?

感谢您和最诚挚的问候

1 个答案:

答案 0 :(得分:2)

在注释上,Seq内的Python不可用。

df_final = df1.join(df2, Seq("A"), "left_anti")

假设df1具有以下内容

+---+----+-----+
|  A|   B|    C|
+---+----+-----+
|  1|John|Smith|
|  2|Praz| June|
|  3|hell|valu3|
|  4|test|valu2|
+---+----+-----+

df2

+---+
|  A|
+---+
|  1|
|  2|
|  3|
|  4|
+---+

执行此操作

df_final = df1.join(df2, df2.A == df1.A)

现在它将警告!给您:

  

简单地构造真等于谓词“ A#154L = A#154L”。也许您需要使用别名。

这意味着您要尝试加入两个DataFrame相同的column

你说,

  

我只想输出在df2值内具有A列值的df1行。

您可以使用df1从A列中选择.select()行,即

df1_A = df1.select('A')

然后,您可以join()使用

from pyspark.sql.functions import col  
df_final = df1_A.alias('le').join(df2.alias('ri'), (col('le.A') == col('ri.A'))) 
  • col :根据给定的列名返回一列。

关于过滤器,您可以在需要基于某些条件进行评估时使用过滤器。有关更多信息,请参阅: class DataFrame