- Holen Sie sich einige JSON -Daten aus einer API -Antwort < /li>
Ändern Sie sie über Duckdb (nur im Gedächtnis) < /li>
Konvertieren Sie die resultierenden Daten zu einer Liste von Python -Dicts (1 Rhow). Python datetime zu jedem Diktieren in der Liste - Schreiben Sie eine Avro -Datei aus diesem Diktat
- Laden Sie die AVRO -Datei in BigQuery
Mein Avro -Schema wird von der Py_avro_schema -Bibliothek über eine Datenklasse generiert. Also modifiziere ich mein Schema manuell: < /p>
Code: Select all
schema_bytes = generate(MyClass, namespace="myclass")
schema_str = schema_bytes.decode("utf-8") if isinstance(schema_bytes, bytes) else schema_bytes
schema = json.loads(schema_str)
schema["fields"][0] = {
"name": "request_ts",
"type": [
"null",
{
"type": "long",
"logicalType": "timestamp-micros"
}
],
"default": None,
}
zu generieren
Code: Select all
# tried eeach approach individually
datetime.datetime.now(tz=datetime.timezone.utc)
datetime.datetime.now(tz=datetime.timezone.utc).isoformat()
int(datetime.datetime.now(tz=datetime.timezone.utc).timestamp())
< /code>
Aber es führt immer zu Fehlern in BigQuery, es kann Request_ts in einen Zeitstempel nicht unterdrücken. Mit dem Zeitstempel behauptet BQ, es sei nur ein int64-Wert (auch wenn das Schema das Feld "Typ" sein sollte: ["null", {"Typ": "Long", "logicalType": "Timestamp-Millis"}]
Ich habe auch versucht, nur ein TISTAMP. Ein Pandas -Zeitstempel, der auch fehlschlägt, weil er nicht langen Avro zugeordnet ist. Zusätzlich versucht, die Tabelle ohne zeitliche Partitionierung nachzubilden. In diesem Fall ist der Job erfolgreich, aber der Zeitstempel ist nur der Epochen -Zeitstempel im Jahr 1970, nicht aktuelles