簡體   English   中英

Scala Spark數據框聯接結果未按首選順序排列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM