開始使用免費開始

進階選取 II:SQL

如先前所述,當你使用 dplyr 介面時,sparklyr 會先把你的程式碼轉成 SQL,再交給 Spark 執行。大多數情況下,這正是你要的。不過,你也可以直接撰寫原生 SQL 來完成相同工作。多半情況下這不是好主意,因為程式碼更難寫、也更難除錯。然而,若你希望程式碼具有可移植性——也就是在 R 以外的環境也能使用——那就可能有幫助。舉例來說,一個常見流程是先用 sparklyr 嘗試資料處理,再在正式環境改為使用原生 SQL。若一開始就以原生 SQL 撰寫,到正式環境時只要複製貼上查詢即可。

SQL 查詢以字串撰寫,並透過 DBI 套件的 dbGetQuery() 傳遞。基本範例如下。

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](https://www.datacamp.com/courses/introduction-to-sql)。

本練習屬於課程

使用 R 的 sparklyr:Spark 入門

檢視課程

練習說明

已為你建立名為 spark_conn 的 Spark 連線。連結到 Spark 中 track metadata 的 tibble 已預先定義為 track_metadata_tbl,在 SQL 查詢中可以用 track_metadata 存取。

  • 完成查詢:從 track_metadata 這個 Spark data frame 中選取所有欄位,條件為 year 小於 1935,且 duration 大於 300 秒。
  • 呼叫 dbGetQuery() 來執行查詢,將結果指定給 results,然後檢視輸出。

動手互動練習

試著完成這個範例程式碼,體驗一下這個練習。

# Write SQL query
query <- "SELECT ___ FROM ___ WHERE ___ AND ___"

# Run the query
(results <- ___(___, ___))
編輯並執行程式碼