การใช้งานคำสั่ง mapReduce ใน MongoDB

[ นายวุฒิไกร ลิ่มสกุล : 31/05/2558 ]

   การใช้งานคำสั่ง mapReduce ใน MongoDB

        คำสั่ง mapReduce เหมาะสำหรับการประมวลผลข้อมูลขนาดใหญ่ จะเน้นการทำสรุปข้อมูลปริมาณมากๆ โดยถูกหยิบยกขึ้นมาแนะนำครั้งแรกโดย Google และใน MongoDB ก็ได้นำ เทคนิค Map Reduce เข้ามาเป็นฟีเจอร์หนึ่งในฐานข้อมูล เช่นเดียวกัน แต่เนื่องด้วยเจ้า Javascript Engine ของ MongoDB หรือที่เรียกว่า Spider Mokey ไม่สนับสนุนการทำงานแบบ Thread จึงทำให้การใช้งานคำสั่ง mapReduce ใน MongoDB เร็วสู้ฐานข้อมูลเจ้าอื่นไม่ได้อย่างเช่น Hadoop

            คำสั่ง mapReduce ประกอบด้วยการทำงาน 2 ขั้นตอน คือ

1. Map หมายถึงการเตรียมข้อมูลให้อยู่ในรูปแบบของ Key และ Values โดยในขั้นตอนการ map เราสามารถที่จะใส่เงื่อนไขเพื่อตรวจสอบค่าก่อนจะนำไปประมวลผล หรือเปลี่ยนแปลงข้อมูลให้เหมาะสม ให้อยู่ในรูปแบบของ Hash เช่น { number_id: { integer: 50 } } โดย Key จะมีได้เพียงค่าเดียวเท่านั้น ส่วน Values สามารถที่จะมีหลายค่าซ้อนเป็น Hash ในอีกระดังหนึ่งได้

2. Reduce หมายถึงการลดผลลัพธ์ลง จะขึ้นตอนการ Map หรือจะพูดให้เข้าใจง่ายๆคือ Reduce จะเป็นฟังก์ชั่นที่รับค่า Key กับ Values จากการ Map มาทำการประมวลผล เช่น การหาค่ามากที่สุด การนับจำนวน การหาค่าเฉลี่ย เป็นต้น โดย Key เดียวกันก็จะถูก Reduce เข้าด้วยกันเพื่อให้เข้าใจง่ายๆ ดูภาพตัวอย่างละกัน

Capture

การทำงานดังภาพข้างต้นจะสัมพันธ์กับ Code นี้

[code language="css"]
var map = function() {

  emit(this.number_id, { integer: this.integer, float: this.float });

}

var reduce = function(key, values) {

  var hash = { integer: 0, float: 0.0 };

  values.forEach(function(member){

    hash.integer += member.integer;

    hash.float -= member.float;

  });

  return hash;

}

db.number.mapReduce(map, reduce, { out: "result" });
[/code]
และเมื่อเราตรวจสอบด้วยคำสั่ง show collections; ใน MongoDB ก็จะปรากฎ collection ที่ชื่อ result ที่เราสร้างขึ้นซึ้นมามีผลลัพธ์ที่เราต้องการจัดเก็บอยู่