将列合并到 pyspark 数据框而不影响行

merge column to the pyspark dataframe without impacting the rows

我有两个数据帧 df1 和 df2,如下所示

df1:

+----------+------+
|CustomerNo|Amount|
+----------+------+
|   10024.0| 194.0|
|   10024.0| 194.0|
|  100342.0| 66.15|
|   10058.0| 199.0|
|   10080.0| 206.6|
|   10080.0| 206.6|
|   10080.0| 206.6|
|   10080.0| 206.6|
|   10080.0|   0.0|
|   10080.0|156.75|

df2:

+----------+---+
|CustomerNo|Qty|
+----------+---+
|   10024.0|  1|
|   10024.0|  1|
|  100342.0|  1|
|   10058.0|  1|
|   10080.0|  2|
|   10080.0|  3|
|   10080.0|  4|
|   10080.0|  5|
|   10080.0|  6|
|   10080.0|  7|

我想加入这两个数据框,这样新的数据框应该只有相同行的 CustomerNo、Qty 和 Amount

df = df1.join(df2, df1.CustomerNo==df2.CustomerNo,'inner')

当我使用上面的代码时,行数在增加。我希望最终输出采用这种格式,只应附加列。

    |CustomerNo|Amount|Qty
    +----------+------+------+
    |   10024.0| 194.0|1
    |   10024.0| 194.0|1
    |  100342.0| 66.15|1
    |   10058.0| 199.0|1
    |   10080.0| 206.6|2
    |   10080.0| 206.6|3
    |   10080.0| 206.6|4
    |   10080.0| 206.6|5
    |   10080.0|   0.0|6
    |   10080.0|156.75|7

你可以这样做,但是..你应该小心。我将向您展示如何使用 window,但它们的性能很差,因此只有在您必须不作为首选时才使用 windows。这应该可行,但我猜数量和数量是相关的。

from pyspark.sql.window import Window
from pyspark.sql.functions import row_number

windowSpecQty  = Window.partitionBy("CustomerNo").orderBy("Qty")
windowSpecAmount  = Window.partitionBy("CustomerNo").orderBy("Amount")

rdf1 = df1.withColumn("row_number",row_number().over(windowSpecAmount)) //grouped by CustomerNo given a rownumber

rdf2 = df2.withColumn("row_number",row_number().over(windowSpecQty)) //grouped by CustomerNo given a rownumber

cond = [rdf1.CustomerNo==rdf2.CustomerNo, rdf1.row_number==rdf2.row_number]
df = rdf1.join(rdf2, cond,'inner').select( rdf1['CustomerNo'], rdf1['Amount'], rdf2['Qty'])