進階選取 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 <- ___(___, ___))