รวมสูตรเบื้องต้นการใช้คำสั่ง AWK ในการ Sum, Max, และ Counter by “Key”

ตอนนั้นเรียน Course ของ udacity “Intro to Hadoop and MapReduce” แล้วนึกแผลงใช้คำสั่ง AWK ในการทำ Map Reduce ตามการบ้าน ซึ่งจริงๆ เขาให้เขียนด้วย Python แม้จะทำเล่นๆ แต่พอมานึกดูน่าจะสรุปเป็นสูตร เพราะว่ามุมมองการเขียน Map และ Reduce ด้วย AWK มันตรงๆ เรียบง่าย

ข้อมูลนี้เป็นส่วนหนึ่งของตัวอย่างในคอร์ส เป็นข้อมูลการซื้อขายใน Store ต่างๆ โดยสองหลักแรกเป็นวันที่และเวลาที่เกิดรายการนั้นๆ หลักต่อมา ชื่อเมือง, หมวดของ, ยอด, วิธีการชำระเงิน ตามลำดับ

ซึ่งเมื่อส่งข้อมูลนนี้เข้า AWK ตัวโปรแกรมจะจับคู่หลักกับเลขอ้างอิงทันที (Map) และผมมักจะส่งข้อมูลเข้าไป Reduce ทันที ซึ่งจริงๆ ตามขั้นตอนที่ถูกต้องของ MapReduce จะแยกขั้นอย่างชัดเจน โดย

  • Map จะเป็นการจับคู่และกรองข้อมูลที่อ้างอิงเท่าที่ต้องการใช้เท่านั้น
  • Reduce เป็นจังหวะที่ทำการประมวลผลข้อมูลเพื่อให้ได้ผลลัพธ์ตามโจทย์

1. คำนวนหาค่าผลรวม (Sum) ของ Key

โจทย์แรกเป็นการหาผลรวมของหมวดสินค้าที่เกิดรายขึ้นทั้งหมด

เมื่อนำข้อมูลส่งเข้ามาจะ Map หลักที่ 4 (หมวดสินค้า) มาเป็น Key ของตัวแปรที่ชื่อ “sums” และนำค่าหลัก 5 ซึ่งเป็นยอดการทำรายการมาบวกกันในทุกๆ Key ที่ Match กัน

สุดท้ายเมื่อจบชุดข้อมูล ก็จะทำการวน Print ข้อมูลออกมาเป็นยอดผลรวม :p

2. ค้นหาค่ามากสุด (Max) ของ Key

โจทย์สองค้นหายอดทำรายการมากที่สุดจากเมืองที่ Store ตั้งอยู่

ข้อมูลหลัก 3, 5 คือ ชื่อเมืองและยอดการทำรายการ โดยจะทำเทียบยอดกับค่าใน “key” ของชื่อเมือง ถ้ามากกว่าจะนำไปเก็บใน Key

3. นับค่า (Counting) ของ Key

โจทย์สุดท้ายเป็นการนับจำนวนวิธีการชำระเงินที่เกิดขึ้น

ง่ายๆก็ ใช้หลักที่ 6 มาเป็น Key ในการนับ แล้วสุดท้ายก็แสดงผล

แถม…

เลือก Row ที่ต้องการ โดยดูจากค่าใน Column ที่ต้องการ

ปกติเทียบได้กับคำสั่ง grep แต่ถ้าต้องการเจาะจงไปที่ Column สามารถใช้ AWK ช่วยได้

คำสั่งอื่นๆ เช่น sort -n ก็ช่วยเรียง, wc -l เป็นนับบรรทัด

สรุป…

การนำ AWK มาใช้นั้นช่วยให้เราทดสอบ Algo ในการ Reduce ได้เบื้องต้น สำหรับใครที่ถนัด Command-line และทำได้ทันทีเพราะ Linux ติดตั้งคำสั่งแล้ว แต่ความสามารถภาษาไม่เทียบเท่าของ Python นะครับ ออกแนว Indy

สูตรที่สรุปไว้เป็นท่าที่ผมมักใช้บ่อย Sum, Max และ Counting 
อย่าลืมลองดู ลอง AWK แล้วจะติดใจ… :p