Расширенная выборка II: SQL
Как уже упоминалось, при использовании интерфейса dplyr пакет sparklyr автоматически преобразует ваш код в SQL перед отправкой в Spark. В большинстве случаев это именно то, что нужно. Однако вы также можете писать SQL-запросы напрямую, чтобы решить ту же задачу. Обычно это не лучшая идея: такой код сложнее писать и отлаживать. Тем не менее, если вы хотите, чтобы код был переносимым — то есть мог использоваться за пределами R, — это может оказаться полезным. Например, распространённый подход: использовать sparklyr для экспериментов с обработкой данных, а затем перейти на чистый SQL в производственной среде. Если сразу писать запросы на SQL, их можно просто скопировать и вставить при переходе на продакшн.
SQL-запросы записываются в виде строк и передаются в функцию dbGetQuery() из пакета DBI. Шаблон выглядит следующим образом.
query <- "SELECT col1, col2 FROM some_data WHERE some_condition"
a_data.frame <- dbGetQuery(spark_conn, query)
Обратите внимание: в отличие от кода на dplyr, функция dbGetQuery() всегда немедленно выполняет запрос и возвращает результаты в R. Если вы хотите отложить получение данных, можно воспользоваться dbSendQuery() для выполнения запроса, а затем dbFetch() для получения результатов. Это более продвинутый сценарий использования, который здесь не рассматривается. Также учтите, что функции DBI возвращают объекты типа data.frame, а не tibble, поскольку DBI — это низкоуровневый пакет.
Если вы хотите подробнее изучить написание SQL-запросов, пройдите курс Introduction to SQL.
Это упражнение является частью курса
Введение в Spark с sparklyr на R
Инструкции к упражнению
Подключение к Spark уже создано и доступно как spark_conn. Tibble, связанный с метаданными треков, хранящимися в Spark, предварительно определён как track_metadata_tbl; в SQL-запросах к нему можно обращаться по имени track_metadata.
- Дополните запрос так, чтобы он выбирал все столбцы из Spark-датафрейма
track_metadata, где значениеyearменьше 1935, а значениеdurationпревышает 300 секунд. - Вызовите
dbGetQuery(), чтобы выполнить запрос, сохраните результаты в переменнуюresultsи выведите их на экран.
Интерактивное практическое упражнение
Попробуйте выполнить это упражнение, дополнив этот пример кода.
# Write SQL query
query <- "SELECT ___ FROM ___ WHERE ___ AND ___"
# Run the query
(results <- ___(___, ___))