Напишите код, который показывает разницу в зарплатах между самым высокооплачиваемым сотрудником и другими сотрудниками по отделам - PullRequest
1 голос
/ 18 июня 2020

(Насколько больше получает самый высокооплачиваемый сотрудник по сравнению с другими товарищами по команде) Отсортируйте результат по отделам и укажите c разницу от максимальной зарплаты. Входные данные:

val inputDf = Seq(
  (1, "Hunter Fields", "IT", 15),
  (2, "Leonard Lewis", "Support", 81),
  (3, "Jason Dawson", "Support", 90),
  (4, "Andre Grant", "Support", 25),
  (5, "Earl Walton", "IT", 40),
  (6, "Alan Hanson", "IT", 24),
  (7, "Clyde Matthews", "Support", 31),
  (8, "Josephine Leonard", "Support", 1),
  (9, "Owen Boone", "HR", 27),
  (10, "Max McBride", "IT", 75)
).toDF("id", "name", "department", "salary")
println("Input:")
inputDf.show(false)

Мое решение было:

 inputDf
import org.apache.spark.sql.expressions.Window
val windowSpec = Window
  .partitionBy($"department")
  .orderBy($"salary")
inputDf
  .withColumn("diff", first(col("salary")).over(windowSpec)-$"salary")
  .withColumn("diff", last(col("salary")).over(windowSpec)-$"salary")

Ввод:

+---+-----------------+----------+------+
|id |name             |department|salary|
+---+-----------------+----------+------+
|1  |Hunter Fields    |IT        |15    |
|2  |Leonard Lewis    |Support   |81    |
|3  |Jason Dawson     |Support   |90    |
|4  |Andre Grant      |Support   |25    |
|5  |Earl Walton      |IT        |40    |
|6  |Alan Hanson      |IT        |24    |
|7  |Clyde Matthews   |Support   |31    |
|8  |Josephine Leonard|Support   |1     |
|9  |Owen Boone       |HR        |27    |
|10 |Max McBride      |IT        |75    |
+---+-----------------+----------+------+

Ожидаемый:

+---+-----------------+----------+------+----+
|id |name             |department|salary|diff|
+---+-----------------+----------+------+----+
|9  |Owen Boone       |HR        |27    |0   |
|1  |Hunter Fields    |IT        |15    |60  |
|6  |Alan Hanson      |IT        |24    |51  |
|5  |Earl Walton      |IT        |40    |35  |
|10 |Max McBride      |IT        |75    |0   |
|8  |Josephine Leonard|Support   |1     |89  |
|4  |Andre Grant      |Support   |25    |65  |
|7  |Clyde Matthews   |Support   |31    |59  |
|2  |Leonard Lewis    |Support   |81    |9   |
|3  |Jason Dawson     |Support   |90    |0   |
+---+-----------------+----------+------+----+

Но в момент мой Фактический результат неверен, потому что столбец diff равен 0

1 Ответ

1 голос
/ 18 июня 2020

Вы должны изменить порядок окон на по убыванию :

val windowSpec = Window.partitionBy($"department").orderBy($"salary".desc)

, а затем:

scala> inputDf.withColumn("diff", first(col("salary")).over(windowSpec)-$"salary").show()
+---+-----------------+----------+------+----+
| id|             name|department|salary|diff|
+---+-----------------+----------+------+----+
|  9|       Owen Boone|        HR|    27|   0|
| 10|      Max McBride|        IT|    75|   0|
|  5|      Earl Walton|        IT|    40|  35|
|  6|      Alan Hanson|        IT|    24|  51|
|  1|    Hunter Fields|        IT|    15|  60|
|  3|     Jason Dawson|   Support|    90|   0|
|  2|    Leonard Lewis|   Support|    81|   9|
|  7|   Clyde Matthews|   Support|    31|  59|
|  4|      Andre Grant|   Support|    25|  65|
|  8|Josephine Leonard|   Support|     1|  89|
+---+-----------------+----------+------+----+
...