Es ist möglich, nicht verschachtelte JSON-Dateien auf Cloud Storage mit Datenfluss über zu lesen:Lesen verschachtelte JSON in Google Dataflow/Apache Strahl
p.apply("read logfiles", TextIO.Read.from("gs://bucket/*").withCoder(TableRowJsonCoder.of()));
Wenn ich will nur diese Protokolle mit minimaler Filterung BigQuery schreiben was ich tun kann so durch eine DoFn wie diese verwenden:
private static class Formatter extends DoFn<TableRow,TableRow> {
@Override
public void processElement(ProcessContext c) throws Exception {
// .clone() since input is immutable
TableRow output = c.element().clone();
// remove misleading timestamp field
output.remove("@timestamp");
// set timestamp field by using the element's timestamp
output.set("timestamp", c.timestamp().toString());
c.output(output);
}
}
}
Allerdings weiß ich nicht, wie verschachtelte Felder in der JSON-Datei auf diese Weise zuzugreifen.
- Wenn der TableRow enthält ein
RECORD
r
genannt, ist es möglich, seine Schlüssel/Werte zuzugreifen, ohne weitere Serialisierung/Deserialisierung? - Wenn ich serialisiert müssen/deserialisieren dich mit der
Jackson
Bibliothek, macht es mehr Sinn machen, eine der Standard-Coder
vonTextIO.Read
stattTableRowJsonCoder
zu verwenden, einen Teil der Leistung zurück zu gewinnen, die ich auf diese Weise zu verlieren?
EDIT
Die Dateien sind neu-Linie begrenzt, und in etwa so aussehen:
{"@timestamp":"2015-x", "message":"bla", "r":{"analyzed":"blub", "query": {"where":"9999"}}}
{"@timestamp":"2015-x", "message":"blub", "r":{"analyzed":"bla", "query": {"where":"1111"}}}
Wie werden die Dateien formatiert? Sind sie durch Zeilenumbruch getrennt oder werden Zeilenumbrüche möglicherweise in einem der verschachtelten Datensätze angezeigt? –
Die Dateien sind durch Zeilenumbruch getrennt und ich erwarte keine Zeilenumbrüche in einem der verschachtelten Datensätze. Ich habe meine Frage bearbeitet, um ein Beispiel hinzuzufügen. – Tobi