Поиск PySpark внутри очень большого информационного кадра - PullRequest
0 голосов
/ 11 января 2020

У меня очень большой фрейм данных в 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 Ответ

0 голосов
/ 11 января 2020

Вы получили правильный подход к фильтрации 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...