Ich habe eine Sammlung von homogenen Dicts, wie schreibe ich sie in BigQuery, ohne das Schema zu kennen?Programmgesteuertes Erstellen von BigQuery-Schema in Beam-Pipeline
Der BigQuerySink erfordert, dass ich das Schema angeben, wenn ich es konstruiere. Aber ich kenne das Schema nicht: es ist durch die Schlüssel der Diktate definiert, die ich zu schreiben versuche.
Gibt es eine Möglichkeit, meine Pipeline auf das Schema zu schließen und es dann (als Side-Input?) An die Senke zurückzugeben?
Zum Beispiel:
# Create a PCollection of dicts, something like
# {'field1': 'myval', 'field2': 10}
data = (p | 'generate_data' >> beam.ParDo(CreateData())
# Infer the schema from the data
# Generates a string for each element (ok to assume all dict keys equal)
# "field1:STRING, field2:INTEGER"
schema = (data
| 'infer_schema' >> beam.ParDo(InferSchema())
| 'sample_one' >> beam.combiners.Sample.FixedSizeGlobally(1))
Aber dann, wie füttere ich das Schema als Parameter an die BigQuerySink, und verwenden, die in einem beam.io.Write?
Ich weiß, dass dies nicht richtig ist, aber was ich will zu tun ist:
sink = BigQuerySink(tablename, dataset, project, schema=Materialize(schema))
p | 'write_bigquery' >> beam.io.Write(sink)
tl; dr Gibt es eine Möglichkeit, eine BigQuery Tabelle von Apache Strahl programmatisch das Schema von Folgern zu erstellen und schreiben die Daten?
Die BigQuery-API verfügt über eine automatische Erkennungsschema-Funktion. Wenn dies in Beam nicht unterstützt wird, sollten Sie ein Problem mit dem Beam SDK einreichen. –
Docs für automatische Schemaerkennung sind unter https://cloud.google.com/bigquery/docs/schema-detect –
Danke Tim. Unf, derzeit lehnt die API eine Senke ohne Schema ab, wenn die Tabelle noch nicht existiert. Ich werde sehen, ob ich herausfinden kann, wo ich eine Feature-Anfrage an Beam senden soll. – Greg