Я пытаюсь использовать spark для создания ограниченного отсортированного списка для фрейма данных, однако я не могу думать о быстром и низком объеме памяти.
Мой фрейм данных состоит из трех столбцов и двух идентификаторов ключей и столбец расстояния, и я хочу получить список лучших n = 50 идентификаторов, близких к каждому из идентификаторов. Я попробовал groupBy, а затем collect_list, затем sort_array, а затем UDF, чтобы получить только идентификаторы и, наконец, передать его через UDF, чтобы получить первые n = 50, но это очень медленно и иногда вызывает ошибку памяти.
# Sample Data
val dataFrameTest = Seq(
("key1", "key2", 1),
("key1","key3", 2),
("key1", "key5" ,4),
("key1", "key6" ,5),
("key1","key8" ,6),
("key2", "key7" ,3),
("key2", "key9" ,4),
("key2","key5" ,5)
).toDF("id1", "id2", "distance")
Если ограничение равно 2, то нужно
"key1" | ["key2", "key3"]
"key2" | ["key7", "key8"]
current_approach:
sorted_df = dataFrameTest.groupBy("key1").agg(collect_list(struct("distance", "id2")).alias("toBeSortedCol")).
withColumn("sortedList", sort_array("toBeSortedCol"))
Мои данные достаточно велики, поэтому единственное решение - искра. Я ценю любую помощь / руководство.