JSON tanpa skema ke jenis "Row" Apache Beam?
Apakah ada cara untuk mengonversi string JSON tanpa skema arbitrer menjadi jenis "Row" Apache Beam menggunakan Java SDK? Jika tidak, apakah mungkin untuk mendapatkan tipe Beam Schema dari Object yang sudah ada?
Saya telah menemukan dokumentasi untuk JsonToRow dan ParseJsons , tetapi keduanya memerlukan kelas Schema atau POJO untuk disediakan agar dapat berfungsi. Saya juga menemukan bahwa Anda dapat membaca string JSON menjadi BigQuery TableRow tetapi tampaknya tidak ada cara untuk mengonversi TableRow menjadi Row yang tidak melibatkan sudah memiliki skema.
Jawaban
Tidak, ini tidak mungkin karena Row (dan kerangka kerja yang menggunakannya) perlu mengetahui skema pada waktu konstruksi. Opsi On adalah, pada waktu konstruksi, untuk membaca sebagian kecil data Anda untuk menyimpulkan skema Anda, dan menggunakannya untuk menjalankan transformasi JsonToRow Anda.
Sayangnya, jawaban umum tampaknya "tidak", meskipun ada beberapa situasi tertentu di mana jawabannya mungkin "ya".
Masalahnya adalah Skema tidak 100% kompatibel dengan tipe data JSON, khususnya karena tipe bidang ARRAY .
Di JSON, elemen daftar mungkin memiliki tipe data yang berbeda, tetapi Skema di Beam mengharuskan setiap elemen dari ARRAY menjadi tipe yang sama . Jenis ini dapat berupa ROW lain, atau bahkan jenis logika , tetapi semua elemen harus sama.
Sayangnya, menggunakan ROW untuk mengganti ARRAY tidak sepenuhnya berfungsi. Meskipun bidang ROW posisional, mereka juga dinamai, membuatnya lebih dekat ke MAP. Selain itu, jika kumpulan data Anda berisi daftar JSON dengan panjang yang berbeda, Anda akan mendapatkan setiap Baris yang memiliki Skema berbeda yang akan memiliki konsekuensi yang tidak diinginkan.
Jadi, jika data JSON Anda tidak menggunakan daftar jenis arbitrer, Anda akan baik-baik saja. Meskipun demikian, Beam tidak menyediakan utilitas apa pun untuk memperoleh skema dari JSON, jadi Anda harus membuat sendiri solusi itu.
Saya mengalami situasi persis seperti ini di tempat kerja, dan saya setuju dengan semua yang Anda katakan tentang opsi pemrosesan JSON yang terbatas. Ternyata Beam menyediakan sesuatu yang dapat mengonversi BigQuery TableRow / TableSchema menjadi Beam Row / Schema . Jika Anda memilihnya sebagai skema dan melanjutkan dengan JsonToRow, Anda harus menjembatani ketidakcocokan impedansi jenis data antara jenis data JSON dan Beam yang dihasilkan oleh BigQueryUtils.fromTableSchema (BYTES, DATETIME, jenis logika yang dihasilkan oleh BigQueryUtils ).