PySpark窗口上方:是否有更好的方法来查找两列分区的行号

时间:2019-08-07 04:49:47

标签: apache-spark pyspark apache-spark-sql pyspark-sql

我有一个包含3列(T,S和A)的数据集。我需要过滤记录,使T和S列一对一匹配。

例如,如果T1与S1匹配,则应过滤具有S1值的T2行。

我可以使用2次窗口切换来实现它,但是在第二个窗口功能(我可以使用df.sort / repartition来控制的第一个窗口切换)期间,它将在集群中进行很多重排。

l = [('T1', 'S1', 10), ('T2', 'S1', 10), ('T1', 'S2', 10), ('T2', 'S2', 10)]
df = spark.createDataFrame(l).toDF('T','S','A')
df.show()
+---+---+---+
|  T|  S|  A|
+---+---+---+
| T1| S1| 10|
| T2| S1| 10|
| T1| S2| 10|
| T2| S2| 10|
+---+---+---+

w1 = w.partitionBy('T').orderBy('A') 
w2 = w.partitionBy('S').orderBy('A','T') 
df.withColumn('r1', f.row_number().over(w1)).withColumn('r2',f.row_number().over(w2)).show()

它给出了以下结果,因此我可以过滤r1 == r2的记录并获得预期的输出。

+---+---+---+---+---+                                                           
|  T|  S|  A| r1| r2|
+---+---+---+---+---+
| T1| S2| 10|  2|  1|
| T2| S2| 10|  2|  2|
| T1| S1| 10|  1|  1|
| T2| S1| 10|  1|  2|
+---+---+---+---+---+

预期结果

+---+---+---+---+---+                                                           
|  T|  S|  A| r1| r2|
+---+---+---+---+---+
| T2| S2| 10|  2|  2|
| T1| S1| 10|  1|  1|
+---+---+---+---+---+

0 个答案:

没有答案