Da JSON senza schema ad Apache Beam tipo "Row"?
Esiste un modo per convertire stringhe JSON arbitrarie senza schema in tipi "Row" di Apache Beam utilizzando l'SDK Java? In caso contrario, è possibile derivare un tipo di Beam Schema da un oggetto esistente?
Ho trovato la documentazione per JsonToRow e ParseJsons , ma richiedono che sia fornita una classe Schema o POJO per funzionare. Ho anche scoperto che puoi leggere le stringhe JSON in una BigQuery TableRow ma non sembra esserci un modo per convertire TableRow in Row che non implichi già avere uno schema.
Risposte
No, questo non è possibile in quanto Row (e i framework che lo utilizzano) richiedono la conoscenza dello schema in fase di costruzione. Un'opzione è, in fase di costruzione, leggere una piccola parte dei dati per dedurre lo schema e utilizzarla per richiamare la trasformazione JsonToRow.
Sfortunatamente, la risposta generica sembra essere "no", anche se ci sono alcune situazioni specifiche in cui la risposta potrebbe essere "sì".
Il problema è che gli schemi non sono compatibili al 100% con i tipi di dati JSON, in particolare a causa del tipo di campo ARRAY .
In JSON, gli elementi di un elenco possono avere tipi di dati diversi, ma gli schemi in Beam richiedono che ogni elemento sia di un ARRAY dello stesso tipo. Questo tipo può essere un altro ROW o anche un tipo logico , ma tutti gli elementi devono essere uguali.
Sfortunatamente, l'utilizzo di una RIGA per sostituire un ARRAY non funziona del tutto. Sebbene i campi ROW siano posizionali, sono anche denominati, rendendoli più vicini a una MAP. Inoltre, se il tuo set di dati contiene elenchi JSON di lunghezze diverse, ti ritroverai con ogni riga con uno schema diverso che avrà conseguenze indesiderabili.
Quindi, se i tuoi dati JSON non utilizzano elenchi di tipi arbitrari, dovresti essere a posto. Detto questo, Beam non fornisce alcuna utilità per derivare schemi da JSON, quindi dovrai creare tu stesso quella soluzione.
Mi sto imbattendo in questa situazione esatta al lavoro e confermo tutto ciò che hai detto sulle opzioni di elaborazione JSON limitate. Si scopre che Beam fornisce qualcosa che può convertire un BigQuery TableRow/TableSchema in Beam Row/Schema . Se lo scegli come schema e procedi con JsonToRow, dovrai colmare la mancata corrispondenza dell'impedenza del tipo di dati tra i tipi di dati JSON e Beam prodotti da BigQueryUtils.fromTableSchema (BYTES, DATETIME, tipi logici generati da BigQueryUtils ).