RSS

Tag Archives: pdi

สรุปที่ไปเรียน Pentaho Data Integration

เมื่อวันเสาร์ที่ 10 มี.ค. 2012 ได้ไปเรียนคอส Pentaho กับพี่รูฟ @roofimon ที่ @tarad จัดโดยพี่หนุ่ม @zyracuze โดยคอสนี้เป็นการแลกเปลี่ยนความรู้ระหว่าง @tarad กับทาง @opendream

เริ่มต้นด้วยการแนะนำเกี่ยวกับ Data Warehouse ว่าเป็นเรื่องของการจัดเก็บและจัดการข้อมูล โดยปกติแล้วข้อมูลจะแบ่งประเภทได้ดังนี้

  • Transactional เป็นข้อมูลหน่วยย่อยที่สุด ที่มีการเก็บอยู่ในระบบต่างๆ เช่น Daily Sales, Order จะเป็นข้อมูลที่ realtime และมีการเก็บรายละเอียดเยอะ ทำให้มีข้อมูลขยะปนอยู่มาก การจัดเก็บข้อมูลมีความหลากหลาย เช่น เป็น text file, เป็น table ใน database เป็นต้น
  • Analytical การนำข้อมูลมาจัดใหม่ เพื่อให้มีรูปแบบเหมาะสำหรับนำไปใช้วิเคราะห์ได้สะดวก
  • Data Mining การเตรียมข้อมูลสำหรับใช้พยากรณ์แนวโน้มในอนาคต

แนวคิดการทำ Data Warehouse 2 แบบ ได้แก่

  • Bill Inmon : Normalize, Top-Down เป็นการมองภาพใหญ่ แบบ Enterprise Data Warehouse ออกแบบโดยการดูภาพรวมทั้งหมดขององค์กร
  • Ralph Kimball : Dimensional, Bottom-Up เป็นการออกแบบโดยเริ่มทำจากข้อมูลขนาดเล็กก่อน แล้วค่อยๆ เพิ่ม

แนวทางที่นิยม คือเริ่มทำจากการออกแบบ Data Warehouse ขนาดเล็กพอได้รูปร่างตามวิธีของ Ralph Kimball จากนั้นไปใช้วิธีแบบ Bill Inmon เพื่อวาง Standard แล้วค่อยทำเข้ามาหากันตรงกลาง

Pentaho เป็นโครงการ open source สำหรับงาน Business Intelligence ประกอบด้วยเครื่องมือสำหรับการทำ reporting, dashboard, data mining, workflow และ ETL

Pentaho แบ่ง license เป็น 2 แบบคือ

  1. Community Edition โปรแกรมต่างๆ สามารถ download มาใช้งานได้ฟรี
  2. Enterprise Edition คิดค่าบริการ Support เมื่อต้องการความสามารถที่สูงขึ้น

สำหรับการเรียนครั้งนี้เน้นที่การหัดใช้งานเครื่องมือสำหรับทำ ETL (Extract-Transform-Load) คือ PDI (Pentaho Data Integration) มีโค๊ดเนมว่า Kettle

ความน่าสนใจของ PDI คือการสร้าง flow เป็น diagram โดยการวาง control ที่มีหน้าที่ต่างๆ เป็นขั้นตอนและลากเส้นกำหนดทิศทางการทำงาน ซึ่งมี control ให้ใช้งานมากมาย เสร็จแล้วสามารถ save เป็นไฟล์นามสกุล *.ktr (kettle transformations) เพื่อนำไปใช้งานต่อไป

โปรแกรม PDI นั้นเป็น SWT เหมือนกับ Eclipse ต้องการ Java Runtime สำหรับทำงาน

หน้าตาของโปรแกรม PDI เป็นแบบนี้

ผู้สอนได้แนะนำให้ใช้งาน control ต่างๆ ดังนี้

กลุ่ม Input

  • Fixed file input ใช้อ่านข้อมูลจากไฟล์ที่มีการกำหนดเป็น block ในแต่ละ column มี GUI ที่ใช้กำหนดขนาดของแต่ละ block ได้ง่าย
  • Text file input ใช้อ่านข้อมูลจาก flat database เช่น CSV, file ที่เก็บข้อมูลโดยมีตัวแบ่ง column
  • Table input โหลดข้อมูลจากตารางใน database

กลุ่ม Transform

  • Calculator ใช้สำหรับการคำนวณ
  • Select values ใช้ในการเลือกข้อมูล
  • Sort rows ใช้เรียงลำดับข้อมูล

กลุ่ม Scripting

  • Formula ใช้สำหรับกำหนดสูตรต่างๆ
  • Modified Java Script Value ใช้ JavaScript เพื่อกำหนดเงื่อนไข

กลุ่ม Statistics

  • Group by ใช้สำหรับ aggregate ต่างๆ เช่น Sum, Average

กลุ่ม Output

  • Text file output นำข้อมูลที่ได้จากการ transform สร้างเป็น text file
  • Table output นำข้อมูลไป insert/update ลงตารางใน database

หลังจากเรียยโดยการทำตามตัวอย่างแล้ว ก็มีโจทย์ให้ลองทำ
มี input เป็น text file ชื่อ ccaa.txt เป็นข้อมูลของกรมการปกครอง ที่มีข้อมูลรหัสพื้นที่และชื่อของเขตต่างๆ มีรูปแบบดังนี้

10000000|กรุงเทพมหานคร|
10010000|เขตพระนคร|
10010100|พระบรมมหาราชวัง|
10010200|วังบูรพาภิรมย์|
10010300|วัดราชบพิธ|
10010400|สำราญราษฎร์|
10010500|ศาลเจ้าพ่อเสือ|

ต้องการแยกข้อมูลออกมาเป็นรหัสและชื่อของเขตต่างๆ แบ่งเป็น จังหวัด, อำเภอ และตำบล เพื่อนำไปใช้งานต่อ

เมื่อดูจากรูปแบบของรหัสเขต พบว่าสามารถจัดกลุ่มเป็นรหัสเพื่อแบ่งระดับได้ดังนี้
PP|AA|TTTT

โดยตำแหน่งของ PP คือรหัสของจังหวัด, AA คือรหัสอำเภอ และ TTTT คือรหัสตำบล

ขั้นตอน

  1. ใช้ Text file input เพื่อระบุ path ของ source file และจัดข้อมูลลง field
  2. ใช้ Formula เพื่อแยกรหัสออกเป็น รหัสจังหวัด, อำเภอ และตำบล โดยเลือกใช้การตัดคำตามตำแหน่งตามที่ได้วิเคราะห์ไว้


  3. ใช้ Modified Java Script Value เพื่อเขียน script สำหรับกำหนดว่าข้อมูลแต่ละแถวเป็นประเภทอะไร

  4. ใช้ Switch / Case เพื่อแยกข้อมูลแต่ละแถวไปยังแต่ละกลุ่ม


  5. ใช้ Select values 3 อันเพื่อเลือก field ที่ต้องการนำไปใช้งานในแต่กลุ่ม
  6. ใช้ Table output เพื่อ insert/update ข้อมูลลงตารางตามประเภทของเขต

ผลลัพท์

เมื่อ execute โปรเจ็คแล้ว จะทำการ transform ข้อมูลจาก text file เข้าสู่ database ที่สร้างตารางสำหรับเก็บข้อมูลรอไว้ ดังนี้

การนำไปใช้
เมื่อได้ไฟล์ *.ktr แล้ว จะนำไปใช้งานโดยใช้คำสั่งดังนี้

$ /path/to/pdi/pan.sh /file:/path/to/kettle/transform/file.ktr

ถ้าต้องการให้ทำงานเป็น schedule ก็สามารถนำไปตั้ง contrab ได้

สรุป

สำหรับโปรแกรมเมอร์แล้ว ถ้าต้องการเครื่องมือช่วยในการ transform data ตัว PDI จะช่วยลดเวลาลงได้ มากกว่าไปเขียนโปรแกรมเอง หรือถ้าเป็น SE, SA, Tester จะนำไปใช้สร้าง Test Data ก็ช่วยได้เยอะ

นอกจากนี้ PDI ยังมี control ที่น่าสนใจเช่น MongoDB Input, Json Input/Output และอื่นๆ อีกมากมาย คิดว่าเสียเวลาเรียนรู้แล้วน่าจะนำไปทำอะไรได้อีกเยอะ

เพิ่มเติม

  • การกำหนดค่า Database Connection สำหรับ MySQL JDBC โดยcolumn ที่เป็น VARCHAR ที่กำหนด collection เป็น utf8 เมื่อ update data แล้วแต่กลายเป็น ????? วิธีแก้คือให้เพิ่ม Option characterEncoding = UTF8



  • โปรแกรม PDI version 4.2 บน Ubuntu 11.04 64 bit เมื่อเปิด Formula จะเกิด error เนื่องจากไม่มี xulrunner ให้ติดตั้งก่อนโดยใช้คำสั่งดังนี้
    sudo apt-get install xulrunner-1.9.2

    จาก: Problem on Ubuntu 11.04: java.lang.UnsatisfiedLinkError: no swt-mozilla-gtk-3346

Link อื่นๆ ที่น่าสนใจ

 
Leave a comment

Posted by on Mon March 26, 2012 in Technical

 

Tags: , ,