Вы можете использовать size
, чтобы определить длину столбца массива, и использовать window
, как показано ниже:
Импорт и создание образца DataFrame
import pyspark.sql.functions as f
from pyspark.sql.window import Window
df = spark.createDataFrame([('Joe','Smith',[2,3]),
('Joe','Smith',[2,3,5,6]),
('Jim','Bush',[9,7]),
('Jim','Bush',[21]),
('Sarah','Wood',[2,3])], ('first_name','last_name','requests_ID'))
Определение окна для получения строкиномер столбца requests_ID
в зависимости от длины столбца в порядке убывания.
Здесь f.size("requests_ID")
даст длину столбца requests_ID
, а desc()
отсортирует ее в порядке убывания.
w_spec = Window().partitionBy("first_name", "last_name").orderBy(f.size("requests_ID").desc())
Примените оконную функцию и получите первую строку.
df.withColumn("rn", f.row_number().over(w_spec)).where("rn ==1").drop("rn").show()
+----------+---------+------------+
|first_name|last_name| requests_ID|
+----------+---------+------------+
| Jim| Bush| [9, 7]|
| Sarah| Wood| [2, 3]|
| Joe| Smith|[2, 3, 5, 6]|
+----------+---------+------------+