การเก็บผลลัพธ์ระหว่างกลาง
อย่างที่เห็นในบทที่ 1 การคัดลอกข้อมูลระหว่าง R กับ Spark เป็นงานที่ใช้เวลานาก ดังนั้นการ collect ข้อมูลอย่างที่ทำในแบบฝึกหัดก่อนหน้า ควรทำเฉพาะเมื่อจำเป็นจริงๆ เท่านั้น
ตัวดำเนินการ pipe นั้นสะดวกมากสำหรับการเชื่อมคำสั่งจัดการข้อมูลต่อกัน แต่โดยทั่วไปแล้ว คงไม่สามารถทำการวิเคราะห์ทั้งหมดโดยเชื่อมทุกอย่างเข้าด้วยกันในครั้งเดียวได้ ตัวอย่างเช่น แนวทางต่อไปนี้เป็นสิ่งที่ไม่ควรทำ เพราะจะทำให้ดีบักโค้ดได้ยากมาก
final_results <- starting_data %>%
# 743 steps piped together
# ... %>%
collect()
นี่จึงเป็นปัญหาที่ต้องแก้ไข กล่าวคือ จำเป็นต้องเก็บผลลัพธ์ของการคำนวณระหว่างกลาง แต่ก็ไม่อยากใช้ collect เพราะช้า ทางออกคือใช้ compute() เพื่อคำนวณผลลัพธ์ แต่เก็บไว้ใน data frame ชั่วคราวบน Spark โดย compute() รับอาร์กิวเมนต์สองตัว ได้แก่ tibble และชื่อตัวแปรสำหรับ Spark data frame ที่จะใช้เก็บผลลัพธ์
a_tibble %>%
# some calculations %>%
compute("intermediate_results")
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
แนะนำ Spark ด้วย sparklyr ใน R
คำแนะนำการฝึกหัด
มีการสร้าง Spark connection ไว้ให้แล้วในชื่อ spark_conn และกำหนด tibble ที่เชื่อมต่อกับเมทาดาทาของแทร็กที่เก็บไว้ใน Spark ไว้ล่วงหน้าในชื่อ track_metadata_tbl
- กรองแถวของ
track_metadata_tblที่artist_familiarityมีค่ามากกว่า 0.8 - คำนวณผลลัพธ์โดยใช้
compute()- เก็บผลลัพธ์ไว้ใน Spark data frame ชื่อ
"familiar_artists" - กำหนดผลลัพธ์ให้กับ R tibble ชื่อ
computed
- เก็บผลลัพธ์ไว้ใน Spark data frame ชื่อ
- ดูชุดข้อมูล Spark ที่มีอยู่โดยใช้
src_tbls() - แสดง
class()ของcomputedสังเกตว่าต่างจากcollect()ตรงที่compute()คืนค่าเป็น remote tibble ข้อมูลยังคงถูกเก็บอยู่ใน Spark cluster
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
# track_metadata_tbl has been pre-defined
track_metadata_tbl
computed <- track_metadata_tbl %>%
# Filter where artist familiarity is greater than 0.8
___ %>%
# Compute the results
___
# See the available datasets
___
# Examine the class of the computed results
___