У меня очень большой фреймворк в pyspark. В нем более 10 миллионов строк и более 30 столбцов.

Каков наилучший и эффективный метод поиска во всем фрейме данных заданного списка значений и удаления строки, содержащей это значение?

The given list of values: 

list=['1097192','10727550','1098754']

The dataframe(df) is :
 +---------+--------------+---------------+---------+------------+
 |   id    |  first_name  |   last_name   | Salary  | Verifycode |
 +---------+--------------+---------------+---------+------------+
 |    1986 | Rollie       | Lewin         | 1097192 |   42254172 | -Remove Row
 |  289743 | Karil        | Sudron        | 2785190 |    3703538 |
 |    3864 | Massimiliano | Dallicott     | 1194553 |   23292573 |
 |   49074 | Gerry        | Grinnov       | 1506584 |   62291161 |
 | 5087654 | Nat          | Leatherborrow | 1781870 |   55183252 |
 |     689 | Thaine       | Tipple        | 2150105 |   40583249 |
 |    7907 | Myrlene      | Croley        | 2883250 |   70380540 |
 |     887 | Nada         | Redier        | 2676139 |   10727550 | -Remove Row
 |   96533 | Sonny        | Bosden        | 1050067 |   13110714 |
 | 1098754 | Dennie       | McGahy        | 1804487 |     927935 | -Remove Row
 +---------+--------------+---------------+---------+------------+

Если бы это был меньший фрейм данных, я мог бы использовать функции collect () или toLocalIterator (), а затем перебирать строки и удалять их на основе значений списка.

Поскольку это очень большой фрейм данных, как лучше всего решить эту проблему?

Я придумал это решение, но есть ли способ лучше:

column_names = df.schema.names
for name in column_names:
    df = df.filter(~col(name).isin(list))
1
navin 11 Янв 2020 в 03:05
Вам нужно сохранить все столбцы в фрейме данных перед выполнением фильтрации? В каком формате хранятся эти данные? Это разделено? Где вы выполняете код (на локальном компьютере, в кластере и т. Д.)?
 – 
Mitodina
11 Янв 2020 в 03:47
Мне нужно сохранить все столбцы, поскольку значение для поиска может находиться в любом столбце фрейма данных. Код выполняется в кластере, и окончательный формат вывода - csv.
 – 
navin
11 Янв 2020 в 04:29

1 ответ

У вас есть правильный подход к фильтрации Dataframe с помощью функций filter и isin. Вы можете использовать функцию isin, если список невелик (в несколько тысяч, а не в миллионы). Также убедитесь, что ваш фрейм данных разделен как минимум на 3 * процессоров исполнителей. Необходимо иметь много разделов, без этого будет страдать параллелизм.

Мне нравится Scala, поэтому возьмите концепцию из приведенного ниже кода. Вам необходимо создать объект Column, объединив все столбцы, по которым будет выполняться фильтрация. Затем укажите этот последний объект столбца на dataframe.filter

column_names = df.schema.names
colFinal // initialize with 1 column name as col("colName").isin(list)
for name in column_names:
    colFinal = colFinal.or(col(name).isin(list))

df = df.filter(!colFinal) // apply negation of final column object
0
Salim 11 Янв 2020 в 04:28