Table.FuzzyJoin ใช้สำหรับเชื่อม 2 ตารางเข้าด้วยกันโดยใช้คีย์ที่มีความคล้ายคลึงกัน (Fuzzy Matching) แทนที่จะต้องเหมือนกันทุกตัวอักษร สามารถกำหนดระดับความเหมือน (Threshold) และตัวเลือกอื่นๆ ได้
| อาร์กิวเมนต์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
| table1 | table | ตารางแรก (ซ้าย) ที่จะเชื่อม | |
| key1 | any | ชื่อคอลัมน์ที่ใช้เชื่อมจากตารางแรก สามารถเป็นข้อความเดียว (“ColName”) หรือลิสต์ ({“Col1”, “Col2”}) | |
| table2 | table | ตารางที่สอง (ขวา) ที่จะเชื่อม | |
| key2 | any | ชื่อคอลัมน์ที่ใช้เชื่อมจากตารางที่สอง ต้องมีจำนวนเท่ากับ key1 | |
| [joinKind]ไม่บังคับ | nullable number | JoinKind.Inner | ประเภท Join: JoinKind.Inner, JoinKind.LeftOuter, JoinKind.RightOuter, JoinKind.FullOuter, JoinKind.LeftAnti, JoinKind.RightAnti, JoinKind.LeftSemi, JoinKind.RightSemi |
| [joinOptions]ไม่บังคับ | nullable record | null (ค่า Default: Threshold=0.80, IgnoreCase=true, IgnoreSpace=true) | ตัวเลือก Fuzzy Matching ใน Record เช่น [IgnoreCase=true, IgnoreSpace=true, Threshold=0.8, SimilarityColumnName=”Score”] |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
Table.FuzzyJoin ใช้สำหรับเชื่อม 2 ตารางเข้าด้วยกันโดยใช้ Fuzzy Matching แทนที่จะหาตัวเลขหรือตัวอักษรที่เหมือนกันเป๊ะแป๊ะ (เหมือน Table.Join) ฟังก์ชันนี้ยอมรับความเหมือน แม้จะมีการสะกดผิด ตัวพิมพ์ต่างกัน หรือช่องว่างเกินมา ซึ่งช่วยได้มากเมื่อเชื่อมข้อมูลจากหลายแหล่งที่มีคุณภาพไม่เท่ากัน
วิธีการทำงานของ Fuzzy Matching คือการเปรียบเทียบความคล้ายคลึงของข้อความ (Similarity Score) บนระดับ 0.00 ถึง 1.00 โดย 1.00 หมายถึงเหมือนกันเป๊ะ ส่วน 0.00 หมายถึงไม่เหมือนเลย ค่า Threshold ที่กำหนด (ปกติ 0.80) คือค่าต่ำสุดที่จำเป็นต้องมีเพื่อนับว่าเป็นการ Match ที่ถูกต้อง
ส่วนตัวผม Table.FuzzyJoin มักใช้ในสถานการณ์เหล่านี้:
– เชื่อมข้อมูลจากสองระบบที่มีการสะกดชื่อลูกค้าไม่เสมอกัน
– จัดการกับข้อมูลจาก CSV ที่ยูเซอร์พิมพ์มือ (ผิดบ่อย!)
– เชื่อมรหัสหรือเลขประจำตัวที่อาจพิมพ์ผิดตัวเลข
แต่ก็ต้องระวังเรื่องปลอดภัย เพราะถ้า Threshold ต่ำเกินไป อาจจับคู่ข้อมูลผิดตัวได้ เช่น ‘John’ เข้ากับ ‘Joan’ 555.
ใช้เชื่อมข้อมูลสินค้าหรือลูกค้าที่ชื่อสะกดไม่เหมือนกันเป๊ะๆ ระหว่างสองระบบ
ช่วยให้การ Join ไม่ล้มเหลวเพียงเพราะมีตัวอักษรผิดพลาดเล็กน้อย
ใช้ IgnoreCase=true เพื่อให้ 'Bangkok' จับคู่กับ 'bangkok' ได้ ส่วน LeftOuter ให้แถวจาก Customers ทั้งหมดแม้ไม่จับคู่
Threshold=0.75 ยอมรับความเหมือนที่ 75% ขึ้นไป พอสำหรับจับการสะกดผิดเล็กน้อย IgnoreSpace=true ทำให้ 'Micro soft' ถูกมองเสมือน 'Microsoft'
SimilarityColumnName ใช้เพื่อเพิ่มคอลัมน์ที่แสดงคะแนนความเหมือนจริงๆ ช่วยให้ตรวจสอบการจับคู่ได้
เมื่อใช้ลิสต์หลายคอลัมน์ {"FirstName", "LastName"} ต้องจับคู่ทั้งคู่ถึงถือว่าเป็นการ Match
ขึ้นอยู่กับกรณีการใช้งาน: 0.90 ขึ้นไป = แม่นยำสูง ยอมรับเฉพาะการสะกดผิดเล็กน้อย | 0.80 = ค่า Default ที่สมดุล | 0.70 = ยืดหยุ่นมากขึ้น ยอมรับการสะกดผิดระดับกลาง | ต่ำกว่า 0.70 = ระวัง อาจจับคู่ผิด เช่น 'John' เข้ากับ 'Joan'
Table.Join ต้องการความเหมือนแบบ Exact (ตรงกันทุกตัว) ส่วน Table.FuzzyJoin ยอมรับความเหมือนแบบ Approximate (คล้ายๆกัน) ถ้าข้อมูลสะอาด Table.Join จะเร็วกว่า แต่ถ้ามีการสะกดผิดจำเป็นต้อง FuzzyJoin
เพิ่มคอลัมน์ใหม่ที่แสดงคะแนนความเหมือนจริงๆ (0.00-1.00) ช่วยให้ตรวจสอบว่า Match นั้นเชื่อถือได้แค่ไหน เช่น Match ที่ 0.95 น่าเชื่อ แต่ 0.71 ต้องสังสัย
รวมข้อความที่มีช่องว่างเกิน เช่น 'Micro soft' ถูกมองเป็น 'Microsoft' ใช้ได้ดีกับชื่อ ที่บางคนพิมพ์มีช่องว่างตรงกลาง แต่ต้องระวังกับสถานการณ์ที่ต้องรักษาช่องว่างไว้
ใช่ เพิ่ม ConcurrentRequests ให้สูงขึ้น (1-8) ทำให้การจับคู่ Fuzzy เร็วขึ้น โดยใช้หลาย thread พร้อมๆกัน เช่น ConcurrentRequests=4 จะเร็วขึ้นประมาณ 3 เท่า แต่ใช้ทรัพยากร CPU มากขึ้น
จำนวนแถวจาก table2 ที่จะจับคู่กับแถวเดียวจาก table1 ค่า Default คือ 1 (จับ 1 แถวต่อ 1 แถว) ถ้า=2 ได้ 2 แถวต่อ 1 แถว ก็จะเพิ่มแถวผลลัพธ์ไป
ระบุกฎการจับคู่ของภาษา เช่น Culture="ja-JP" สำหรับญี่ปุ่น, "th-TH" สำหรับไทย บางภาษามีกฎการเปรียบเทียบพิเศษ เช่น ตัวอักษรลากหาง ในไทย
ฟังก์ชันที่ผู้เขียนโยงไว้กับ Table.FuzzyJoin จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
Table.AddFuzzyClusterColumn เพิ่มคอลัมน์ใหม่ที่มีค่าตัวแทนสำหรับแต่ละกลุ่ม โดยจับคู่ข้อมูลที่คล้ายกัน แม้จะมีข้อความที่ต่างกัน เช่น การสะกด ตัวอักษรพิมพ์ใหญ่-เล็ก หรือช่องว่าง
Table.Join ใช้รวมตารางสองตารางโดยจับคู่ค่าในคอลัมน์กำหนด สนับสนุนทุกประเภท join (Inner, Left Outer, Right Outer, Full Outer, Anti, Semi) เหมือน SQL Join
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่