我想根据以下条件过滤数据帧:首先(d<5),然后(如果col1中的值等于col3中的值,则col2的值不等于col4中的对应值).

如果原始数据帧DF如下所示:

+----+----+----+----+---+
|col1|col2|col3|col4|  d|
+----+----+----+----+---+
|   A|  xx|   D|  vv|  4|
|   C| xxx|   D|  vv| 10|
|   A|   x|   A|  xx|  3|
|   E| xxx|   B|  vv|  3|
|   E| xxx|   F| vvv|  6|
|   F|xxxx|   F| vvv|  4|
|   G| xxx|   G| xxx|  4|
|   G| xxx|   G|  xx|  4|
|   G| xxx|   G| xxx| 12|
|   B|xxxx|   B|  xx| 13|
+----+----+----+----+---+

所需的数据帧是:

+----+----+----+----+---+
|col1|col2|col3|col4|  d|
+----+----+----+----+---+
|   A|  xx|   D|  vv|  4|
|   A|   x|   A|  xx|  3|
|   E| xxx|   B|  vv|  3|
|   F|xxxx|   F| vvv|  4|
|   G| xxx|   G|  xx|  4|
+----+----+----+----+---+

我try 过的代码没有按预期工作:

cols=[('A','xx','D','vv',4),('C','xxx','D','vv',10),('A','x','A','xx',3),('E','xxx','B','vv',3),('E','xxx','F','vvv',6),('F','xxxx','F','vvv',4),('G','xxx','G','xxx',4),('G','xxx','G','xx',4),('G','xxx','G','xxx',12),('B','xxxx','B','xx',13)]
df=spark.createDataFrame(cols,['col1','col2','col3','col4','d'])

df.filter((df.d<5)& (df.col2!=df.col4) & (df.col1==df.col3)).show()

+----+----+----+----+---+
|col1|col2|col3|col4|  d|
+----+----+----+----+---+
|   A|   x|   A|  xx|  3|
|   F|xxxx|   F| vvv|  4|
|   G| xxx|   G|  xx|  4|
+----+----+----+----+---+

我应该怎么做才能达到预期的结果?

推荐答案

你的逻辑条件是错误的.IIUC,你想要的是:

import pyspark.sql.functions as f

df.filter((f.col('d')<5))\
    .filter(
        ((f.col('col1') != f.col('col3')) | 
         (f.col('col2') != f.col('col4')) & (f.col('col1') == f.col('col3')))
    )\
    .show()

为了可读性,我把filter()个步骤分成了两个部分,但你可以在一行中完成.

输出:

+----+----+----+----+---+
|col1|col2|col3|col4|  d|
+----+----+----+----+---+
|   A|  xx|   D|  vv|  4|
|   A|   x|   A|  xx|  3|
|   E| xxx|   B|  vv|  3|
|   F|xxxx|   F| vvv|  4|
|   G| xxx|   G|  xx|  4|
+----+----+----+----+---+

Sql相关问答推荐

Select 最大值,但当并列时,从其他列 Select 最大值

我如何计算字母a出现的字符串的次数?

计算分段的总权重

为什么两个不同的窗口函数给出不同的排序结果?

在SQL中返回缺省值,即使查询不返回任何结果

如何计算一个用户S的日常连胜?

在SQL Server中设置关联对象的有效JSON格式

SQL按日期分组字段和如果日期匹配则求和

按两列分组,并根据SQL中的条件返回第三个列值

同一表的Oracle SQL更新(含YTD合计)

为什么左联接结果在MS Access数据库中不匹配

Postgresql - WHERE 中的 MAX 标准 - 初学者问题

计算不同模式的时间跨度

获取上个月和上一年的值

BigQuery导航函数计算ID

Postgres:表的累积视图

如何通过存储过程将 root 的下一个子 node 作为父 node ?

交叉应用 OPENJSON / PIVOT - 错误的顺序

有条件求和

SQL 按百分比递减总和