将列合并到 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'])
我有两个数据帧 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'])