НачатьНачать бесплатно

Расширенная выборка 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 <- ___(___, ___))
Редактировать и запускать код