Data Integration (EP 2) - ควักมันออกมา
สวัสดีตัวผมเองและชาวโลกฮะ
ต่อจาก EP ที่แล้ว คราวนี้ เราจะมาลงมือสร้างโปรแกรมง่ายๆสักตัวนึงนะฮะ
ผมกำหนดโจทย์ง่ายๆมาตัวนึง นั่นคือ เรามีข้อมูลเป็นไฟล์ CSV จำนวนสิบไฟล์ด้วยกัน อยู่ในแฟ้มเดียวกัน เราจะเอามันมารวมให้กลายเป็นไฟล์เดียวในอีกแฟ้มนึง จะทำยังไงได้บ้างฮะ
เริ่มต้นจากตัวโปรแกรม Talend ฮะ
ส่วนประกอบหลักของโปรแกรม
ด้านซ้ายเรียกว่า Repository เป็นคลังแสงของ job และองค์ประกอบของ job เช่น โค้ดโปรแกรมเพิ่มเติม หรือรูปแบบชุดข้อมูล (Metadata, Schema) ฮะ
ส่วนด้านขวาเป็น Palette แสดงรายการ component ที่เราหยิบเอาไปใช้ได้ฮะ
ด้านล่างเป็น Property หรือรายละเอียดของแต่ละส่วนฮะ ได้แก่
- Property – Job แสดงวันที่สร้าง เปลี่ยนแปลง job มีเลข version ด้วย
- Property – Context แสดงรายการตัวแปรที่มีใช้ใน job นั้นๆ ฮะ
- Property – Component แสดงการตั้งค่าของแต่ละ component ฮะ เปลี่ยนแปลงไปตาม component ที่เราเลือก
- Property – Run เอาไว้สั่งรันโปรแกรมที่เราออกแบบเอาไว้ฮะ
ลองมาทำโจทย์กัน
จากโจทย์ข้างบน คือ เรามีแฟ้มนึง ในแฟ้มนั้นมีไฟล์ CSV อยู่ 10 ไฟล์ แล้วทีนี้เราอยากจะรวมข้อมูลของทั้งสิบไฟล์นั้น มาเป็นไฟล์เดียวแล้ววางที่อีกแฟ้มนึง จะทำยังไงดี
จากโจทย์ เราจะลองมาเขียนขั้นตอนของโปรแกรมได้ทำนองนี้นะฮะ
ทีนี้ฮะ 1 component คือ 1 step นะฮะ จากรูปข้างบน แปลว่าเราต้องใช้อย่างน้อย 2 component ถูกมั้ยฮะ นั่นคือ component ใช้อ่านไฟล์สิบไฟล์ กับอีกตัวใช้เขียนไฟล์หนึ่งไฟล์
นี่ฮะ เราใช้ tFileInputDelimited
เพื่ออ่านไฟล์ CSV 1 ไฟล์กับ tFileOutputDelimited สำหรับเขียนไฟล์ CSV 1 ไฟล์ ฮะ
ต่อมาเราก็ต้องกำหนดให้สองตัวเนี่ยมันเชื่อมต่อกัน จะได้อ่านและเขียนข้อมูลเป็นเส้นเดียวกันฮะ เราก็คลิกขวา เลือก Row > Main
หมายความว่า ข้อมูลที่ออกมาจาก tFileInputDelimited
จะส่งไปยัง tFileOutputDelimited
แบบหนึ่งแถวต่อหนึ่งแถวเลยฮะ
เราได้ต้นทางหนึ่งไฟล์กับปลายทางหนึ่งไฟล์แล้วนะฮะ ต่อไปเราก็มาดูว่าต้องเปลี่ยนแปลงข้อมูลยังไงบ้าง โจทย์บอกว่าแค่รวมสิบไฟล์เป็นไฟล์เดียว ดังนั้นไม่ต้องแก้ไขอะไร แต่ยังไง พื้นฐานโปรแกรมนี้ เราต้องกำหนด Schema ฮะ สมมติว่าไฟล์เรามีสองคอลัมน์ ได้แก่ ชื่อ กับนามสกุลนะฮะ
กดสามจุดที่หลัง Edit schema แล้วจะมีอีกหน้าต่างโผล่ขึ้นมาฮะ แล้วกดเครื่องหมายบวก ใส่ข้อมูลดังนี้ฮะ
first_name
คอลัมน์แรกของไฟล์ฮะ เป็นชื่อ กำหนดเป็น String (ข้อความ)last_name
คอลัมน์ที่สอง เป็นนามสกุล กำหนดเป็น String เหมือนกันฮะ
อย่าลืมกำหนดให้เหมือนกันทั้งไฟล์ต้นทาง tFileInputDelimited
และไฟล์ปลายทาง tFileOutputDelimited
นะฮะ ไม่งั้นจะเกิด error (สามารถกดปุ่ม Sync column ได้นะฮะ)
หลังจากนั้น ให้ระบุชื่อไฟล์ลงไป เป็นแค่ไฟล์เดียวนะฮะ เพราะ component นี้ใช้อ่านไฟล์เพียงไฟล์เดียว ทีนี้ เราต้องการให้อ่านทั้งแฟ้มเลยนี่ ทำยังไง ก็ใช้อีกตัว คือ tFileList
ฮะ เอาไว้อ่านที่อยู่ของไฟล์ทุกอันที่อยู่ในแฟ้มที่ต้องการ
เราก็ระบุไปว่า ให้อ่านไฟล์จากแฟ้มไหนฮะ จากรูปข้างล่างคือ ผมสร้างไฟล์ CSV เตรียมเอาไว้ 10 ไฟล์เนอะ
จากนั้น เราก็เชื่อม tFileList
กับ tFileInputDelimited
ด้วย Row > Iterate
ฮะ เพราะเราต้องทยอยทำแต่ละรอบ (iteration) เพื่ออ่านแต่ละไฟล์ เอาข้อมูลนั้นไปเขียนที่ไฟล์ปลายทางฮะ
ตัว tFileList
จะเข้าไปอ่านว่ามีไฟล์อะไรบ้างในแฟ้มที่ตรงกับความต้องการของเรา แล้วพ่นออกมาในตัวแปรที่ชื่อ CURRENT_FILEPATH
ฮะ เราก็จะเอาตัวแปรนี้ไปกำหนดใน tFileInputDelimited
เพื่อให้มันอ่านไฟล์แต่ละไฟล์ฮะ (สามารถกดให้มันเด้ง autocomplete ออกมาได้นะฮะ) อ้อ อย่าลืมกำหนด Separator ของ tFileInputDelimited
เป็น comma ด้วยนะฮะ เพราะ CSV มักจะใช้ comma คั่นแต่ละค่าของข้อมูลฮะ
ด้วยความที่เราต้องการให้ข้อมูลสิบไฟล์ตั้งต้นของเรา ไหลไปเพิ่มที่ไฟล์ปลายทาง อย่าลืมกำหนด Append ที่ tFileOutputDelimited
นะฮะ ไม่งั้นมันจะเขียนทับไปเรื่อยๆ ทำให้ท้ายสุดจะมีแค่ข้อมูลไฟล์สุดท้ายของต้นทาง ที่อยู่ที่ไฟล์ปลายทางฮะ แล้วเราก็สามารถกำหนดให้มีหัวคอลัมน์ได้ด้วยการติ๊ก Include Header ฮะ
หลังจากนั้นเราก็กำหนดชื่อไฟล์ปลายทางให้เรียบร้อย แล้วมาลองรันโปรแกรมของเราดูฮะ กดที่ Tab: Run กดปุ่ม Run โปรแกรมก็ทำงานตามที่เราออกแบบไว้ดังรูปข้างล่างเลยฮะ
ได้ไฟล์สุดท้ายแบบนี้เลย
เสร็จแล้วฮะ ไม่ยากใช่มั้ยล่ะ ครั้งหน้าเราจะมาดูกันว่าจะทำยังไงให้โปรแกรมมันสามารถรันได้ตามเวลาที่กำหนดฮะ
บาย~