09 February 2009

DataStage: Oracle Date

กรณีดึงข้อมูลจาก column ที่มี data type เป็น date หากกำหนด data type ใน datastage เป็น date ตาม table จะมี error เกิดขึ้น

Error Message:
Oracle_Enterprise_0: Error when checking operator: When binding output interface field "HOMELOANDATE" to field "HOMELOANDATE": No default type conversion from type "timestamp" to type "date".

วิธีแก้ไข
1. กำหนด data type ใน oracle stage เป็น timestamp จากนั้นทำการแปลง data type จาก timestamp เป็น date โดยใช้ function TimestampToDate() ดังตัวอย่าง
TimestampToDate(lnk_alscom_application.PERSONALLOANDATE)

หรือ

2. ตอน select ข้อมูลจาก Table ให้ทำการแปลง data โดยใช้ function TO_CHAR เพื่อเปลี่ยนข้อมูลเป็น character โดยใน datastage ให้กำหนด data type เป็น Varchar
TO_CHAR(HOMELOANDATE,'DD/MM/YYYY') as HOMELOANDATE
จากนั้นค่อยแปลงข้อมูลกลับเป็น date อีกที โดยใช้ function StingToDate() ดังนี้
StringToDate(lnk_alscom_application.HOMELOANDATE,"%dd/%mm/%yyyy")
โดยที %dd/%mm/%yyyy เป็น format ของ string
ทั้ง 2 วิธีจะได้ output ออกมาเป็น format YYYY-MM-DD เหมือนกัน

06 February 2009

DataStage: Find TOPn by Head Stage

นอกจากนี้การหา ค่าสูงสุด 20 อันดับแรกโดยใช้ Range Partition สามารถใช้อีกวิธีคือ การประยุกต์ใช้ Head Stage ดังนี้



รูป 1

จากรูป 1 เป็น Job ที่ใช้หาค่าสูงสุด 20 อันดับแรก หลังจากใช้ Sort Stage ที่ชื่อ srt_Data_In_Partition ในการเรยงลำดับข้อมูล CRN_BAL ในแต่ละ Partition จาก มากไปหาน้อยเรียบร้อยแล้ว จึงใช้ Head Stage ที่ชื่อ hd_Top_100 เลือกข้อมูล 100 อันดับแรก จากแต่ละ Partition โดย กำหนดค่า Property ใน Head Stage รูป 2) ดังนี้
- Rows
- Number of Rows (Per Partition) กำหนดเป็น 100 เพื่อเลือกข้อมูล 100 รายการแรก ของ ทุก Partition

- Partitions
- All Partitions กำหนดเป็น True เพื่อเลือกข้อมูล ทุก Partition




รูป 2

เมื่อผ่าน Head Stage ที่กล่าวมาจะทำให้ได้ ข้อมูลออกมา 400 รายการ แล้วจึง ใช้ Head Stage ชื่อ hd_Top_20_on_Partition_0 เพื่อเลือกข้อมูล เฉพาะ 20 รายการแรก โดยกำหนด ให้ Execution Mode เป็น Sequential เพื่อรวมข้อมูลที่ถูกแบ่งออกเป็น Partition เป็น File เดียว โดย กำหนดที่ Stage tab และ ไปที่ Advance Tab เลือกกำหนดค่า Execution Mode เป็น Sequential ที่ List Box ที่ชื่อ Execution Mode (รูป 3) จากนั้นจึง กำหนดค่า Number of Row (Per Partition) เป็น 20 และ All Partition เป็น True เพื่อเลือก 20 รายการแรก (รูป 4)



รูป 3



รูป 4

05 February 2009

DataStage: Range Partition

Range Partition เป็นการแบ่งข้อมูล ในแต่ละ Partition แบบเท่าๆ กัน ซึ่งในแต่ละ Partition จะเก็บข้อมูล โดยแบ่งตาม Range ของข้อมูล ตาม Column ที่สนใจ 1 Column หรือ มากกว่า ขึ้นไป เพื่อใช้ประโยชน์สำหรับเก็บข้อมูลที่สัมพันธ์กันไว้ใน Partition เดียวกัน นอกจากนั้น ในแต่ละโหนด อาจมี Range ที่มีขอบเขตมากน้อยไม่เท่ากัน เพื่อเก็บข้อมูลในแต่ละโหนดให้มีจำนวนเท่าๆ กัน โดยส่วนใหญ่ Range Partition มักจะใช้ก่อนหน้าที่จะ ทำการเรียงข้อมูล

ในการใช้งาน Range Partition จำเป็นต้องมีการสร้าง Range Map ซึ้งทำได้โดย ใช้ Stage ชื่อ Write Range Map ซึ่งจะแสดงรายละเอียดในหัวข้อถัดไป



รูป 1

จากรูป 1 เป็นกราฟ แบบแท่ง แสดงแบ่ง Partition ตามข้อมูลอายุ โดยกราฟแต่ละแท่งคือจำนวน Partition และ  Range ของแต่ละ Partition คือ ตัวเลขที่ปรากฎบนแท่งกราฟ ความสูลของกราฟ คือ จำนวนรายการข้อมูลที่บรรจุในแต่ละ Partition สังเกตุว่า Data Stage จะแบ่งข้อมูลให้เก็บในแต่ละ Partition ให้เท่าๆ กัน โดยมีขอบเขตของ Range ของข้อมูล ในแต่ละ Partition อาจไม่เท่ากัน โดยการคำนวณจะใช้ Range Map ในการคำนวณ


การใช้งาน Range Partition




รูป 2

จากรูปเป็นการรวม Sequential File 3 File เพื่อหาข้อมูลที่เก็บใน Column ชื่อ CRN_BAL สูงสุด 20 อันดับแรก ซึ่งก่อนหน้าจำทำการเรียงลำดับข้อมูล CRN_BAL โดย Sort Stage ที่ชื่อ srt_Data_In_Partition แล้วใช้ Head Stage ที่ชื่อ hd_Top_20_on_Partition_0 เพื่อเก็บเฉพาะข้อมูล 20 รายการแรก จะต้องทำการเปลี่ยนแปลง Partition ให้เป็นแบบ Range Partition โดยกำหนดที่ Transformer Stage  ที่ชื่อ xfrm_Set_Range_Partition

จากที่กล่าวมา ในเมื่อมีการใช้ Partition แบบ Range Partition จะต้องมีการสร้าง Range Map ก่อน แล้วจึงนำ Range Map ที่ได้ ไปใช้เมื่อต้องการใช้ Partition แบบ Range Partition ดังนั้นก่อนหน้าที่จะสร้าง Job ดังรูป 1 ต้องสร้าง Job เพื่อสร้าง Range Map ดังต่อไปนี้




รูป 3

จากรูป 3 เป็น Job สำหรับสร้าง Range Map โดยนำ Sequential File ทั้ง 3 มารวมกัน และ เรียงลำดับข้อมูลใน CRN_BAL ด้วย Sort Stage ชื่อ srt_By_CRN_BAL เพื่อจำเรียงข้อมูลก่อน จะสร้าง Range Map ด้วย Write Range Map Stage ชื่อ Write_Range_Map

เนื่องจาก การสร้าง Range Map นั้น Data Stage จะอ่านข้อมูล CRN_BAL ทั้งหมดเพื่อการคำนวน Range ของข้อมูล ให้สัมพันธ์กับ จำนวน Partition ที่กำหนด ดังนั้นการเรียงลำดับจะช่วยให้ การสร้าง Range Map ทำได้เร็วขึ้น จึงควรมีการใช้ Sort Stage ก่อน Write Range Map Stage



รูป 4



รูป 5

จากรูป 4 เป็นการกำหนดค่าสำหรับ Write Range Map Stage ที่ Input Tab ไปที่ Property Tab กำหนด  Option ต่างๆ ดังนี้

- File Update Mode กำหนดเป็น Overwrite เพื่ออนุญาติให้สามารถสร้าง Range Map ทับ File เดิมได้
- Key กำหนดเป็น CRN_BAL ซึ่งก็คือ Key Column ที่ต้องการสร้าง Range Map โดย กำหนด Option ย่อย ชื่อ Sort Order เป็น Descending เพื่อให้เรียงข้อมูลแบบมากไปหาน้อย
- Range Map File กำหนด Path และ ชื่อ File ที่ใช้เก็บ Range Map (รูป 5) โดยจะนำไปใช้เมื่อต้องการแบ่ง Partition แบบ Range Partition

การประยุกต์ใช้ Range Partition เพื่อหา Top20
เมื่อ Run Job ที่ใช้สร้าง Range Map เรียบร้อย จึงนำ Range Map (File และ Path ที่กำหนดเมื่อสร้าง Range Map ดังที่กล่าวมา) ดังต่อไปนี้



รูป 6

กำหนด รูป แบบ Partition ที่ Transformer Stage ที่ชื่อ xfrm_Set_Range_Partition ของ Job ในรูป 2 ที่ Inputs Tab และ ไปที่ Partitioning Tab กำหนด Property ต่างๆ ดังนี้

- Partition Type กำหนดเป็น Range เพื่อเลือก การแบ่ง Partition แบบ Range Partition
- Available กำหนดเป็น CRN_BAL (เมื่อ Click แล้ว จะไปปรากฏที่ Column ชื่อ Key ของตาราง Selected) เป็นการกำหนด Key Column โดย กำหนด Option ที่ตาราง Select  เป็น Descending

หมายเหตุ : ในการเลือก Key Column และ Option จะต้องเลือกให้เหมือนกับ Range Map ที่ได้สร้างไว้

- File Name และ Part ของ Range Map โดย Click ที่ปุ่ม   ที่ปรากฏด้านหลังของ List Box ที่ชื่อ Partition Type โดยเมื่อ Click แล้ว ช่องให้ระบุ Name และ Part ของ Range Map

หลังจากที่กำหนด Property ที่ Write Range Map Stage แล้วจึงทำการเรียงลำดับข้อมูลโดยใช้ Sort Stage ที่ชื่อ srt_Data_In_Partition โดยกำหนดให้ เรียงลำดับตาม ข้อมูลใน Column ที่ชื่อ CRN_BAL และ เรียงลำดับแบบ Descending แต่ต้องมีการกำหนด Partition Type ของ Sort Stage แบบ Same เมื่อให้ใช้ การแบ่ง Partition แบบเดียวกันกับ Transformer Stage ที่ส่งข้อมูลเข้ามา จะทำให้ข้อมูล CRN_BAL ที่มากที่สุดถูกเก็บไว้ที่ Partition ที่ 1



รูป 7

เมื่อได้ข้อมูลที่ถูกเรียงลำดับ CRN_BAL จากมากไปหาน้อย และ ข้อมูลดังกล่าว ถูกเก็บไว้ที่ Partition ที่ 1 ขั้นต่อไปเป้นการเลือกข้อมูล เฉพาะ 20 อันดับแรก จากรูป 7 เลือกใช้ Head Stage โดยกำหนด Property ตามขั้นตอนต่อไปนี้

เลือก Stage Tab และ ไปที่ Property Tab กำหนด Property ดังนี้
- Rows
- Number of Rows (Per Partition) กำหนดเป็น 20 เพื่อเลือกข้อมูล 20 รายการแรก ของ ทุก Partition

- Partitions
- All Partitions กำหนดเป็น False เพื่อเลือกข้อมูล เฉพาะ Partition ที่สนใจเท่านั้น
- Partition Number กำหนดเป็น 0 เพื่อเลือกข้อมูลจาก Partition ที่ 1  (เลขที่ ที่ใช้กำหนด Partition ที่สนใจ จะเริ่มจาก 0 คือ Partition ที่ 1 และ 1 คือ Partition ที่ 2 ต่อเนื่องกันไปตามจำนวน Partition)

ดังนั้นจากตัวอย่าง Range Partition สามารถใช้หาข้อมูล สูงสุด 20 อันดับ โดย ให้ Range Partition ช่วยในการรวบรวมข้อมูล สูงสุด ไปหา ต่ำสุด เก็บไว้ที่ Partition ที่ 1, 2, 3 … ไปจนถึง Partition สุดท้าย จากนั้นจึงใช้ Sort Stage ช่วยในการเรียงลำดับข้อมูลในแต่ละ Partition จากมากไปหาน้อย แล้วจึง ใช้ Head Stage เลือกข้อมูล 20 อันดับแรกจาก Partition ที่ 1 จึงทำให้ได้ข้อมูล 20 อันดับแรก ที่ถูกต้อง

03 February 2009

IBM Technical Library View

เอกสารเกี่ยวกับ Informix Dynamic Server (IDS) และ DataStage เต็มเลย เอาตัวอย่างไปดูก่อน

Informix
DataStage
ทั้งหมดมาจาก Technical library view ของ IBM DeveloperWorks
ว่างๆ ก็เข้าไปอ่านได้