เจาะลึกไฟล์ JSONL: โครงสร้าง, กรณีการใช้งาน, และข้อดีหลัก

ไฟล์ JSONL จะเก็บค่า JSON ที่สมบูรณ์หนึ่งค่าต่อหนึ่งบรรทัด เอกสารอย่างเป็นทางการเรียกสิ่งนี้ว่า "รูปแบบข้อความ JSON Lines หรือเรียกอีกอย่างว่า JSON ที่คั่นด้วยการขึ้นบรรทัดใหม่" กฎข้อเดียวนั้นคือเหตุผลที่ทำให้มันสามารถสตรีมข้อมูลได้ดี ทนทานต่อการอ่านข้อมูลเพียงบางส่วน และเป็นเหตุผลว่าทำไมโปรแกรมสเปรดชีตจึงไม่สามารถเปิดไฟล์นี้ได้
ไฟล์ JSONL คืออะไร?
JSON Lines คือรูปแบบข้อความสำหรับบันทึกข้อมูล (records) ข้อกำหนดเฉพาะระบุว่ามันเป็น "รูปแบบที่สะดวกสำหรับการจัดเก็บข้อมูลที่มีโครงสร้าง ซึ่งอาจถูกประมวลผลทีละหนึ่งระเบียนข้อมูล"
เอกสารระบุไว้อย่างชัดเจนว่ามันเหมาะกับงานประเภทใด โดยระบุว่า "ทำงานได้ดีกับเครื่องมือประมวลผลข้อความสไตล์ unix และ shell pipelines" และในหน้าเอกสารยังเสริมอีกว่า "มันเป็นรูปแบบที่ยอดเยี่ยมสำหรับไฟล์บันทึกเหตุการณ์ (log files)" นอกจากนี้ยังได้รับการอธิบายว่าเป็น "รูปแบบที่ยืดหยุ่นสำหรับการส่งข้อความระหว่างกระบวนการที่ทำงานร่วมกัน"
จุดสำคัญคือความแตกต่างจาก JSON ทั่วไป อาร์เรย์ JSON ที่มีข้อมูลหนึ่งล้านระเบียนถือเป็นค่าเดียว ซึ่งโปรแกรมอ่านจะต้องประมวลผลทั้งหมดก่อนที่โครงสร้างจะสมบูรณ์ แต่ไฟล์ JSONL ที่มีข้อมูลหนึ่งล้านระเบียนจะมีค่าอยู่หนึ่งล้านค่า และแต่ละบรรทัดจะแยกเป็นอิสระต่อกัน
ยังมีข้อกำหนดเฉพาะอีกชุดหนึ่งที่เกี่ยวข้องอย่างใกล้ชิด ข้อกำหนดของ NDJSON ระบุไว้อย่างตรงไปตรงมาว่า "ปัจจุบันยังไม่มีมาตรฐานสำหรับการส่งผ่านอินสแตนซ์ของข้อความ JSON ภายในโปรโตคอลสตรีม" กรณีการใช้งานที่ระบุไว้คือ "การส่งมอบข้อความ JSON หลายอินสแตนซ์ผ่านโปรโตคอลสตรีมมิง เช่น TCP หรือ UNIX Pipes"
โครงสร้างของไฟล์ JSONL เป็นอย่างไร
ข้อกำหนดสามประการ
เอกสารของ JSON Lines ระบุข้อกำหนดไว้สามประการพอดี ประการแรกคือ การเข้ารหัสแบบ UTF-8 ซึ่งมีข้อควรระวังที่หยิบยืมมาจากมาตรฐาน JSON เองว่า "เช่นเดียวกับมาตรฐาน JSON จะต้องไม่มีเครื่องหมายระบุลำดับไบต์ (byte order mark หรือ U+FEFF) รวมอยู่ด้วย"
ประการที่สองคือ แต่ละบรรทัดต้องเป็นค่า JSON ที่ถูกต้อง ในหน้าเอกสารระบุว่า "ค่าที่พบบ่อยที่สุดจะเป็นออบเจกต์หรืออาร์เรย์ แต่ก็อนุญาตให้ใช้ค่า JSON ใดๆ ก็ได้" จากนั้นจึงระบุกรณีพิเศษที่มักทำให้คนสับสนว่า "null เป็นค่าที่ถูกต้อง แต่บรรทัดว่างนั้นไม่ใช่"
ประการที่สามคือ ตัวอักษรปิดท้ายบรรทัดคือ \n การขึ้นบรรทัดใหม่แบบ Windows ยังคงใช้งานได้ โดยเหตุผลทางเทคนิคที่ระบุไว้คือ "นั่นหมายความว่ารองรับ \r\n ด้วยเช่นกัน เนื่องจากช่องว่างโดยรอบจะถูกละเว้นโดยปริยายเมื่อทำการแยกวิเคราะห์ค่า JSON"
สิ่งที่ต้องไม่ปรากฏภายในบรรทัด
นี่คือข้อจำกัดที่ทำให้รูปแบบนี้ใช้งานได้จริง ข้อกำหนดเฉพาะของ NDJSON ระบุไว้เป็นข้อบังคับว่า "ข้อความ JSON ต้องไม่มีการขึ้นบรรทัดใหม่ (newlines) หรือการป้อนกลับปัดแคร่ (carriage returns)"
โดยปกติแล้ว ค่า JSON จะสามารถเขียนยาวหลายบรรทัดโดยมีการย่อหน้าได้ แต่ในไฟล์ที่คั่นด้วยบรรทัดจะไม่สามารถทำได้ เนื่องจากอักขระขึ้นบรรทัดใหม่ทำหน้าที่เป็นตัวคั่นระเบียนข้อมูล ทุกระเบียนจึงต้องถูกเขียนลงในบรรทัดจริงเพียงบรรทัดเดียวเท่านั้น
บรรทัดสุดท้าย และบรรทัดว่าง
มีรายละเอียดสองประการที่แตกต่างกันระหว่างข้อกำหนดทั้งสองชุด และทั้งสองประการนี้มีความสำคัญเมื่อไฟล์ถูกปฏิเสธการใช้งาน
ตัวอย่างเช่น การขึ้นบรรทัดใหม่ที่ท้ายไฟล์ JSON Lines ระบุว่า "แนะนำเป็นอย่างยิ่งให้ใส่อักขระปิดท้ายบรรทัดหลังค่า JSON ค่าสุดท้ายในไฟล์ แต่ไม่ได้บังคับ"
สำหรับบรรทัดว่าง ข้อกำหนดทั้งสองมีความเห็นไม่ตรงกัน JSON Lines จะเข้มงวดมาก โดยระบุว่าบรรทัดว่างไม่ใช่ค่าที่ถูกต้อง ส่วน NDJSON จะผ่อนปรนกว่า โดยอนุญาตว่า "ตัวแยกวิเคราะห์ (parser) อาจละเว้นบรรทัดว่างโดยไม่แจ้งเตือน" แต่กำหนดว่า "พฤติกรรมนี้ต้องได้รับการบันทึกไว้ในเอกสาร"
นามสกุลไฟล์และประเภทสื่อ (media types)
การตั้งชื่อก็แยกออกจากกันเช่นกัน JSON Lines ระบุว่าไฟล์ "อาจถูกบันทึกด้วยนามสกุลไฟล์ .jsonl" สำหรับประเภทสื่อระบุว่า "MIME type อาจเป็น application/jsonl แต่สิ่งนี้ยังไม่ได้มาตรฐาน" ส่วน NDJSON ระบุว่าประเภทสื่อ "ควรเป็น application/x-ndjson" และนามสกุลไฟล์ "ควรเป็น .ndjson"
สำหรับการบีบอัดข้อมูล JSON Lines แนะนำให้ใช้ตัวบีบอัดแบบสตรีม: "แนะนำให้ใช้ gzip หรือ bzip2 เพื่อประหยัดพื้นที่ ซึ่งจะได้ไฟล์เป็น .jsonl.gz หรือ .jsonl.bz2"
มีข้อตกลงเล็กๆ น้อยๆ ข้อหนึ่งที่ควรรู้เมื่อคุณอ่านข้อความแจ้งข้อผิดพลาด โปรแกรมแก้ไขข้อความ (text editors) จะเรียกบรรทัดแรกว่า "บรรทัดที่ 1" เอกสารได้ขยายความเรื่องนี้ว่า "ค่าแรกในไฟล์ JSON Lines ควรถูกเรียกว่า 'ค่าที่ 1' ด้วยเช่นกัน"
JSONL ใช้สำหรับอะไร
โดยทั่วไปคุณจะพบไฟล์ .jsonl ในหนึ่งในสี่สถานการณ์ต่อไปนี้
ไฟล์บันทึกเหตุการณ์และไฟล์เหตุการณ์ (Log and event files) เอกสารของรูปแบบนี้ระบุถึงไฟล์บันทึกเหตุการณ์โดยเฉพาะ และเหตุผลก็คือโปรแกรมเขียนข้อมูลสามารถเพิ่มข้อมูลทีละบรรทัดได้โดยไม่ต้องเขียนไฟล์ใหม่ทั้งหมด
การโหลดข้อมูลเข้าคลังข้อมูล (Warehouse loads) เอกสารประกอบของ BigQuery ของ Google เป็นตัวอย่างที่ดีของสถานะอย่างเป็นทางการของรูปแบบนี้ โดยรองรับการโหลด "ข้อมูล JSON ที่คั่นด้วยการขึ้นบรรทัดใหม่ (ndJSON) จาก Cloud Storage" และตัวเลือกรูปแบบไฟล์จะแสดงรายการเป็น "JSONL (Newline delimited JSON)"
การส่งออกข้อมูลระเบียนแบบซ้อนกัน (nested records) ผ่าน API ข้อมูลที่ไม่สามารถแปลงเป็นคอลัมน์แบนๆ ได้อย่างสมบูรณ์จะยังคงรักษาโครงสร้างแบบซ้อนกันไว้ในแต่ละบรรทัด รายการสั่งซื้อที่มีจำนวนสินค้าไม่เท่ากันในแต่ละครั้งคือกรณีตัวอย่างสุดคลาสสิก
ชุดข้อมูลสำหรับแมชชีนเลิร์นนิง (Machine learning datasets) ชุดข้อมูลสำหรับฝึกสอน (training) และประเมินผล (evaluation) มักจะถูกแจกจ่ายในรูปแบบนี้ เนื่องจากลูปการฝึกสอนจะอ่านระเบียนข้อมูลทีละรายการ
จุดร่วมที่สำคัญคือการสตรีมข้อมูล มันจึงกลายเป็นตัวเลือกที่ชัดเจนเมื่อไฟล์ถูกสร้างขึ้นทีละส่วนหรือถูกนำไปใช้งานทีละส่วน
JSONL เทียบกับ JSON เทียบกับ CSV
| JSONL | JSON | CSV | |
|---|---|---|---|
| หน่วยของไฟล์ | หนึ่งค่าต่อหนึ่งบรรทัด | หนึ่งค่าสำหรับทั้งไฟล์ | หนึ่งแถวต่อหนึ่งบรรทัด |
| ข้อมูลแบบซ้อนกัน (Nested) | มี, แยกตามระเบียน | มี | ไม่รองรับโดยตรง |
| การเพิ่มระเบียนข้อมูล | เพิ่มบรรทัดใหม่ | เขียนโครงสร้างหลักใหม่ทั้งหมด | เพิ่มแถวใหม่ |
| การอ่านข้อมูลบางส่วนมีประโยชน์ | ใช่ | ไม่ค่อยมีประโยชน์ | ใช่ |
| เปิดในโปรแกรมสเปรดชีตได้ | ไม่ได้ | ไม่ได้ | มักจะได้ |
| ระเบียนข้อมูลอาจมีรูปแบบต่างกันได้ | ได้ | ได้ | ไม่ได้, คอลัมน์ถูกกำหนดไว้ตายตัว |
| มนุษย์อ่านเข้าใจได้ในโปรแกรมแก้ไขข้อความ | ได้, บรรทัดยาวหนึ่งบรรทัดต่อหนึ่งระเบียน | ได้, เมื่อมีการย่อหน้า | ได้ |
แถวที่สร้างความประหลาดใจมากที่สุดคือแถวรองสุดท้าย บรรทัดสองบรรทัดในไฟล์ JSONL เดียวกันสามารถมีคีย์ที่แตกต่างกันได้ นั่นคือสิ่งที่ทำให้รูปแบบนี้มีความยืดหยุ่น และเป็นสาเหตุที่ทำให้การนำเข้าข้อมูลแบบทั่วไปส่งผลให้คอลัมน์ไม่เป็นระเบียบเรียบร้อย
สำหรับทางเลือกแบบไบนารีที่เน้นคอลัมน์ คำอธิบายเกี่ยวกับ Parquet จะครอบคลุมเนื้อหาเดียวกันจากฝั่งการจัดเก็บข้อมูล สำหรับกรณีตารางที่ง่ายที่สุด การเจาะลึก TSV จะครอบคลุมข้อความที่คั่นด้วยแท็บ
ข้อดีที่สำคัญ
การเขียนแบบเพิ่มต่อท้ายเท่านั้น (Append-only writing) ระเบียนข้อมูลใหม่คือบรรทัดใหม่ ไม่จำเป็นต้องแก้ไขข้อมูลใดๆ ก่อนหน้านั้นในไฟล์
การอ่านแบบสตรีมมิง (Streaming reads) ผู้ใช้งานสามารถประมวลผลระเบียนแรกได้ทันทีก่อนที่ระเบียนที่สองล้านจะถูกเขียนเสร็จ
ความทนทานต่อความเสียหาย (Failure tolerance) ไฟล์ที่ถูกตัดขาดกลางคันยังคงสามารถอ่านได้จนถึงบรรทัดสุดท้ายที่สมบูรณ์ ในขณะที่อาร์เรย์ JSON ที่ถูกตัดขาดมักจะไม่สามารถอ่านได้เลยทั้งหมด
คงโครงสร้างแบบซ้อนกันไว้ได้ (Nesting survives) โครงสร้างที่ CSV จำเป็นต้องแปลงให้แบนราบจะยังคงอยู่ครบถ้วนภายในแต่ละระเบียนข้อมูล
เป็นมิตรกับ Shell (Shell-friendly) เอกสารยกความดีความชอบให้กับการประมวลผลข้อความสไตล์ unix และ shell pipelines เนื่องจากไฟล์ที่เน้นการทำงานแบบทีละบรรทัดจะทำงานร่วมกับเครื่องมือที่เน้นการทำงานแบบทีละบรรทัดได้เป็นอย่างดี
การรองรับโดยคลังข้อมูล (Warehouse support) เอกสารของ BigQuery ระบุกฎที่บังคับใช้ว่า "ออบเจกต์ JSON แต่แต่ละรายการต้องอยู่แยกกันคนละบรรทัดในไฟล์"
ข้อจำกัดของ JSONL
รูปแบบนี้ช่วยแก้ปัญหาเรื่องการส่งผ่านข้อมูลและการเพิ่มข้อมูลต่อท้าย แต่ไม่ได้ช่วยตอบคำถามใดๆ ที่คุณมีเกี่ยวกับเนื้อหาภายในข้อมูลเลย
การบีบอัดข้อมูลเป็นการแลกเปลี่ยนที่ต้องพิจารณาอย่างรอบคอบ ไม่ใช่ได้มาฟรีๆ เอกสารของ BigQuery ระบุถึงผลกระทบอย่างตรงไปธรรมดาว่า "หากคุณใช้การบีบอัดแบบ gzip BigQuery จะไม่สามารถอ่านข้อมูลแบบขนานได้" และเสริมว่า "การโหลดข้อมูล JSON ที่บีบอัดเข้าสู่ BigQuery จะช้ากว่าการโหลดข้อมูลที่ไม่ได้บีบอัด" ในขณะที่หน้าเว็บของรูปแบบนี้เองแนะนำให้ใช้ gzip เพื่อประหยัดพื้นที่ ซึ่งทั้งสองข้อนี้เป็นความจริง และดึงไปในทิศทางที่ตรงกันข้ามกัน
นอกจากนี้ยังมีความเยิ่นเย้อ เนื่องจากทุกบรรทัดต้องทำซ้ำชื่อคีย์ทุกตัว ดังนั้นชุดระเบียนข้อมูลที่มีคีย์จำนวนมากจึงมีขนาดใหญ่กว่าข้อมูลเดียวกันที่จัดเก็บในรูปแบบคอลัมน์อย่างเห็นได้ชัด
และมันไม่ได้บอกอะไรเกี่ยวกับความสอดคล้องของข้อมูลเลย การอนุญาตให้ระเบียนข้อมูลมีรูปแบบที่แตกต่างกันได้ หมายความว่าฟิลด์หนึ่งอาจจะหายไปเฉยๆ ในช่วงครึ่งหลังของไฟล์โดยที่ไฟล์นั้นไม่ได้ผิดรูปแบบแต่อย่างใด
วิธีทำงานกับไฟล์ JSONL หากคุณไม่ใช่ผู้เขียนโปรแกรม
นี่คือช่องว่างในการใช้งานจริง เครื่องมือทางธุรกิจคาดหวังข้อมูลที่เป็นแถวและคอลัมน์ และไฟล์ .jsonl จะไม่สามารถเปิดได้เหมือนกับไฟล์ CSV
แนวทางที่ใช้ได้จริงคือขั้นตอนการแปลงข้อมูล ลองขอให้ผู้ที่สร้างไฟล์นี้ส่งไฟล์ CSV ที่แปลงเป็นตารางแบนราบหรือไฟล์ Excel ที่ดึงเฉพาะฟิลด์ที่คุณต้องการมาให้ หรือคุณจะแปลงให้แบนราบด้วยตัวเองโดยใช้เครื่องมือใดๆ ที่รองรับ JSON คุณจะสูญเสียโครงสร้างแบบซ้อนกันไป ซึ่งโดยปกติแล้วจะไม่สำคัญเมื่อคุณตัดสินใจได้แล้วว่าจะใช้ฟิลด์ใดในการวิเคราะห์
จากจุดนั้น การทำงานก็จะเป็นการวิเคราะห์ทั่วไป หน้าค่าบริการของ Powerdrill Bloom ระบุว่ารองรับการอัปโหลดไฟล์ Excel, CSV, PDF และเอกสารต่างๆ ดังนั้นข้อมูลที่ดึงออกมาและแปลงแบนราบแล้วจึงสามารถนำเข้าได้ทันที คุณสามารถถามคำถามด้วยภาษาธรรมชาติแทนที่จะต้องเขียนเป็นคิวรี CSV AI assistant จะช่วยดูแลในส่วนนี้ และ data connectors จะครอบคลุมกรณีที่การดึงข้อมูลจากแหล่งที่มาโดยตรงดีกว่าการส่งออกข้อมูลออกมา
ข้อแตกต่างที่ควรตระหนักคือ นี่คือการตัดสินใจเรื่องการส่งผ่านข้อมูลที่เกิดขึ้นก่อนจะถึงมือคุณ การแปลงไฟล์นี้ไปเป็นรูปแบบอื่นเมื่อไฟล์มาถึงโต๊ะทำงานของคุณจึงเป็นเรื่องปกติ ไม่ใช่การแก้ปัญหาเฉพาะหน้าแต่อย่างใด
บทสรุป
JSONL คือรูปแบบข้อความที่มีกฎเพียงข้อเดียว นั่นคือ หนึ่งค่า JSON ที่สมบูรณ์ต่อหนึ่งบรรทัด และห้ามมีการขึ้นบรรทัดใหม่ภายในค่านั้น กฎข้อนี้ช่วยให้สามารถเพิ่มข้อมูลต่อท้าย สตรีมข้อมูล และทนทานต่อการอ่านข้อมูลเพียงบางส่วน ซึ่งเป็นเหตุผลว่าทำไมไฟล์บันทึกเหตุการณ์และการโหลดข้อมูลเข้าคลังข้อมูลจึงเลือกใช้รูปแบบนี้เป็นค่าเริ่มต้น
สิ่งที่มันไม่ได้ให้มาคือตารางข้อมูล ทันทีที่ไฟล์นี้ไปถึงมือผู้ที่ต้องการคำตอบมากกว่าต้องการท่อส่งข้อมูล (pipeline) ขั้นตอนต่อไปที่มีประโยชน์คือการแปลงข้อมูลให้แบนราบและเริ่มตั้งคำถาม
หากนั่นคือสิ่งที่คุณกำลังเผชิญอยู่ ลองใช้ Powerdrill Bloom กับไฟล์ที่แปลงแล้ว และเริ่มต้นด้วย การเปลี่ยนข้อมูลให้เป็นแผนภูมิ
คำถามที่พบบ่อย
ไฟล์ JSONL ใช้สำหรับอะไร?
มันถูกใช้สำหรับสตรีมของระเบียนข้อมูล เช่น ไฟล์บันทึกเหตุการณ์, การส่งออกเหตุการณ์, การโหลดข้อมูลเข้าคลังข้อมูล และชุดข้อมูลสำหรับแมชชีนเลิร์นนิง เอกสารของรูปแบบนี้ระบุถึงไฟล์บันทึกเหตุการณ์และ shell pipelines โดยเฉพาะ ปัจจัยร่วมคือระเบียนข้อมูลจะถูกเขียนหรืออ่านทีละรายการ
JSONL กับ NDJSON แตกต่างกันอย่างไร?
ทั้งสองอธิบายแนวคิดเดียวกันด้วยเอกสารข้อกำหนดที่ต่างกัน JSON Lines จะใช้นามสกุลไฟล์ .jsonl และระบุว่า application/jsonl ยังไม่ได้มาตรฐาน ส่วน NDJSON จะระบุเป็น .ndjson และ application/x-ndjson และอนุญาตให้ตัวแยกวิเคราะห์ละเว้นบรรทัดว่างได้
ฉันสามารถเปิดไฟล์ JSONL ใน Excel ได้หรือไม่?
ไม่สามารถเปิดได้ด้วยการดับเบิลคลิก เนื่องจากแต่ละบรรทัดเป็นค่า JSON ไม่ใช่แถวของเซลล์ วิธีการทั่วไปคือการแปลงฟิลด์ที่คุณต้องการให้แบนราบเป็น CSV หรือ Excel ก่อน หรือใช้เครื่องมือที่สามารถอ่านรูปแบบนี้ได้โดยตรง
ทำไมระเบียนข้อมูลใน JSONL ถึงไม่สามารถเขียนยาวหลายบรรทัดได้?
เนื่องจากอักขระขึ้นบรรทัดใหม่ทำหน้าที่เป็นตัวคั่นระเบียนข้อมูล ข้อกำหนดเฉพาะของ NDJSON ระบุว่า "ข้อความ JSON ต้องไม่มีการขึ้นบรรทัดใหม่หรือการป้อนกลับปัดแคร่" ดังนั้น JSON ที่จัดรูปแบบให้อ่านง่าย (pretty-printed) จึงต้องถูกบีบอัดให้อยู่ในบรรทัดเดียวต่อหนึ่งระเบียน
อนุญาตให้มีบรรทัดว่างในไฟล์ JSONL หรือไม่?
ข้อกำหนดทั้งสองชุดมีความแตกต่างกัน JSON Lines ระบุว่า "null เป็นค่าที่ถูกต้อง แต่บรรทัดว่างนั้นไม่ใช่" ส่วน NDJSON อนุญาตให้ตัวแยกวิเคราะห์ละเว้นบรรทัดว่างได้โดยไม่แจ้งเตือน โดยมีเงื่อนไขว่าต้องมีการบันทึกพฤติกรรมดังกล่าวไว้ในเอกสาร