Lựa chọn nâng cao II: SQL
Như đã đề cập, khi bạn dùng giao diện dplyr, sparklyr sẽ chuyển mã của bạn thành SQL trước khi gửi cho Spark. Hầu hết thời gian, đây là điều bạn muốn. Tuy nhiên, bạn cũng có thể viết SQL thuần để làm cùng một việc. Thường thì đây là một ý tưởng không hay vì mã khó viết và khó gỡ lỗi hơn. Tuy vậy, nếu bạn muốn mã có tính di động – tức có thể dùng ngoài R – thì lại hữu ích. Ví dụ, một quy trình khá phổ biến là dùng sparklyr để thử nghiệm xử lý dữ liệu, sau đó chuyển sang SQL thuần trong môi trường triển khai. Bằng cách viết SQL thuần ngay từ đầu, bạn có thể chỉ việc sao chép và dán các truy vấn khi đưa vào sản xuất.
Câu lệnh SQL được viết dưới dạng chuỗi và truyền vào dbGetQuery() từ gói DBI. Mẫu như sau.
query <- "SELECT col1, col2 FROM some_data WHERE some_condition"
a_data.frame <- dbGetQuery(spark_conn, query)
Lưu ý rằng khác với mã dplyr bạn đã viết, dbGetQuery() sẽ luôn thực thi truy vấn và trả về kết quả cho R ngay lập tức. Nếu bạn muốn trì hoãn việc trả dữ liệu, bạn có thể dùng dbSendQuery() để thực thi truy vấn, rồi dbFetch() để lấy kết quả. Đó là cách dùng nâng cao, không đề cập chi tiết ở đây. Cũng lưu ý rằng các hàm DBI trả về data.frame thay vì tibble, vì DBI là một gói cấp thấp hơn.
Nếu bạn muốn học thêm về viết SQL, hãy tham gia khóa Introduction to SQL.
Bài tập này là một phần của khóa học
Nhập môn Spark với sparklyr trong R
Hướng dẫn bài tập
Kết nối Spark đã được tạo sẵn cho bạn dưới tên spark_conn. Một tibble gắn với track metadata được lưu trong Spark đã được định nghĩa sẵn là track_metadata_tbl, và có thể truy cập trong truy vấn SQL với tên track_metadata.
- Hoàn thành truy vấn để chọn tất cả các cột từ data frame Spark
track_metadatanơiyearnhỏ hơn 1935 vàdurationlớn hơn 300 giây. - Gọi
dbGetQuery()để thực thi truy vấn, gán kết quả vàoresults, rồi xem đầu ra.
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
# Write SQL query
query <- "SELECT ___ FROM ___ WHERE ___ AND ___"
# Run the query
(results <- ___(___, ___))