Я немного изменю данную проблему, чтобы ее можно было визуализировать, уменьшив максимальное количество строк для каждого отдельного значения до 2 строк (вместо 10 000).
Пример кадра данных:
df = spark.createDataFrame(
[('PONTIAC', 'GRAND AM'), ('BUICK', 'CENTURY'), ('LEXUS', 'IS 300'), ('MERCEDES-BENZ', 'SL-CLASS'), ('PONTIAC', 'GRAND AM'), ('TOYOTA', 'PRIUS'), ('MITSUBISHI', 'MONTERO SPORT'), ('MERCEDES-BENZ', 'SLK-CLASS'), ('TOYOTA', 'CAMRY'), ('JEEP', 'WRANGLER'), ('MERCEDES-BENZ', 'SL-CLASS'), ('PONTIAC', 'GRAND AM'), ('TOYOTA', 'PRIUS'), ('MITSUBISHI', 'MONTERO SPORT'), ('MERCEDES-BENZ', 'SLK-CLASS'), ('TOYOTA', 'CAMRY'), ('JEEP', 'WRANGLER'), ('CHEVROLET', 'SILVERADO 1500'), ('TOYOTA', 'AVALON'), ('FORD', 'RANGER'), ('MERCEDES-BENZ', 'C-CLASS'), ('TOYOTA', 'TUNDRA'), ('TOYOTA', 'PRIUS'), ('MITSUBISHI', 'MONTERO SPORT'), ('MERCEDES-BENZ', 'SLK-CLASS'), ('TOYOTA', 'CAMRY'), ('JEEP', 'WRANGLER'), ('CHEVROLET', 'SILVERADO 1500'), ('TOYOTA', 'AVALON'), ('FORD', 'RANGER'), ('MERCEDES-BENZ', 'C-CLASS'), ('TOYOTA', 'TUNDRA'), ('FORD', 'EXPLORER SPORT TRAC'), ('CHEVROLET', 'COLORADO'), ('MITSUBISHI', 'MONTERO'), ('DODGE', 'GRAND CARAVAN')],
['Make', 'Model']
)
Давайте подсчитаем количество строк:
df.groupby('Model').count().collect()
+-------------------+-----+
| Model|count|
+-------------------+-----+
| AVALON| 2|
| CENTURY| 1|
| TUNDRA| 2|
| WRANGLER| 3|
| GRAND AM| 3|
|EXPLORER SPORT TRAC| 1|
| C-CLASS| 2|
| MONTERO SPORT| 3|
| CAMRY| 3|
| GRAND CARAVAN| 1|
| SILVERADO 1500| 2|
| PRIUS| 3|
| MONTERO| 1|
| COLORADO| 1|
| RANGER| 2|
| SLK-CLASS| 3|
| SL-CLASS| 2|
| IS 300| 1|
+-------------------+-----+
Если я правильно понимаю ваш вопрос, вы можете назначить номер строки каждой строке с разделом на Model
:
from pyspark.sql import Window
from pyspark.sql.functions import row_number, desc
win_1 = Window.partitionBy('Model').orderBy(desc('Make'))
df = df.withColumn('row_num', row_number().over(win_1))
![row_num](https://i.stack.imgur.com/QCLP4.png)
А затем отфильтруйте строки в том месте, где row_num <= 2
:
df = df.filter(df.row_num <= 2).select('Make', 'Model')
Всего должно быть 2 + 1 + 2 + 2 + 2 + 1 + 2 + 2 + 2 + 1 + 2 + 2 + 1 + 1 + 2 + 2 + 2 + 1 = 30 строк
Окончательные результаты:
+-------------+-------------------+
| Make| Model|
+-------------+-------------------+
| TOYOTA| AVALON|
| TOYOTA| AVALON|
| BUICK| CENTURY|
| TOYOTA| TUNDRA|
| TOYOTA| TUNDRA|
| JEEP| WRANGLER|
| JEEP| WRANGLER|
| PONTIAC| GRAND AM|
| PONTIAC| GRAND AM|
| FORD|EXPLORER SPORT TRAC|
|MERCEDES-BENZ| C-CLASS|
|MERCEDES-BENZ| C-CLASS|
| MITSUBISHI| MONTERO SPORT|
| MITSUBISHI| MONTERO SPORT|
| TOYOTA| CAMRY|
| TOYOTA| CAMRY|
| DODGE| GRAND CARAVAN|
| CHEVROLET| SILVERADO 1500|
| CHEVROLET| SILVERADO 1500|
| TOYOTA| PRIUS|
| TOYOTA| PRIUS|
| MITSUBISHI| MONTERO|
| CHEVROLET| COLORADO|
| FORD| RANGER|
| FORD| RANGER|
|MERCEDES-BENZ| SLK-CLASS|
|MERCEDES-BENZ| SLK-CLASS|
|MERCEDES-BENZ| SL-CLASS|
|MERCEDES-BENZ| SL-CLASS|
| LEXUS| IS 300|
+-------------+-------------------+