2016-11-07 1 views
0

Ich habe eine BigQuery-Tabelle, wobei jede Zeile eine Textdatei (gs: // ...) und eine Zeilennummer darstellt.Dateinamen aus PCollection extrahieren und effizient analysieren

file, line, meta 
file1.txt, 10, meta1 
file2.txt, 12, meta2 
file1.txt, 198, meta3 

Jede Datei ist etwa 1,5 GB und es gibt etwa 1k Dateien in meinem Eimer. Mein Ziel ist das Extrahieren von Zeilen, die in der BQ-Tabelle angegeben sind.

habe ich beschlossen, den folgenden Plan zu implementieren:

  1. Map table =>KV<file,line>
  2. reduzieren KV<file,line> =>KV<file, [lines]>
  3. Map KV<file, [lines]> =>[KV<file, rowData>]

wo rowData tatsächlichen Zahlen bedeutet von file auf die einige Linie von lines.

Wenn ich Dokumente und SO sorgfältig lese, sollte TextIO.Read nicht in solchen Bedingungen verwendet werden. Als Workaround kann ich GcsIoChannelFactory verwenden, um Dateien von GCS zu lesen. Ist es richtig? Ist es ein bevorzugter Ansatz für die beschriebene Aufgabe?

Antwort

0

Ja, Ihre Vorgehensweise ist korrekt. Es gibt derzeit keinen besseren Ansatz zum Lesen von Zeilen mit Zeilennummern aus Textdateien, mit Ausnahme von GcsIoChannelFactory (oder Schreiben einer benutzerdefinierten FileBasedSource, aber das ist komplexer und würde in Ihrem Fall nicht funktionieren, da die Dateinamen nicht bekannt sind im Voraus).

Diese und andere ähnliche Szenarien werden mit Splittable DoFn viel besser - Arbeit daran ist in Arbeit, aber es ist eine große Menge an Arbeit, also noch keine Zeitleiste.

Verwandte Themen