首页 > 解决方案 > Apache Spark SQL:如何使用 GroupBy 和 Max 过滤数据

问题描述

我有一个具有以下结构的给定数据集:

https://i.imgur.com/Kk7I1S1.png

我需要使用 SparkSQL 解决以下问题:Dataframes

对于每个邮政编码,找到以前发生事故最多的客户。在平局的情况下,这意味着多个客户的事故数量相同,只需退回其中任何一个即可。对于这些选定的客户中的每一个,输出以下列:邮政编码、客户 ID、先前事故的数量。

标签: apache-spark-sql

解决方案


我认为您错过了提供您在图片链接中提到的数据。通过将您的问题作为参考,我创建了自己的数据集。您可以使用下面的代码片段仅供参考,也可以df用您的数据集替换数据框以添加所需的列,例如 id 等。

      scala> val df  = spark.read.format("csv").option("header","true").load("/user/nikhil/acc.csv")
        df: org.apache.spark.sql.DataFrame = [postcode: string, customer: string ... 1 more field]

        scala> df.show()
        +--------+--------+---------+
        |postcode|customer|accidents|
        +--------+--------+---------+
        |       1|  Nikhil|        5|
        |       2|     Ram|        4|
        |       1|   Shyam|        3|
        |       3|  pranav|        1|
        |       1|   Suman|        2|
        |       3|    alex|        2|
        |       2|     Raj|        5|
        |       4|   arpit|        3|
        |       1|   darsh|        2|
        |       1|   rahul|        3|
        |       2|   kiran|        4|
        |       3|    baba|        4|
        |       4|    alok|        3|
        |       1|   Nakul|        5|
        +--------+--------+---------+


        scala> df.createOrReplaceTempView("tmptable")

   scala> spark.sql(s"""SELECT postcode,customer, accidents FROM (SELECT postcode,customer, accidents, row_number() over (PARTITION BY postcode ORDER BY accidents desc) as rn  from tmptable) WHERE rn = 1""").show(false)
+--------+--------+---------+                                                   
|postcode|customer|accidents|
+--------+--------+---------+
|3       |baba    |4        |
|1       |Nikhil  |5        |
|4       |arpit   |3        |
|2       |Raj     |5        |
+--------+--------+---------+

推荐阅读