Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Usa queste tre definizioni Avro per provare la creazione di schema, l'importazione in massa e il confronto delle versioni. L'esempio descrive un dispositivo che riporta letture ambientali, firmware, posizione e informazioni diagnostiche.
Ogni versione conserva il nome record DeviceTelemetryEventData e lo spazio dei nomi Fabrikam.IoT. Il nome del file identifica la versione di esempio; non sostituisce il numero di versione assegnato dal registro.
| Version | Changes | Nome del file |
|---|---|---|
| 1 | Definisce identificatori di dispositivi e inquilini, cattura tempo, temperatura, umidità e letture della batteria. | Fabrikam.DeviceTelemetryEventData.v1.avsc |
| 2 | Aggiunge informazioni firmware e un record opzionale di posizione annidata. | Fabrikam.DeviceTelemetryEventData.v2.avsc |
| 3 | Aggiunge un enum di stato, un array di codici diagnostici e una mappa dei tag. | Fabrikam.DeviceTelemetryEventData.v3.avsc |
Salva i file di esempio
Copia ogni definizione JSON completa in un file di testo UTF-8 separato con il nome del file mostrato. Questi file sono definizioni di schema, non payload di eventi.
Versione 1
La prima versione definisce le letture originali del dispositivo.
{
"type": "record",
"name": "DeviceTelemetryEventData",
"namespace": "Fabrikam.IoT",
"doc": "Device environmental readings.",
"fields": [
{ "name": "deviceid", "type": "string", "doc": "Unique device identifier." },
{ "name": "tenantid", "type": "string", "doc": "Tenant identifier." },
{ "name": "capturedAt", "type": { "type": "long", "logicalType": "timestamp-millis" }, "doc": "Capture time in UTC." },
{ "name": "temperatureC", "type": "double", "doc": "Temperature in degrees Celsius." },
{ "name": "humidityPct", "type": "double", "doc": "Relative humidity percentage." },
{ "name": "batteryPct", "type": "int", "doc": "Battery level percentage." }
]
}
Versione 2
La seconda versione aggiunge informazioni firmware e un record di posizione nullabile. Il record annidato eredita lo spazio di nomi del record esterno.
{
"type": "record",
"name": "DeviceTelemetryEventData",
"namespace": "Fabrikam.IoT",
"doc": "Device environmental readings with firmware and location.",
"fields": [
{ "name": "deviceid", "type": "string", "doc": "Unique device identifier." },
{ "name": "tenantid", "type": "string", "doc": "Tenant identifier." },
{ "name": "capturedAt", "type": { "type": "long", "logicalType": "timestamp-millis" }, "doc": "Capture time in UTC." },
{ "name": "temperatureC", "type": "double", "doc": "Temperature in degrees Celsius." },
{ "name": "humidityPct", "type": "double", "doc": "Relative humidity percentage." },
{ "name": "batteryPct", "type": "int", "doc": "Battery level percentage." },
{ "name": "firmwareVersion", "type": "string", "default": "1.0.0", "doc": "Firmware version reported by the device." },
{
"name": "location",
"type": [
"null",
{
"type": "record",
"name": "DeviceLocation",
"fields": [
{ "name": "latitude", "type": "double", "doc": "Latitude in decimal degrees." },
{ "name": "longitude", "type": "double", "doc": "Longitude in decimal degrees." }
]
}
],
"default": null,
"doc": "Optional location data."
}
]
}
Versione 3
La terza versione aggiunge la salute e la diagnostica del dispositivo. L'array e la mappa hanno valori predefiniti vuoti.
{
"type": "record",
"name": "DeviceTelemetryEventData",
"namespace": "Fabrikam.IoT",
"doc": "Device environmental readings with health and diagnostics.",
"fields": [
{ "name": "deviceid", "type": "string", "doc": "Unique device identifier." },
{ "name": "tenantid", "type": "string", "doc": "Tenant identifier." },
{ "name": "capturedAt", "type": { "type": "long", "logicalType": "timestamp-millis" }, "doc": "Capture time in UTC." },
{ "name": "temperatureC", "type": "double", "doc": "Temperature in degrees Celsius." },
{ "name": "humidityPct", "type": "double", "doc": "Relative humidity percentage." },
{ "name": "batteryPct", "type": "int", "doc": "Battery level percentage." },
{ "name": "firmwareVersion", "type": "string", "default": "1.0.0", "doc": "Firmware version reported by the device." },
{
"name": "location",
"type": [
"null",
{
"type": "record",
"name": "DeviceLocation",
"fields": [
{ "name": "latitude", "type": "double", "doc": "Latitude in decimal degrees." },
{ "name": "longitude", "type": "double", "doc": "Longitude in decimal degrees." }
]
}
],
"default": null,
"doc": "Optional location data."
},
{
"name": "status",
"type": { "type": "enum", "name": "DeviceStatus", "symbols": ["ONLINE", "DEGRADED", "OFFLINE"] },
"default": "ONLINE",
"doc": "Current health status of the device."
},
{ "name": "diagnosticCodes", "type": { "type": "array", "items": "string" }, "default": [], "doc": "Active diagnostic codes." },
{ "name": "tags", "type": { "type": "map", "values": "string" }, "default": {}, "doc": "Additional key-value metadata." }
]
}
Prova il flusso di lavoro di versioning
-
Crea un insieme di schema chiamato
Fabrikam device telemetry. - Importa insieme i tre file. Controlla l'ordine rilevato prima di confermare l'importazione.
- Apri lo schema importato e verifica che la versione 3 sia l'ultima definizione.
- Passa alla versione 1 e conferma che i campi firmware, posizione e diagnostica non siano presenti.
- Confronta la versione 1 con la versione 3, e poi confronta la versione 2 con la versione 3.
In alternativa, crea uno schema dalla versione 1 e aggiornalo con le versioni 2 e 3 in ordine. Usa uno schema set separato per questo esercizio, così da non confondere aggiornamenti manuali con il risultato dell'importazione in massa.
Annotazioni
Gli esempi utilizzano modifiche additive e valori predefiniti per rendere le differenze facili da esaminare. I valori predefiniti in una definizione Avro non garantiscono che ogni produttore, codifica del payload o destinazione accetti la modifica. Testa la tua pipeline end-to-end prima di adottare una nuova versione.