Лучший способ фильтрации определенной строки в фрейме данных pyspark - PullRequest
0 голосов
/ 20 марта 2019

У меня есть простой вопрос, но я не могу понять.Я пытаюсь отфильтровать определенную строку на основе столбца id (первичный ключ), потому что я хочу провести его выборочную проверку по тому же id в другой таблице, в которой было применено преобразование.

Подробнее ... У меня есть такой фрейм данных:

|  id  | name  | age  |
| 1112 | Bob   | 54   |
| 1123 | Sue   | 23   |
| 1234 | Jim   | 37   |
| 1251 | Mel   | 58   | 
...

, за исключением того, что в нем ~ 3000MM строк и ~ 2k столбцов.Очевидный ответ - что-то вроде df.filter('id = 1234').show().Проблема в том, что у меня ~ 300MM строк, и этот запрос занимает навсегда (как за 10-20 минут в кластере AWS EMR ~ 20 узлов).

Я понимаю, что это нужно сделатьсканирование таблицы, но я не понимаю, почему что-то вроде df.filter('age > 50').show() завершается через ~ 30 секунд, а запрос id занимает так много времени.Разве они оба не должны делать одно и то же сканирование?

Любое понимание очень приветствуется.Я использую pyspark 2.4.0 на Linux.

1 Ответ

1 голос
/ 20 марта 2019

Разве они оба не должны выполнять одно и то же сканирование?

Это зависит от распределения данных.

Прежде всего show занимает всего несколькоданные, насколько это возможно, поэтому, если достаточно данных для сбора 20 строк (значение по умолчанию), он может обрабатывать всего один раздел, используя логику LIMIT (вы можете проверить Счетчик искр против длины и длины для подробного описания поведения LIMIT).

Если бы 1234 был на первом разделе, и вы явно установили ограничение в 1

df.filter('id = 1234').show(1)

, время было бы сопоставимо сдругой пример.

Но если предел меньше числа значений, удовлетворяющих предикату, или значения, представляющие интерес, находятся в следующих разделах, Spark придется сканировать все данные.

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

Но на самом деле, если вам нужны быстрые поиски, используйте правильную базу данных - для этого они и предназначены.

...