อะไรคือข้อดีของการเก็บข้อมูลคอลัมน์ซึ่งทำให้พวกเขาเหมาะสำหรับวิทยาศาสตร์ข้อมูลและการวิเคราะห์?
อะไรคือข้อดีของการเก็บข้อมูลคอลัมน์ซึ่งทำให้พวกเขาเหมาะสำหรับวิทยาศาสตร์ข้อมูลและการวิเคราะห์?
คำตอบ:
ฐานข้อมูลแบบ column-oriented (= columnar data-store) จัดเก็บข้อมูลของคอลัมน์ table ตามคอลัมน์บนดิสก์ในขณะที่ฐานข้อมูลแบบ row-oriented เก็บข้อมูลของแถวแบบแถวต่อแถว
มีข้อดีสองประการที่สำคัญของการใช้ฐานข้อมูลแบบคอลัมน์เมื่อเปรียบเทียบกับฐานข้อมูลแบบแถว ข้อได้เปรียบครั้งแรกเกี่ยวข้องกับปริมาณข้อมูลที่คนต้องการอ่านในกรณีที่เราดำเนินการกับคุณสมบัติเพียงไม่กี่อย่าง พิจารณาคำถามง่ายๆ:
SELECT correlation(feature2, feature5)
FROM records
ผู้ดำเนินการดั้งเดิมจะอ่านทั้งตาราง (เช่นคุณสมบัติทั้งหมด):
โดยใช้วิธีการตามคอลัมน์ของเราเราต้องอ่านคอลัมน์ที่สนใจ:
ข้อได้เปรียบที่สองซึ่งมีความสำคัญมากสำหรับฐานข้อมูลขนาดใหญ่ก็คือพื้นที่เก็บข้อมูลแบบคอลัมน์อนุญาตให้ทำการบีบอัดได้ดีกว่าเนื่องจากข้อมูลในคอลัมน์หนึ่งนั้นมีความเหมือนกันมากกว่าในทุกคอลัมน์
ข้อเสียเปรียบหลักของวิธีการเชิงคอลัมน์คือการจัดการ (ค้นหาอัปเดตหรือลบ) ทั้งแถวที่กำหนดไม่มีประสิทธิภาพ อย่างไรก็ตามสถานการณ์ควรเกิดขึ้นน้อยมากในฐานข้อมูลสำหรับการวิเคราะห์ ("คลังข้อมูล") ซึ่งหมายความว่าการดำเนินการส่วนใหญ่เป็นแบบอ่านอย่างเดียวไม่ค่อยอ่านคุณลักษณะจำนวนมากในตารางเดียวกันและการเขียนจะผนวกเข้าด้วยกันเท่านั้น
RDMS บางตัวมีตัวเลือกเครื่องมือจัดเก็บข้อมูลแบบคอลัมน์ ตัวอย่างเช่น PostgreSQL ไม่มีตัวเลือกในการจัดเก็บตารางในรูปแบบคอลัมน์ แต่กำเนิด Greenplum ได้สร้างแหล่งข้อมูลปิด (DBMS2, 2009) ที่น่าสนใจคือ Greenplum ยังอยู่หลังห้องสมุดโอเพ่นซอร์สสำหรับการวิเคราะห์ในฐานข้อมูลที่ปรับขนาดได้ MADlib (Hellerstein et al., 2012) ซึ่งไม่ใช่เรื่องบังเอิญ เมื่อเร็ว ๆ นี้ CitusDB การเริ่มต้นทำงานกับความเร็วสูงฐานข้อมูลการวิเคราะห์ได้เปิดตัวส่วนขยายเก็บคอลัมน์โอเพนซอร์สของตนเองสำหรับ PostgreSQL, CSTORE (มิลเลอร์, 2014) ระบบของ Google สำหรับการเรียนรู้เครื่องขนาดใหญ่ Sibyl ยังใช้รูปแบบข้อมูลเชิงคอลัมน์ (Chandra et al., 2010) แนวโน้มนี้สะท้อนให้เห็นถึงความสนใจที่เพิ่มขึ้นรอบ ๆ หน่วยเก็บข้อมูลเชิงคอลัมน์สำหรับการวิเคราะห์ขนาดใหญ่ Stonebraker และคณะ (2005) อภิปรายเพิ่มเติมเกี่ยวกับข้อดีของ DBMS เชิงคอลัมน์
กรณีใช้งานที่เป็นรูปธรรมสองกรณี: ชุดข้อมูลส่วนใหญ่สำหรับการเรียนรู้เครื่องขนาดใหญ่ถูกเก็บไว้อย่างไร
(คำตอบส่วนใหญ่มาจากภาคผนวก C ของ: BeatDB: แนวทางแบบครบวงจรเพื่อเปิดเผย saliencies จากชุดข้อมูลสัญญาณขนาดใหญ่ Franck Dernoncourt, SM, วิทยานิพนธ์, MIT Dept of EECS )
มันขึ้นอยู่กับสิ่งที่คุณทำ
การจัดเก็บคอลัมน์มีประโยชน์ที่สำคัญสองประการ:
อย่างไรก็ตามพวกเขาก็มีข้อเสีย:
การจัดเก็บคอลัมน์เป็นที่นิยมอย่างมากสำหรับ OLAP หรือที่รู้จักว่า "การวิเคราะห์โง่" (Michael Stonebraker) และแน่นอนสำหรับการดำเนินการล่วงหน้าซึ่งคุณอาจสนใจทิ้งคอลัมน์ทั้งหมด (แต่คุณต้องมีข้อมูลที่มีโครงสร้างก่อน - คุณไม่ต้องจัดเก็บ JSONs ในคอลัมน์ รูปแบบ) เนื่องจากรูปแบบคอลัมน์เป็นสิ่งที่ดีมากสำหรับการนับจำนวนแอปเปิ้ลที่คุณขายเมื่อสัปดาห์ที่แล้ว
สำหรับกรณีการใช้งานทางวิทยาศาสตร์ / วิทยาศาสตร์ส่วนใหญ่ฐานข้อมูลอาเรย์ดูเหมือนจะเป็นวิธีที่จะไป (แน่นอนว่าข้อมูลอินพุตที่ไม่มีโครงสร้าง) เช่น SciDB และ RasDaMan
ในหลายกรณี (เช่นการเรียนรู้ลึก) เมทริกซ์และอาร์เรย์เป็นชนิดข้อมูลที่คุณต้องการไม่ใช่คอลัมน์ MapReduce ฯลฯ ยังคงมีประโยชน์ในการประมวลผลล่วงหน้าแน่นอน อาจเป็นข้อมูลคอลัมน์ (แต่ฐานข้อมูลอาร์เรย์มักสนับสนุนการบีบอัดที่มีลักษณะเหมือนคอลัมน์เช่นกัน)
ฉันไม่ได้ใช้ฐานข้อมูลแบบเรียงเป็นแนว แต่ฉันใช้รูปแบบไฟล์เรียงเป็นแบบโอเพ่นซอร์สเรียกว่า Parquet และฉันคิดว่าประโยชน์อาจจะเหมือนกัน - การประมวลผลข้อมูลที่รวดเร็วยิ่งขึ้นเมื่อคุณต้องการสืบค้นชุดย่อยขนาดเล็ก จำนวนคอลัมน์ ฉันมีแบบสอบถามทำงานบนไฟล์ Avro ประมาณ 50 เทราไบต์ (รูปแบบไฟล์ที่มุ่งเน้นแถว) ด้วยคอลัมน์ 673 คอลัมน์ที่ใช้เวลาประมาณหนึ่งชั่วโมงครึ่งในคลัสเตอร์ Hadoop 140 โหนด ด้วย Parquet การค้นหาเดียวกันใช้เวลาประมาณ 22 นาทีเพราะฉันต้องการเพียง 5 คอลัมน์
หากคุณมีคอลัมน์จำนวนน้อยหรือใช้คอลัมน์จำนวนมากฉันไม่คิดว่าฐานข้อมูลคอลัมน์จะสร้างความแตกต่างได้มากเมื่อเทียบกับแถวที่มุ่งเน้นแถวเพราะคุณยังคงต้องสแกนข้อมูลทั้งหมดของคุณ ฉันเชื่อว่าฐานข้อมูล columnar จัดเก็บคอลัมน์แยกกันในขณะที่ฐานข้อมูลที่มุ่งเน้นแถวเก็บแถวแยกกัน การสืบค้นของคุณจะเร็วขึ้นทุกครั้งที่คุณสามารถอ่านข้อมูลจากดิสก์ได้น้อยลง
ลิงค์นี้จะอธิบายรายละเอียดเพิ่มเติม
หมายเหตุ: นี่คือคำถามของฉันและฉันขอบคุณจริงๆสำหรับคำตอบที่ยอดเยี่ยมที่นี่ซึ่งช่วยให้ฉันเข้าใจแนวคิด
ดังนั้นฉันจะอธิบายแนวคิดในแบบที่ฉันเข้าใจ:
โดยทั่วไปแล้วข้อมูลในฐานข้อมูลจะถูกเก็บไว้ในหน่วยความจำในรูปแบบต่อไปนี้:
พิจารณาข้อมูลนี้:
X1 X2
1 0.7091409 -1.4061361
2 -1.1334614 -0.1973846
3 2.3343391 -0.4385071
ในที่เก็บแถวสัมพันธ์จะถูกเก็บไว้ในลักษณะนี้:
1, 0.7091409, -1.4061361, 2, -1.1334614, -0.1973846, 3, 2.3343391, -0.4385071
ในรูปแบบของแถว
ในการจัดเก็บคอลัมน์มันจะถูกเก็บไว้เช่นนี้:
1, 2, 3, 0.7091409 ,-1.1334614, 2.3343391, -1.4061361, -0.1973846, -0.4385071
ในรูปแบบของคอลัมน์
ดังนั้นสิ่งนี้หมายความว่าอย่างไร
ซึ่งหมายความว่าการแทรก (และการอัปเดต) และการลบนั้นรวดเร็วในการจัดเก็บคอลัมน์ตามแถวเนื่องจากเป็นการลบค่าเพียงไม่กี่ค่าล่าสุดหรือค่าสองสามค่าแรก อย่างไรก็ตามไม่ใช่ในร้านค้าแบบเสาเนื่องจากต้องลบค่าในที่เก็บบล็อกแต่ละรายการ
อย่างไรก็ตามเมื่อมีความจำเป็นในการรวมคอลัมน์และการดำเนินการร้านค้าคอลัมน์มีขอบเหนือคู่ของพวกเขาแถวตามที่พวกเขาจะถูกเก็บไว้คอลัมน์ฉลาดและเป็นผลให้เข้าถึงแต่ละคอลัมน์เป็นเรื่องง่ายมาก