У меня довольно сложный процесс создания фрейма данных pyspark, преобразования его в фрейм данных pandas и вывода результата в плоский файл. Я не уверен, когда произойдет ошибка, поэтому я опишу весь процесс.
Начиная у меня есть фрейм данных pyspark, который содержит попарное сходство для наборов идентификаторов. Это выглядит так:
+------+-------+-------------------+
| ID_A| ID_B| EuclideanDistance|
+------+-------+-------------------+
| 1| 1| 0.0|
| 1| 2|0.13103884200454394|
| 1| 3| 0.2176246463836219|
| 1| 4| 0.280568636550471|
...
Я бы хотел сгруппировать его по ID_A, отсортировать каждую группу по EuclideanDistance и взять только верхние N пар для каждой группы. Итак, сначала я делаю это:
from pyspark.sql.window import Window
from pyspark.sql.functions import rank, col, row_number
window = Window.partitionBy(df['ID_A']).orderBy(df_sim['EuclideanDistance'])
result = (df.withColumn('row_num', row_number().over(window)))
Я уверен, что ID_A = 1 все еще находится в кадре данных "result". Затем я делаю это, чтобы ограничить каждую группу всего 20 строками:
result1 = result.where(result.row_num<20)
result1.toPandas().to_csv("mytest.csv")
и ID_A = 1 НЕ в результирующем файле .csv (хотя он все еще присутствует в result1). Есть ли где-то проблема в этой цепочке конверсий, которая может привести к потере данных?