Разве они оба не должны выполнять одно и то же сканирование?
Это зависит от распределения данных.
Прежде всего show
занимает всего несколькоданные, насколько это возможно, поэтому, если достаточно данных для сбора 20 строк (значение по умолчанию), он может обрабатывать всего один раздел, используя логику LIMIT
(вы можете проверить Счетчик искр против длины и длины для подробного описания поведения LIMIT
).
Если бы 1234
был на первом разделе, и вы явно установили ограничение в 1
df.filter('id = 1234').show(1)
, время было бы сопоставимо сдругой пример.
Но если предел меньше числа значений, удовлетворяющих предикату, или значения, представляющие интерес, находятся в следующих разделах, Spark придется сканировать все данные.
Если выесли вы хотите, чтобы это работало быстрее, вам понадобятся данные, сгруппированные (на диске) или разделенные (в памяти) с использованием интересующей вас области, или используйте одно из проприетарных расширений (например, индексирование Databricks) или специализированное хранилище (например, невезучий)у неактивен, сукцинт).
Но на самом деле, если вам нужны быстрые поиски, используйте правильную базу данных - для этого они и предназначены.