Как ограничить и разделить данные в фрейме данных PySpqrk

#pyspark #apache-spark-sql

Вопрос:

У меня есть следующие данные

  ------------- -------------------- --------- ----- ----------- -------------------- ------------ ------------  |restaurant_id| restaurant_name| city|state|postal_code| stars|review_count|cuisine_name|  ------------- -------------------- --------- ----- ----------- -------------------- ------------ ------------  | 62112| Neptune Oyster| Boston| MA| 02113|4.500000000000000000| 5115| American| | 62112| Neptune Oyster| Boston| MA| 02113|4.500000000000000000| 5115| Thai| | 60154|Giacomo's Ristora...| Boston| MA| 02113|4.000000000000000000| 3520| Italian| | 61455|Atlantic Fish Com...| Boston| MA| 02116|4.000000000000000000| 2575| American| | 57757| Top of the Hub| Boston| MA| 02199|3.500000000000000000| 2273| American| | 58631| Carmelina's| Boston| MA| 02113|4.500000000000000000| 2250| Italian| | 58895| The Beehive| Boston| MA| 02116|3.500000000000000000| 2184| American| | 56517|Lolita Cocina amp; T...| Boston| MA| 02116|4.000000000000000000| 2179| American| | 56517|Lolita Cocina amp; T...| Boston| MA| 02116|4.000000000000000000| 2179| Mexican| | 58440| Toro| Boston| MA| 02118|4.000000000000000000| 2175| Spanish| | 58615| Regina Pizzeria| Boston| MA| 02113|4.000000000000000000| 2071| Italian| | 58723| Gaslight| Boston| MA| 02118|4.000000000000000000| 2056| American| | 58723| Gaslight| Boston| MA| 02118|4.000000000000000000| 2056| French| | 60920| Modern Pastry Shop| Boston| MA| 02113|4.000000000000000000| 2042| Italian| | 59453|Gourmet Dumpling ...| Boston| MA| 02111|3.500000000000000000| 1990| Taiwanese| | 59453|Gourmet Dumpling ...| Boston| MA| 02111|3.500000000000000000| 1990| Chinese| | 59204|Russell House Tavern|Cambridge| MA| 02138|4.000000000000000000| 1965| American| | 60732|Eastern Standard ...| Boston| MA| 02215|4.000000000000000000| 1890| American| | 60732|Eastern Standard ...| Boston| MA| 02215|4.000000000000000000| 1890| French| | 56970| Border Café|Cambridge| MA| 02138|4.000000000000000000| 1880| Mexican|  ------------- -------------------- --------- ----- ----------- -------------------- ------------ ------------   

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

Можно ли это сделать с помощью pyspark.

Комментарии:

1. Вы можете добавить row_number указанную спецификацию окна, а затем применить фильтр к row_number столбцу, чтобы ограничить количество записей в окне. Предполагая, когда вы говорите records per partition , что подразумеваете записи в каждом City,State and Cuisine .

2. @snithish добавьте этот комментарий в качестве anwser (с фрагментом кода)

Ответ №1:

Вы можете добавлять row_number в разделы после открытия окон и фильтровать на основе этого, чтобы ограничить количество записей в окне. Вы можете управлять максимальным количеством строк в окне, используя max_number_of_rows_per_partition переменную в приведенном ниже коде.

Поскольку ваш вопрос не включал в себя то, что вы хотите stars и review_count заказали, я предположил, что они снижаются.

 import pyspark.sql.functions as F from pyspark.sql import Window  window_spec = Window.partitionBy("city", "state", "cuisine_name")  .orderBy(F.col("stars").desc(), F.col("review_count").desc())  max_number_of_rows_per_partition = 3  df.withColumn("row_number", F.row_number().over(window_spec))  .filter(F.col("row_number") lt;= max_number_of_rows_per_partition)  .drop("row_number")  .show(200, False)  

Комментарии:

1. Спасибо. Это сработало как настоящий спасатель.