如何在spark中两行两行地匹配?

dw1jzc5e  于 2021-07-13  发布在  Spark
关注(0)|答案(1)|浏览(313)

我有一个非常简单的Dataframe:

+--+------+
|Id|Amount|
+--+------+
|0 |3.47  |
|1 |-3.47 |
|2 |3.47  |
|3 |3.47  |
|4 |2.01  |
|5 |-2.01 |
|6 |-2.01 |
|7 |7.65  |
|8 |7.65  |
+--+------+

我想匹配第0行和第1行,第4行和第5行,以及第2行和第3行。有几种解决方案,返回第0行和第2行也可以。
一般的想法是,他们应该2对2和剩菜返回。如果每一行都有一个匹配项,它应该不返回任何内容,并且应该返回所有不能以这种方式配对的行。
你知道怎么做吗?
预期结果:

+--+------+
|Id|Amount|
+--+------+
|0 |3.47  |
|2 |3.47  |
|6 |-2.01 |
|7 |7.65  |
|8 |7.65  |
+--+------+
wnvonmuf

wnvonmuf1#

你可以试试这个:

import pyspark.sql.functions as F
from pyspark.sql import Window

result = df.withColumn(
    'cnt', 
    F.count('*').over(Window.partitionBy('Amount'))
).withColumn(
    'min_cnt',
    F.min('cnt').over(Window.partitionBy(F.abs('Amount')))
).withColumn(
    'max_cnt',
    F.max('cnt').over(Window.partitionBy(F.abs('Amount')))
).withColumn(
    'rn', 
    F.row_number().over(Window.partitionBy('Amount').orderBy('Id'))
).filter(
    'rn > min_cnt or max_cnt = min_cnt'
).select('Id', 'Amount')

result.show()
+---+------+
| Id|Amount|
+---+------+
|  6| -2.01|
|  7|  7.65|
|  8|  7.65|
|  2|  3.47|
|  3|  3.47|
+---+------+

相关问题