Schema-less JSON เป็นประเภท Apache Beam“ Row” หรือไม่
มีวิธีแปลงสตริง JSON ที่ไม่ใช้สคีมาโดยพลการเป็นประเภท "แถว" ของ Apache Beam โดยใช้ Java SDK หรือไม่ ถ้าไม่เป็นไปได้ที่จะได้รับประเภท Beam Schema จาก Object ที่มีอยู่หรือไม่?
ฉันพบเอกสารสำหรับJsonToRowและParseJsonsแต่พวกเขาต้องการคลาส Schema หรือ POJO เพื่อให้ทำงานได้ ฉันยังพบว่าคุณสามารถอ่านสตริง JSON ใน BigQuery TableRow ได้แต่ดูเหมือนจะไม่มีวิธีแปลง TableRow เป็น Row ที่ไม่เกี่ยวข้องกับการมีสคีมาอยู่แล้ว
คำตอบ
ไม่สิ่งนี้เป็นไปไม่ได้เนื่องจาก Row (และเฟรมเวิร์กที่ใช้) ต้องการทราบสคีมาในขณะก่อสร้าง ตัวเลือกคือในขณะก่อสร้างเพื่ออ่านข้อมูลส่วนเล็ก ๆ ของคุณเพื่อสรุปสคีมาของคุณและใช้สิ่งนี้เพื่อเรียกใช้การแปลง JsonToRow ของคุณ
น่าเสียดายที่คำตอบทั่วไปดูเหมือนจะเป็น "ไม่" แม้ว่าจะมีบางสถานการณ์ที่คำตอบอาจเป็น "ใช่"
ปัญหาคือ Schemas ไม่สามารถทำงานร่วมกับชนิดข้อมูล JSON ได้ 100% โดยเฉพาะเนื่องจากประเภทฟิลด์ARRAY
ใน JSON องค์ประกอบของรายการอาจมีประเภทข้อมูลที่แตกต่างกัน แต่ Schemas ใน Beam กำหนดให้แต่ละองค์ประกอบเป็น ARRAY เป็นประเภทเดียวกันประเภทนี้อาจเป็น ROW อื่นหรือแม้แต่ประเภทตรรกะก็ได้ แต่องค์ประกอบทั้งหมดต้องเหมือนกัน
น่าเสียดายที่การใช้ ROW เพื่อแทนที่ ARRAY ไม่ได้ผลทั้งหมด แม้ว่าเขตข้อมูล ROW จะเป็นตำแหน่ง แต่ก็มีการตั้งชื่อเช่นกันทำให้ใกล้กับ MAP มากขึ้น นอกจากนี้หากชุดข้อมูลของคุณมีรายการ JSON ที่มีความยาวต่างกันคุณจะพบว่าแต่ละแถวมี Schema ที่แตกต่างกันซึ่งจะมีผลที่ไม่พึงปรารถนา
ดังนั้นหากข้อมูล JSON ของคุณไม่ใช้รายการประเภทที่กำหนดเองคุณควรจะโอเค ที่กล่าวว่า Beam ไม่มียูทิลิตี้ใด ๆ สำหรับการรับสคีมาจาก JSON ดังนั้นคุณจะต้องสร้างโซลูชันนั้นด้วยตัวเอง
ฉันกำลังพบกับสถานการณ์ที่แน่นอนนี้ในที่ทำงานและฉันก็บอกทุกอย่างที่คุณพูดเกี่ยวกับตัวเลือกการประมวลผล JSON ที่ จำกัด แต่กลับกลายเป็นว่าบีมไม่ให้บางสิ่งบางอย่างที่สามารถแปลง BigQuery TableRow / TableSchema เพื่อ Beam แถว หากคุณเลือกสิ่งนั้นเป็นสคีมาและดำเนินการกับ JsonToRow คุณจะต้องเชื่อมความต้านทานของประเภทข้อมูลที่ไม่ตรงกันระหว่างประเภทข้อมูล JSON และ Beam ที่สร้างโดย BigQueryUtils.fromTableSchema (BYTES, DATETIME, ประเภทตรรกะที่สร้างโดย BigQueryUtils )