การเลือกข้อมูลขั้นสูง II: SQL
ดังที่กล่าวไปก่อนหน้านี้ เมื่อใช้ interface ของ dplyr นั้น sparklyr จะแปลงโค้ดให้เป็น SQL ก่อนส่งต่อไปยัง Spark ซึ่งโดยส่วนใหญ่นี่คือสิ่งที่ต้องการ อย่างไรก็ตาม สามารถเขียน SQL แบบ raw เพื่อทำงานเดียวกันได้เช่นกัน แต่โดยทั่วไปไม่แนะนำ เพราะโค้ดจะเขียนยากและดีบักยากกว่า อย่างไรก็ดี หากต้องการให้โค้ดสามารถนำไปใช้ในสภาพแวดล้อมอื่นนอกเหนือจาก R ได้ วิธีนี้อาจมีประโยชน์ ตัวอย่างเช่น workflow ที่พบได้บ่อยคือการใช้ sparklyr ทดลองประมวลผลข้อมูล แล้วสลับไปใช้ SQL แบบ raw ในสภาพแวดล้อม production โดยการเขียน SQL แบบ raw ตั้งแต่แรก จะช่วยให้คัดลอก query ไปใช้ใน production ได้ทันที
SQL query เขียนในรูปแบบ string แล้วส่งไปยัง dbGetQuery() จากแพ็กเกจ DBI รูปแบบการใช้งานเป็นดังนี้
query <- "SELECT col1, col2 FROM some_data WHERE some_condition"
a_data.frame <- dbGetQuery(spark_conn, query)
สังเกตว่าต่างจากโค้ด dplyr ที่เคยเขียน dbGetQuery() จะรัน query และส่งผลลัพธ์กลับมาที่ R ทันที หากต้องการหน่วงเวลาการดึงข้อมูล สามารถใช้ dbSendQuery() เพื่อรัน query ก่อน แล้วตามด้วย dbFetch() เพื่อดึงผลลัพธ์ ซึ่งเป็นการใช้งานขั้นสูงที่ไม่ได้ครอบคลุมในบทนี้ นอกจากนี้ ฟังก์ชันของ DBI จะคืนค่าเป็น data.frame แทนที่จะเป็น tibble เนื่องจาก DBI เป็นแพ็กเกจระดับล่างกว่า
หากต้องการเรียนรู้การเขียน SQL เพิ่มเติม สามารถศึกษาได้จากคอร์ส Introduction to SQL
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
แนะนำ Spark ด้วย sparklyr ใน R
คำแนะนำการฝึกหัด
มีการสร้าง Spark connection ไว้ให้แล้วในชื่อ spark_conn และมี tibble ที่เชื่อมต่อกับ track metadata ที่เก็บใน Spark กำหนดไว้ล่วงหน้าในชื่อ track_metadata_tbl ซึ่งสามารถเข้าถึงใน SQL query ได้ในชื่อ track_metadata
- เติม query ให้สมบูรณ์เพื่อเลือกทุกคอลัมน์จาก Spark data frame
track_metadataโดยกรองเฉพาะแถวที่yearน้อยกว่า 1935 และdurationมากกว่า 300 วินาที - เรียกใช้
dbGetQuery()เพื่อรัน query แล้วกำหนดผลลัพธ์ให้กับresultsจากนั้นแสดงผลลัพธ์ที่ได้
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
# Write SQL query
query <- "SELECT ___ FROM ___ WHERE ___ AND ___"
# Run the query
(results <- ___(___, ___))