[英]Scala Spark dataframe join result not in preferred order
我有一個名為stores_df的數據框,其中包含商店信息,例如日期和銷售。 我還有一個稱為avg_sales_store_by_month的數據框,其中包含每個商店每個月的平均銷售額。 我希望從中獲取平均銷售列,以將其附加到stores_df。 我遇到的問題是加入后,stores_df的順序已更改
以下是stores_df的前幾行。
+-----+----------+---------+----+------------+-----------+----------+-----------+------------+-----+----+---+
|Store| Date|IsHoliday|Dept|Weekly_Sales|Temperature|Fuel_Price| CPI|Unemployment|Month|Year|Day|
+-----+----------+---------+----+------------+-----------+----------+-----------+------------+-----+----+---+
| 1|2010-02-05| FALSE| 1| 24924| 42.31| 2.572|211.0963582| 8.106| 2|2010| 5|
| 1|2010-02-12| TRUE| 1| 46039| 38.51| 2.548|211.2421698| 8.106| 2|2010| 12|
| 1|2010-02-19| FALSE| 1| 41595| 39.93| 2.514|211.2891429| 8.106| 2|2010| 19|
| 1|2010-05-14| FALSE| 1| 18926| 74.78| 2.854|210.3374261| 7.808| 5|2010| 14|
+-----+----------+---------+----+------------+-----------+----------+-----------+------------+-----+----+---+
以下是avg_sales_store_by_month的前幾行,我希望獲取最后一列並將其附加到stores_df的末尾。
+-----+-----+------------------+
|Store|Month|avg_sales_by_month|
+-----+-----+------------------+
| 39| 11| 23317.75|
| 43| 7| 13090.84|
| 10| 2| 28407.05|
| 23| 6| 21265.7|
| 4| 10| 28723.2|
| 9| 10| 8468.2|
+-----+-----+------------------+
我的問題是使用聯接時:
stores_df = stores_df.join( avg_sales_store_by_month, Seq("Store", "Month"), "left" )
stores_df的行被重新排序,我希望它的順序與連接之前的順序相同,但要有額外的列。 我該如何實現?
加入片段后,訂單混亂了。
+-----+-----+----------+---------+----+------------+-----------+----------+-----------+------------+----+---+------------------+
|Store|Month| Date|IsHoliday|Dept|Weekly_Sales|Temperature|Fuel_Price| CPI|Unemployment|Year|Day|avg_sales_by_month|
+-----+-----+----------+---------+----+------------+-----------+----------+-----------+------------+----+---+------------------+
| 39| 11|2010-11-05| FALSE| 1| 31729| 61.62| 2.689|210.7202444| 8.476|2010| 5| 23317.75|
| 39| 11|2010-11-12| FALSE| 1| 12324| 62.21| 2.728|210.7667944| 8.476|2010| 12| 23317.75|
| 39| 11|2010-11-19| FALSE| 1| 15137| 55.5| 2.771| 210.65429| 8.476|2010| 19| 23317.75|
| 39| 11|2011-11-11| FALSE| 2| 65758| 63.11| 3.297|216.7217373| 7.716|2011| 11| 23317.75|
| 39| 11|2011-11-18| FALSE| 2| 70050| 66.09| 3.308|216.9395861| 7.716|2011| 18| 23317.75|
+-----+-----+----------+---------+----+------------+-----------+----------+-----------+------------+----+---+------------------+
如果要保留原始列順序,則可以將第一個數據框的列以及其他列保存在Array中,並在連接后選擇它們,如以下示例所示:
val df1 = Seq(
(1, 25000, 3, 2010, 20),
(1, 30000, 3, 2010, 27),
(1, 20000, 4, 2010, 3),
(2, 40000, 3, 2010, 20),
(2, 35000, 3, 2010, 27),
(2, 35000, 4, 2010, 3)
).toDF("Store", "Wk_Sales", "Month", "year", "Day")
val df2 = Seq(
(1, 3, 100000),
(1, 4, 90000),
(2, 3, 140000),
(2, 4, 110000)
).toDF("Store", "Month", "Mo_Sales")
val joinedDF = df1.join(df2, Seq("Store", "Month"), "left")
// +-----+-----+--------+----+---+--------+
// |Store|Month|Wk_Sales|year|Day|Mo_Sales|
// +-----+-----+--------+----+---+--------+
// | 1| 3| 25000|2010| 20| 100000|
// | 1| 3| 30000|2010| 27| 100000|
// | 1| 4| 20000|2010| 3| 90000|
// | 2| 3| 40000|2010| 20| 140000|
// | 2| 3| 35000|2010| 27| 140000|
// | 2| 4| 35000|2010| 3| 110000|
// +-----+-----+--------+----+---+--------+
val cols = df1.columns :+ "Mo_Sales"
joinedDF.select(cols.head, cols.tail: _*).
show
// +-----+--------+-----+----+---+--------+
// |Store|Wk_Sales|Month|year|Day|Mo_Sales|
// +-----+--------+-----+----+---+--------+
// | 1| 25000| 3|2010| 20| 100000|
// | 1| 30000| 3|2010| 27| 100000|
// | 1| 20000| 4|2010| 3| 90000|
// | 2| 40000| 3|2010| 20| 140000|
// | 2| 35000| 3|2010| 27| 140000|
// | 2| 35000| 4|2010| 3| 110000|
// +-----+--------+-----+----+---+--------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.