ดำดิ่งสู่ทะเลสาบเดลต้า: การบังคับใช้สคีมาและวิวัฒนาการ

เฮ้ ฮับ! ฉันขอเสนอการแปลบทความให้คุณทราบ "ดำดิ่งสู่ทะเลสาบเดลต้า: การบังคับใช้สคีมาและวิวัฒนาการ" ผู้เขียน Burak Yavuz, Brenner Heintz และ Denny Lee ซึ่งจัดทำขึ้นเพื่อรอการเริ่มต้นของหลักสูตร วิศวกรข้อมูล จาก OTUS

ดำดิ่งสู่ทะเลสาบเดลต้า: การบังคับใช้สคีมาและวิวัฒนาการ

ข้อมูลเช่นเดียวกับประสบการณ์ของเรา มีการสะสมและพัฒนาอย่างต่อเนื่อง เพื่อให้ตามทัน แบบจำลองทางจิตของโลกต้องปรับให้เข้ากับข้อมูลใหม่ ซึ่งบางส่วนมีมิติใหม่ วิธีใหม่ๆ ในการสังเกตสิ่งที่เราไม่เคยรู้มาก่อน แบบจำลองทางจิตเหล่านี้ไม่แตกต่างจากแบบแผนตารางที่กำหนดวิธีที่เราจัดหมวดหมู่และประมวลผลข้อมูลใหม่

สิ่งนี้นำเราไปสู่ปัญหาของการจัดการสคีมา เนื่องจากวัตถุประสงค์และข้อกำหนดทางธุรกิจเปลี่ยนแปลงไปตามกาลเวลา โครงสร้างข้อมูลของคุณก็เช่นกัน Delta Lake ทำให้ง่ายต่อการใช้การวัดใหม่เมื่อมีการเปลี่ยนแปลงข้อมูล ผู้ใช้สามารถเข้าถึงความหมายอย่างง่ายเพื่อจัดการสคีมาของตาราง เครื่องมือเหล่านี้ประกอบด้วย Schema Enforcement ซึ่งปกป้องผู้ใช้จากการทำให้ตารางเสียหายโดยไม่ได้ตั้งใจด้วยข้อผิดพลาดหรือข้อมูลที่ไม่จำเป็น และ Schema Evolution ซึ่งอนุญาตให้เพิ่มคอลัมน์ใหม่ของข้อมูลที่มีค่าโดยอัตโนมัติในตำแหน่งที่เหมาะสม ในบทความนี้เราจะเจาะลึกการใช้เครื่องมือเหล่านี้

ทำความเข้าใจเกี่ยวกับสคีมาของตาราง

DataFrame แต่ละรายการใน Apache Spark มีสคีมาที่กำหนดรูปร่างของข้อมูล เช่น ชนิดข้อมูล คอลัมน์ และข้อมูลเมตา ด้วย Delta Lake สคีมาของตารางจะถูกจัดเก็บในรูปแบบ JSON ภายในบันทึกธุรกรรม

การบังคับใช้สคีมาคืออะไร?

Schema Enforcement หรือที่เรียกว่า Schema Validation เป็นกลไกการป้องกันใน Delta Lake ที่รับประกันคุณภาพของข้อมูลโดยการปฏิเสธระเบียนที่ไม่ตรงกับ Schema ตาราง เช่นเดียวกับพนักงานต้อนรับที่แผนกต้อนรับของร้านอาหารยอดนิยมที่รับเฉพาะการจองเท่านั้น เขาตรวจสอบว่าแต่ละคอลัมน์ของข้อมูลที่ป้อนลงในตารางอยู่ในรายการคอลัมน์ที่คาดไว้หรือไม่ (กล่าวอีกนัยหนึ่ง หากมี "การจอง" สำหรับ แต่ละรายการ) และปฏิเสธรายการที่มีคอลัมน์ไม่อยู่ในรายการ

การบังคับใช้สคีมาทำงานอย่างไร

Delta Lake ใช้การตรวจสอบความถูกต้องของสคีมาในการเขียน ซึ่งหมายความว่าการเขียนใหม่ทั้งหมดลงในตารางจะได้รับการตรวจสอบความเข้ากันได้กับสคีมาของตารางเป้าหมายในขณะเขียน หากสคีมาไม่สอดคล้องกัน Delta Lake จะย้อนกลับธุรกรรมทั้งหมด (ไม่มีการเขียนข้อมูล) และส่งข้อยกเว้นเพื่อแจ้งให้ผู้ใช้ทราบถึงความไม่สอดคล้องกัน
Delta Lake ใช้กฎต่อไปนี้เพื่อพิจารณาว่าระเบียนเข้ากันได้กับตารางหรือไม่ DataFrame ที่เขียน:

  • ไม่สามารถมีคอลัมน์เพิ่มเติมที่ไม่อยู่ในสคีมาของตารางเป้าหมาย ในทางกลับกัน ทุกอย่างปกติดีหากข้อมูลขาเข้าไม่มีคอลัมน์ทั้งหมดจากตาราง - คอลัมน์เหล่านี้จะได้รับการกำหนดค่าเป็นศูนย์
  • ไม่สามารถมีชนิดข้อมูลคอลัมน์ที่แตกต่างจากชนิดข้อมูลคอลัมน์ในตารางเป้าหมาย หากคอลัมน์ในตารางเป้าหมายมีข้อมูล StringType แต่คอลัมน์ที่เกี่ยวข้องใน DataFrame มีข้อมูล IntegerType การบังคับใช้สคีมาจะส่งข้อยกเว้นและป้องกันไม่ให้การดำเนินการเขียนเกิดขึ้น
  • ไม่สามารถมีชื่อคอลัมน์ที่แตกต่างกันเฉพาะในกรณี ซึ่งหมายความว่าคุณไม่สามารถกำหนดคอลัมน์ชื่อ 'Foo' และ 'foo' ในตารางเดียวกันได้ ในขณะที่ Spark สามารถใช้ในโหมดคำนึงถึงตัวพิมพ์เล็กหรือใหญ่ (ค่าเริ่มต้น) ได้ แต่ Delta Lake จะรักษาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่แต่จะไม่คำนึงถึงตัวพิมพ์เล็กภายในที่จัดเก็บสคีมา Parquet คำนึงถึงขนาดตัวพิมพ์เมื่อจัดเก็บและส่งคืนข้อมูลคอลัมน์ เพื่อหลีกเลี่ยงข้อผิดพลาดที่อาจเกิดขึ้น ข้อมูลเสียหายหรือข้อมูลสูญหาย (ซึ่งเราพบเป็นการส่วนตัวใน Databricks) เราจึงตัดสินใจเพิ่มข้อจำกัดนี้

เพื่อแสดงสิ่งนี้ ลองมาดูว่าเกิดอะไรขึ้นในโค้ดด้านล่างเมื่อพยายามเพิ่มคอลัมน์ที่สร้างขึ้นใหม่บางคอลัมน์ลงในตาราง Delta Lake ที่ยังไม่ได้กำหนดค่าให้ยอมรับ

# Сгенерируем DataFrame ссуд, который мы добавим в нашу таблицу Delta Lake
loans = sql("""
            SELECT addr_state, CAST(rand(10)*count as bigint) AS count,
            CAST(rand(10) * 10000 * count AS double) AS amount
            FROM loan_by_state_delta
            """)

# Вывести исходную схему DataFrame
original_loans.printSchema()

root
  |-- addr_state: string (nullable = true)
  |-- count: integer (nullable = true)
 
# Вывести новую схему DataFrame
loans.printSchema()
 
root
  |-- addr_state: string (nullable = true)
  |-- count: integer (nullable = true)
  |-- amount: double (nullable = true) # new column
 
# Попытка добавить новый DataFrame (с новым столбцом) в существующую таблицу
loans.write.format("delta") 
           .mode("append") 
           .save(DELTALAKE_PATH)

Returns:

A schema mismatch detected when writing to the Delta table.
 
To enable schema migration, please set:
'.option("mergeSchema", "true")'
 
Table schema:
root
-- addr_state: string (nullable = true)
-- count: long (nullable = true)
 
Data schema:
root
-- addr_state: string (nullable = true)
-- count: long (nullable = true)
-- amount: double (nullable = true)
 
If Table ACLs are enabled, these options will be ignored. Please use the ALTER TABLE command for changing the schema.

แทนที่จะเพิ่มคอลัมน์ใหม่โดยอัตโนมัติ Delta Lake จะบังคับใช้สคีมาและหยุดการบันทึก เพื่อช่วยในการพิจารณาว่าคอลัมน์ใด (หรือชุดของคอลัมน์) ทำให้เกิดความไม่ตรงกัน Spark จะแสดงสกีมาทั้งสองจากสแต็กการติดตามเพื่อเปรียบเทียบ

ประโยชน์ของการบังคับใช้สคีมาคืออะไร?

เนื่องจากการบังคับใช้สคีมานั้นเป็นการตรวจสอบที่ค่อนข้างเข้มงวด จึงเป็นเครื่องมือที่ยอดเยี่ยมในการใช้เป็นผู้ดูแลชุดข้อมูลที่สะอาดและถูกแปลงอย่างสมบูรณ์ซึ่งพร้อมที่จะผลิตหรือใช้งาน โดยทั่วไปใช้กับตารางที่ป้อนข้อมูลโดยตรง:

  • อัลกอริทึมการเรียนรู้ของเครื่อง
  • แดชบอร์ด BI
  • เครื่องมือวิเคราะห์ข้อมูลและการแสดงภาพ
  • ระบบการผลิตใดๆ ก็ตามที่ต้องการ semantic schema ที่มีโครงสร้างสูงและพิมพ์อย่างรัดกุม

เพื่อเตรียมข้อมูลสำหรับอุปสรรคสุดท้ายนี้ ผู้ใช้หลายคนใช้สถาปัตยกรรมแบบ "มัลติ-ฮอป" แบบง่ายๆ ที่ค่อยๆ แนะนำโครงสร้างลงในตารางของตน หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้ คุณสามารถอ่านบทความได้ แมชชีนเลิร์นนิงระดับการผลิตด้วย Delta Lake

แน่นอนว่า การบังคับใช้สคีมาสามารถใช้ได้ทุกที่ในไปป์ไลน์ของคุณ แต่โปรดจำไว้ว่าการเขียนสตรีมไปยังตารางอาจทำให้คุณหงุดหงิดในกรณีนี้ เพราะตัวอย่างเช่น คุณลืมว่าคุณได้เพิ่มคอลัมน์อื่นลงในข้อมูลขาเข้า

การป้องกันการทำให้ข้อมูลบางลง

ถึงตรงนี้ คุณอาจสงสัยว่าทำไมต้องโฆษณา? ท้ายที่สุดแล้ว บางครั้งข้อผิดพลาด "schema mismatch" ที่ไม่คาดคิดอาจทำให้คุณสะดุดเวิร์กโฟลว์ โดยเฉพาะอย่างยิ่งหากคุณยังใหม่กับ Delta Lake ทำไมไม่ปล่อยให้สคีมาเปลี่ยนแปลงตามต้องการ เพื่อที่ฉันจะได้เขียน DataFrame ได้ไม่ว่าจะเกิดอะไรขึ้น

ดังสุภาษิตโบราณที่ว่า "การป้องกันหนึ่งออนซ์มีค่าเท่ากับหนึ่งปอนด์ของการรักษา" ในบางจุด หากคุณไม่ดูแลบังคับใช้สคีมาของคุณ ปัญหาความเข้ากันได้ของประเภทข้อมูลจะตามมาทีหลัง แหล่งข้อมูลดิบที่ดูเหมือนเป็นเนื้อเดียวกันอาจมีกรณีขอบ คอลัมน์ที่เสียหาย การแมปที่ผิดรูปแบบ หรือสิ่งที่น่ากลัวอื่นๆ ที่คุณฝันถึง . ในฝันร้าย. แนวทางที่ดีที่สุดคือการหยุดศัตรูเหล่านี้ที่ประตู - ด้วยการบังคับใช้สคีมา - และจัดการกับพวกมันในที่สว่าง ไม่ใช่ในภายหลังเมื่อพวกเขาเริ่มสอดแนมส่วนลึกที่มืดมนของรหัสการผลิตของคุณ

การบังคับใช้สคีมาช่วยให้คุณมั่นใจได้ว่าสคีมาของตารางของคุณจะไม่เปลี่ยนแปลง เว้นแต่คุณจะยืนยันการเปลี่ยนแปลงด้วยตนเอง วิธีนี้จะป้องกันการเจือจางของข้อมูลที่อาจเกิดขึ้นเมื่อมีการเพิ่มคอลัมน์ใหม่บ่อยครั้งจนตารางบีบอัดที่มีค่าก่อนหน้านี้สูญเสียคุณค่าและประโยชน์เนื่องจากข้อมูลท่วมท้น การสนับสนุนให้คุณมีความตั้งใจ ตั้งมาตรฐานระดับสูง และคาดหวังคุณภาพระดับสูง การบังคับใช้สคีมาจะทำในสิ่งที่ได้รับการออกแบบมาอย่างแน่นอน—ช่วยให้คุณมีสติสัมปชัญญะและรักษาสเปรดชีตของคุณให้สะอาดอยู่เสมอ

หากเมื่อพิจารณาต่อไปแล้วท่านตัดสินใจว่าท่านจริงๆ จำเป็น เพิ่มคอลัมน์ใหม่ - ไม่มีปัญหา ด้านล่างคือการแก้ไขหนึ่งบรรทัด ทางออกคือวิวัฒนาการของวงจร!

วิวัฒนาการสคีมาคืออะไร?

วิวัฒนาการของสคีมาเป็นคุณสมบัติที่ช่วยให้ผู้ใช้สามารถเปลี่ยนสคีมาปัจจุบันของตารางได้อย่างง่ายดายเพื่อให้ตรงกับข้อมูลที่เปลี่ยนแปลงเมื่อเวลาผ่านไป โดยทั่วไปจะใช้เมื่อดำเนินการเพิ่มหรือเขียนทับเพื่อปรับสคีมาโดยอัตโนมัติเพื่อรวมคอลัมน์ใหม่ตั้งแต่หนึ่งคอลัมน์ขึ้นไป

วิวัฒนาการสคีมาทำงานอย่างไร

ตามตัวอย่างในส่วนก่อนหน้านี้ นักพัฒนาสามารถใช้การวิวัฒนาการของสคีมาเพื่อเพิ่มคอลัมน์ใหม่ที่เคยถูกปฏิเสธเนื่องจากความไม่สอดคล้องกันของสคีมาได้อย่างง่ายดาย วิวัฒนาการวงจรเปิดใช้งานโดยการเพิ่ม .option('mergeSchema', 'true') ถึงทีม Spark ของคุณ .write или .writeStream.

# Добавьте параметр mergeSchema
loans.write.format("delta") 
           .option("mergeSchema", "true") 
           .mode("append") 
           .save(DELTALAKE_SILVER_PATH)

หากต้องการดูกราฟ ให้เรียกใช้แบบสอบถาม Spark SQL ต่อไปนี้

# Создайте график с новым столбцом, чтобы подтвердить, что запись прошла успешно
%sql
SELECT addr_state, sum(`amount`) AS amount
FROM loan_by_state_delta
GROUP BY addr_state
ORDER BY sum(`amount`)
DESC LIMIT 10

ดำดิ่งสู่ทะเลสาบเดลต้า: การบังคับใช้สคีมาและวิวัฒนาการ
หรือคุณสามารถตั้งค่าตัวเลือกนี้สำหรับเซสชัน Spark ทั้งหมดได้โดยเพิ่ม spark.databricks.delta.schema.autoMerge = True ไปที่การกำหนดค่า Spark แต่ใช้สิ่งนี้ด้วยความระมัดระวัง เนื่องจากการบังคับใช้สคีมาจะไม่เตือนคุณเกี่ยวกับความไม่สอดคล้องของสคีมาโดยไม่ได้ตั้งใจอีกต่อไป

โดยรวมพารามิเตอร์ในคำขอ mergeSchemaคอลัมน์ทั้งหมดที่มีอยู่ใน DataFrame แต่ไม่มีอยู่ในตารางเป้าหมายจะถูกเพิ่มโดยอัตโนมัติที่ส่วนท้ายของสคีมาซึ่งเป็นส่วนหนึ่งของธุรกรรมการเขียน นอกจากนี้ยังสามารถเพิ่มฟิลด์ที่ซ้อนกันได้ และฟิลด์เหล่านี้จะถูกเพิ่มที่ส่วนท้ายของคอลัมน์โครงสร้างที่สอดคล้องกัน

วิศวกรวันที่และนักวิทยาศาสตร์ข้อมูลสามารถใช้ตัวเลือกนี้เพื่อเพิ่มคอลัมน์ใหม่ (อาจเป็นเมตริกที่เพิ่งติดตามหรือคอลัมน์ตัวเลขยอดขายของเดือนนี้) ลงในตารางการผลิตแมชชีนเลิร์นนิงที่มีอยู่โดยไม่ทำลายโมเดลที่มีอยู่ตามคอลัมน์เก่า

ประเภทของการเปลี่ยนแปลงสคีมาต่อไปนี้ได้รับอนุญาตให้เป็นส่วนหนึ่งของวิวัฒนาการสคีมาในขณะที่เพิ่มหรือเขียนทับตาราง:

  • การเพิ่มคอลัมน์ใหม่ (นี่เป็นสถานการณ์ที่พบบ่อยที่สุด)
  • การเปลี่ยนประเภทข้อมูลจาก NullType -> ประเภทอื่นหรือการส่งเสริมการขายจาก ByteType -> ShortType -> IntegerType

การเปลี่ยนแปลงอื่นๆ ที่ไม่ได้รับอนุญาตให้เป็นส่วนหนึ่งของวิวัฒนาการสคีมากำหนดให้มีการเขียนทับสคีมาและข้อมูลโดยการเพิ่ม .option("overwriteSchema", "true"). ตัวอย่างเช่น ในกรณีที่เดิมทีคอลัมน์ "Foo" เป็นจำนวนเต็มและสคีมาใหม่จะเป็นประเภทข้อมูลสตริง ดังนั้นไฟล์ Parquet(data) ทั้งหมดจะต้องถูกเขียนทับ การเปลี่ยนแปลงเหล่านี้รวมถึง:

  • การลบคอลัมน์
  • การเปลี่ยนประเภทข้อมูลของคอลัมน์ที่มีอยู่ (แทนที่)
  • การเปลี่ยนชื่อคอลัมน์ที่แตกต่างกันเฉพาะกรณี (เช่น "Foo" และ "foo")

ในที่สุด ด้วย Spark 3.0 รุ่นถัดไป DDL ที่ชัดเจน (โดยใช้ ALTER TABLE) จะได้รับการสนับสนุนอย่างสมบูรณ์ ทำให้ผู้ใช้สามารถดำเนินการต่อไปนี้บนสคีมาตาราง:

  • การเพิ่มคอลัมน์
  • เปลี่ยนความคิดเห็นของคอลัมน์
  • การตั้งค่าคุณสมบัติของตารางที่กำหนดลักษณะการทำงานของตาราง เช่น การตั้งค่าระยะเวลาการเก็บบันทึกธุรกรรม

ประโยชน์ของวิวัฒนาการสคีมาคืออะไร?

วิวัฒนาการแบบแผนสามารถใช้ได้ทุกเมื่อ ตั้งใจ เปลี่ยนสคีมาของตารางของคุณ (ตรงข้ามกับเมื่อคุณเพิ่มคอลัมน์ที่ไม่ควรมีลงใน DataFrame โดยไม่ได้ตั้งใจ) นี่เป็นวิธีที่ง่ายที่สุดในการย้ายสคีมาของคุณ เนื่องจากจะเพิ่มชื่อคอลัมน์และประเภทข้อมูลที่ถูกต้องโดยอัตโนมัติโดยไม่ต้องประกาศอย่างชัดเจน

ข้อสรุป

การบังคับใช้สคีมาจะปฏิเสธคอลัมน์ใหม่หรือการเปลี่ยนแปลงสคีมาอื่นๆ ที่ไม่เข้ากันกับตารางของคุณ ด้วยการกำหนดและรักษามาตรฐานระดับสูงเหล่านี้ นักวิเคราะห์และวิศวกรสามารถวางใจได้ว่าข้อมูลของตนมีความสมบูรณ์ในระดับสูงสุด โดยให้เหตุผลอย่างชัดเจนและรัดกุม ช่วยให้ตัดสินใจทางธุรกิจได้ดีขึ้น

ในทางกลับกัน วิวัฒนาการของสคีมาช่วยเสริมการบังคับใช้โดยการลดความซับซ้อน ที่ควร การเปลี่ยนแปลงสคีมาโดยอัตโนมัติ ท้ายที่สุด การเพิ่มคอลัมน์ก็ไม่ใช่เรื่องยาก

การบังคับใช้สคีมาเป็นหยาง โดยที่สคีมาวิวัฒนาการเป็นหยิน เมื่อใช้ร่วมกัน คุณสมบัติเหล่านี้จะทำให้การลดสัญญาณรบกวนและการปรับแต่งสัญญาณทำได้ง่ายกว่าที่เคย

เราขอขอบคุณ Mukul Murthy และ Pranav Anand สำหรับการมีส่วนร่วมในบทความนี้

บทความอื่นๆ ในชุดนี้:

ดำดิ่งสู่ Delta Lake: เปิดบันทึกธุรกรรม

บทความที่เกี่ยวข้อง

แมชชีนเลิร์นนิงระดับการผลิตด้วย Delta Lake

ทะเลสาบข้อมูลคืออะไร

เรียนรู้เพิ่มเติมเกี่ยวกับหลักสูตร

ที่มา: will.com

เพิ่มความคิดเห็น