Сортировка по количеству с помощью pyspark - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь напечатать 11 лучших штатов, самый большой город в каждом штате и количество предприятий для каждого штата. По какой-то причине у меня возникают проблемы с печатью подсчета предприятий для штата, получая только счет для города.

Вот код, с которым у меня возникли проблемы

dun=df_busSelected.groupBy("state","city").count().orderBy("count",ascending=False).limit(11).show(truncate=False)

 +-----+----------+-----+ 
|state|city |count| 
+-----+----------+-----+ 
|NV |Las Vegas |29361| 
|ON |Toronto |18904| 
|AZ |Phoenix |18764| 
|NC |Charlotte |9507 | 
|AZ |Scottsdale|8837 | 
|AB |Calgary |7735 | 
|PA |Pittsburgh|7016 | 
|QC |Montréal |6449 | 
|AZ |Mesa |6080 | 
|NV |Henderson |4892 | 
|AZ |Tempe |4550 | 
+-----+----------+-----+

1 Ответ

0 голосов
/ 25 февраля 2020

Если я правильно понимаю, что вам нужно сделать:

from pyspark.sql.functions import *
df_busSelected = spark.createDataFrame([("NV", "Las Vegas",29361),("ON", "Toronto" ,18904),("AZ", "Phoenix",18764),("NC", "Charlotte",9507),("AZ", "Scottsdale",8837),("AB", "Calgary",7735),("PA", "Pittsburgh",7016),("QC", "Montréal",6449),("AZ", "Mesa",6080),("NV", "Henderson",4892),("AZ", "Tempe",4550)]).toDF("state", "city", "count")

df_busSelected.withColumn("city_total_business", struct(col("count"), col("city")))\
     .groupBy("state")\
     .agg(sort_array(collect_set(col("city_total_business")), False)[0].name("top_city"))\
     .withColumn("city", col("top_city").getItem("city"))\
     .withColumn("count", col("top_city").getItem("count"))\
     .drop("top_city")\
     .show()

Распечатывает

+-----+----------+-----+
|state|      city|count|
+-----+----------+-----+
|   AZ|   Phoenix|18764|
|   QC|  Montréal| 6449|
|   NV| Las Vegas|29361|
|   NC| Charlotte| 9507|
|   PA|Pittsburgh| 7016|
|   ON|   Toronto|18904|
|   AB|   Calgary| 7735|
+-----+----------+-----+

Возвращает город с наибольшим количеством для каждого штата. Теперь легко сортировать и делать с ними все, что вы хотите.

Пожалуйста, оцените мой ответ, если вам это нравится.

...