Второе по величине значение по департаментам с использованием Apache Spark DataFrame - PullRequest
0 голосов
/ 21 октября 2019

У меня есть таблица, в которой department и value теперь доступны, если мы будем использовать SQL-запрос для получения результата второго по величине значения для каждого отдела, тогда мы напишем:

select * from (SELECT department, asset_value, DENSE_RANK() over (partition by DEPARTMENT order by ASSET_VALUE) as x from [User1].[dbo].[UsersRecord]) y where x = 2;

Нов Apache Spark, если у нас есть ограничение на то, чтобы не использовать SparkSQL, и мы должны добиться вывода с использованием DataFrame только тогда, как мы должны писать код Scala?

Я пытался со своей стороны, воспользовавшись помощьюдокументации, но не смог понять.

Мой код:

package com.tg.testpack1

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions.row_number
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql._
import org.apache.spark.sql.functions._

object class2
{
 def main(args: Array[String]) 
 {
    val sparksessionobject = SparkSession.builder()
      .master("local")
      .config("spark.sql.warehouse.dir", "C:/Users/ox/spark/spark/spark-warehouse")
      .getOrCreate()
    sparksessionobject.conf.set("spark.sql.shuffle.partitions", 4)
    sparksessionobject.conf.set("spark.executor.memory", "2g")
    import sparksessionobject.sqlContext.implicits._

val df = Seq(("DEPT1", 1000), ("DEPT1", 500), ("DEPT1", 700), ("DEPT2", 400), ("DEPT2", 200),  ("DEPT3", 500), ("DEPT3", 200))
         .toDF("department", "assetValue")

df.withColumn("col3", dense_rank().over(Window.partitionBy($"department").orderBy($"assetValue".desc))).show
}
}

Я получаю вывод:

+-------------+----------+----+
|accountNumber|assetValue|col3|
+-------------+----------+----+
|        DEPT3|       500|   1|
|        DEPT3|       200|   2|
|        DEPT1|      1000|   1|
|        DEPT1|       700|   2|
|        DEPT1|       500|   3|
|        DEPT2|       400|   1|
|        DEPT2|       200|   2|
+-------------+----------+----+

Я ожидаю вывод:

+-------------+----------+----+
|accountNumber|assetValue|col3|
+-------------+----------+----+
|        DEPT1|       700|   2|
|        DEPT2|       200|   2|
|        DEPT3|       200|   2|
+-------------+----------+----+

1 Ответ

2 голосов
/ 21 октября 2019

Измените ваш код, как показано ниже:

val byDeptOrderByAssetDesc = Window
  .partitionBy($"department")
  .orderBy($"assetValue" desc)
df.withColumn("col3", dense_rank() over byDeptOrderByAssetDesc)
  .filter("col3=2")
...