将来自不同数据帧的两列乘以spark

时间:2018-03-25 01:11:28

标签: scala dataframe spark-dataframe

我有两个表示以下csv数据的数据帧:

Store   Date    Weekly_Sales
1   05/02/2010  249
2   12/02/2010  455
3   19/02/2010  415
4   26/02/2010  194

Store   Date    Weekly_Sales
5   05/02/2010  400
6   12/02/2010  460
7   19/02/2010  477
8   26/02/2010  345

我尝试做的是每个日期,在两个数据框中读取相关的每周销售额,并找到两个数字的平均值。我不知道如何做到这一点。

2 个答案:

答案 0 :(得分:3)

假设您希望在结果数据集中包含单独的商店数据,一种方法是将两个数据框合并,并使用Window函数计算平均每周销售额(以及相应的商店列表,如果需要),如下:

val df1 = Seq(
  (1, "05/02/2010", 249),
  (2, "12/02/2010", 455),
  (3, "19/02/2010", 415),
  (4, "26/02/2010", 194)
).toDF("Store", "Date", "Weekly_Sales")

val df2 = Seq(
  (5, "05/02/2010", 400),
  (6, "12/02/2010", 460),
  (7, "19/02/2010", 477),
  (8, "26/02/2010", 345)
).toDF("Store", "Date", "Weekly_Sales")

import org.apache.spark.sql.expressions.Window

val window = Window.partitionBy($"Date")

df1.union(df2).
  withColumn("Avg_Sales", avg($"Weekly_Sales").over(window)).
  withColumn("Store_List", collect_list($"Store").over(window)).
  orderBy($"Date", $"Store").
  show

// +-----+----------+------------+---------+----------+
// |Store|      Date|Weekly_Sales|Avg_Sales|Store_List|
// +-----+----------+------------+---------+----------+
// |    1|05/02/2010|         249|    324.5|    [1, 5]|
// |    5|05/02/2010|         400|    324.5|    [1, 5]|
// |    2|12/02/2010|         455|    457.5|    [2, 6]|
// |    6|12/02/2010|         460|    457.5|    [2, 6]|
// |    3|19/02/2010|         415|    446.0|    [3, 7]|
// |    7|19/02/2010|         477|    446.0|    [3, 7]|
// |    4|26/02/2010|         194|    269.5|    [4, 8]|
// |    8|26/02/2010|         345|    269.5|    [4, 8]|
// +-----+----------+------------+---------+----------+

答案 1 :(得分:1)

您应该首先使用union函数合并它们。然后在日期列上分组找到平均值(使用avg 内置函数

import org.apache.spark.sql.functions._
df1.union(df2)
  .groupBy("Date")
  .agg(collect_list("Store").as("Stores"), avg("Weekly_Sales").as("average_weekly_sales"))
  .show(false)

应该给你

+----------+------+--------------------+
|Date      |Stores|average_weekly_sales|
+----------+------+--------------------+
|26/02/2010|[4, 8]|269.5               |
|12/02/2010|[2, 6]|457.5               |
|19/02/2010|[3, 7]|446.0               |
|05/02/2010|[1, 5]|324.5               |
+----------+------+--------------------+

我希望答案很有帮助