Bu makalede, JSON biçimli verileri Azure Veri Gezgini veritabanına nasıl alabileceğiniz gösterilmektedir. Basit ham ve eşlenmiş JSON örnekleriyle başlar, çok satırlı JSON'a devam eder ve ardından diziler ve sözlükler içeren daha karmaşık JSON şemalarıyla başa çıkarsınız. Örneklerde Kusto Sorgu Dili (KQL), C# veya Python kullanarak JSON biçimli verileri alma işlemi ayrıntılı olarak açıklanmaktadır.
Not
Üretim senaryolarında yönetim komutlarının kullanılmasını .ingest önermiyoruz. Bunun yerine bir veri bağlayıcısı kullanın veya Kusto istemci kitaplıklarından birini kullanarak program aracılığıyla veri alın.
Önkoşullar
- Microsoft hesabı veya Microsoft Entra kullanıcı kimliği. Azure aboneliği gerekmez.
- Azure Veri Gezgini kümesi ve veritabanı.
Küme ve veritabanı oluşturma.
Azure Veri Gezgini iki JSON dosya biçimi destekler:
-
json: Satırla ayrılmış JSON. Giriş verilerindeki her satırın tam olarak bir JSON kaydı vardır. Bu biçim, açıklamaların ve tek tırnaklı özelliklerin ayrıştırılması destekler. Daha fazla bilgi için bkz . JSON Satırları.
-
multijson: Çok satırlı JSON. Ayrıştırıcı, satır ayırıcılarını yoksayar ve önceki konumdan geçerli bir JSON'un sonuna kadar olan bir kaydı okur.
Not
Veri al deneyimi kullanılarak alma işlemi yapılırken varsayılan biçim olurmultijson. Biçimi, çok satırlı JSON kayıtlarını ve JSON kayıtlarının dizilerini işleyebilir. Ayrıştırma hatasıyla karşılaşıldığında dosyanın tamamı atılır. Geçersiz JSON kayıtlarını yoksaymak için, biçimi (JSON Satırları) olarak değiştiren json "Veri biçimi hatalarını yoksay" seçeneğini belirleyin.
JSON Çizgi biçimini ()json kullanıyorsanız, ayrıştırma sırasında geçerli JSON kayıtlarını temsil etmeyen satırlar atlanır.
JSON biçimli verilerin alımı, alma özelliğini kullanarak biçimi belirtmenizi gerektirir. JSON verilerinin alımı, JSON kaynak girişini hedef sütununa eşleyen eşleme gerektirir. Veri alırken özelliğini (önceden tanımlanmış eşleme için) alma özelliğiyle veya özelliğiyle ingestionMappingReferenceIngestionMappings kullanınIngestionMapping. Bu makalede ingestionMappingReference , alma için kullanılan tabloda önceden tanımlanmış olan alma özelliği kullanılmaktadır. Aşağıdaki örneklerde, JSON kayıtlarını ham veri olarak tek bir sütun tablosuna alarak başlayacağız. Ardından eşlemeyi kullanarak her özelliği eşlenen sütununa alıyoruz.
Basit JSON örneği
Aşağıdaki örnek, düz bir yapıya sahip basit bir JSON'dır. Veriler, çeşitli cihazlar tarafından toplanan sıcaklık ve nem bilgilerine sahiptir. Her kayıt bir kimlik ve zaman damgası ile işaretlenir.
{
"timestamp": "2019-05-02 15:23:50.0369439",
"deviceId": "2945c8aa-f13e-4c48-4473-b81440bb5ca2",
"messageId": "7f316225-839a-4593-92b5-1812949279b3",
"temperature": 31.0301639051317,
"humidity": 62.0791099602725
}
Ham JSON kayıtlarını alma
Bu örnekte, JSON kayıtlarını ham veri olarak tek bir sütun tablosuna alırsınız. Veri işleme, sorgular ve güncelleştirme ilkesi kullanılarak veriler alındıktan sonra gerçekleştirilir.
Verileri ham JSON biçiminde almak için Kusto Sorgu Dili kullanın.
https://dataexplorer.azure.com oturumu açın.
Küme ekle'yi seçin.
Küme ekle iletişim kutusunda, biçiminde https://<ClusterName>.<Region>.kusto.windows.net/küme URL'nizi girin ve Ekle'yi seçin.
Aşağıdaki komutu yapıştırın ve çalıştır'ı seçerek tabloyu oluşturun.
.create table RawEvents (Event: dynamic)
Bu sorgu, dinamik veri türünde tek Event bir sütuna sahip bir tablo oluşturur.
JSON eşlemesini oluşturun.
.create table RawEvents ingestion json mapping 'RawEventMapping' '[{"column":"Event","Properties":{"path":"$"}}]'
Bu komut bir eşleme oluşturur ve JSON kök yolunu $ sütuna eşler Event .
Verileri tabloya RawEvents alın.
.ingest into table RawEvents ('https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/simple.json') with '{"format":"json", "ingestionMappingReference":"RawEventMapping"}'
Verileri ham JSON biçiminde almak için C# kullanın.
RawEvents Tabloyu oluşturun.
var kustoUri = "https://<clusterName>.<region>.kusto.windows.net/";
var connectionStringBuilder = new KustoConnectionStringBuilder(kustoUri)
{
FederatedSecurity = true,
UserID = userId,
Password = password,
Authority = tenantId,
InitialCatalog = databaseName
};
using var kustoClient = KustoClientFactory.CreateCslAdminProvider(connectionStringBuilder);
var tableName = "RawEvents";
var command = CslCommandGenerator.GenerateTableCreateCommand(
tableName,
new[] { Tuple.Create("Events", "System.Object") }
);
await kustoClient.ExecuteControlCommandAsync(command);
JSON eşlemesini oluşturun.
var tableMappingName = "RawEventMapping";
command = CslCommandGenerator.GenerateTableMappingCreateCommand(
IngestionMappingKind.Json,
tableName,
tableMappingName,
new ColumnMapping[]
{
new() { ColumnName = "Events", Properties = new Dictionary<string, string> { { "path", "$" } } }
}
);
await kustoClient.ExecuteControlCommandAsync(command);
Bu komut bir eşleme oluşturur ve JSON kök yolunu $ sütuna eşler Event .
Verileri tabloya RawEvents alın.
var ingestUri = "https://ingest-<clusterName>.<region>.kusto.windows.net/";
var ingestConnectionStringBuilder = new KustoConnectionStringBuilder(ingestUri)
{
FederatedSecurity = true,
UserID = userId,
Password = password,
Authority = tenantId,
InitialCatalog = databaseName
};
using var ingestClient = KustoIngestFactory.CreateQueuedIngestClient(ingestConnectionStringBuilder);
var blobPath = "https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/simple.json";
var properties = new KustoQueuedIngestionProperties(databaseName, tableName)
{
Format = DataSourceFormat.json,
IngestionMapping = new IngestionMapping { IngestionMappingReference = tableMappingName }
};
await ingestClient.IngestFromStorageAsync(blobPath, properties);
Not
Veriler toplu işleme ilkesine göre toplanır ve bu da birkaç dakikalık gecikme süresiyle sonuçlanır.
Verileri ham JSON biçiminde almak için Python kullanın.
RawEvents Tabloyu oluşturun.
KUSTO_URI = "https://<ClusterName>.<Region>.kusto.windows.net/"
KCSB_DATA = KustoConnectionStringBuilder.with_aad_device_authentication(KUSTO_URI, AAD_TENANT_ID)
KUSTO_CLIENT = KustoClient(KCSB_DATA)
TABLE = "RawEvents"
CREATE_TABLE_COMMAND = ".create table " + TABLE + " (Events: dynamic)"
RESPONSE = KUSTO_CLIENT.execute_mgmt(DATABASE, CREATE_TABLE_COMMAND)
dataframe_from_result_table(RESPONSE.primary_results[0])
JSON eşlemesini oluşturun.
MAPPING = "RawEventMapping"
CREATE_MAPPING_COMMAND = ".create table " + TABLE + " ingestion json mapping '" + MAPPING + """' '[{"column":"Event","path":"$"}]'"""
RESPONSE = KUSTO_CLIENT.execute_mgmt(DATABASE, CREATE_MAPPING_COMMAND)
dataframe_from_result_table(RESPONSE.primary_results[0])
Verileri tabloya RawEvents alın.
INGEST_URI = "https://ingest-<ClusterName>.<Region>.kusto.windows.net/"
KCSB_INGEST = KustoConnectionStringBuilder.with_aad_device_authentication(INGEST_URI, AAD_TENANT_ID)
INGESTION_CLIENT = KustoIngestClient(KCSB_INGEST)
BLOB_PATH = 'https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/simple.json'
INGESTION_PROPERTIES = IngestionProperties(database=DATABASE, table=TABLE, dataFormat=DataFormat.JSON, ingestion_mapping_reference=MAPPING)
BLOB_DESCRIPTOR = BlobDescriptor(BLOB_PATH, FILE_SIZE)
INGESTION_CLIENT.ingest_from_blob(
BLOB_DESCRIPTOR, ingestion_properties=INGESTION_PROPERTIES)
Not
Veriler toplu işleme ilkesine göre toplanır ve bu da birkaç dakikalık gecikme süresiyle sonuçlanır.
Eşlenen JSON kayıtlarını alma
Bu örnekte JSON kayıtları verilerini alırsınız. Her JSON özelliği tablodaki tek bir sütuna eşlenir.
JSON giriş verilerine benzer bir şemayla yeni bir tablo oluşturun. Bu tabloyu aşağıdaki tüm örnekler ve alma komutları için kullanırız.
.create table Events (Time: datetime, Device: string, MessageId: string, Temperature: double, Humidity: double)
JSON eşlemesini oluşturun.
.create table Events ingestion json mapping 'FlatEventMapping' '[{"column":"Time","Properties":{"path":"$.timestamp"}},{"column":"Device","Properties":{"path":"$.deviceId"}},{"column":"MessageId","Properties":{"path":"$.messageId"}},{"column":"Temperature","Properties":{"path":"$.temperature"}},{"column":"Humidity","Properties":{"path":"$.humidity"}}]'
Bu eşlemede, tablo şeması tarafından tanımlandığı gibi, timestamp girdiler sütuna Time veri türü olarak datetime alınır.
Verileri tabloya Events alın.
.ingest into table Events ('https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/simple.json') with '{"format":"json", "ingestionMappingReference":"FlatEventMapping"}'
'simple.json' dosyasında birkaç satırla ayrılmış JSON kaydı var. biçimi, jsonalma komutunda kullanılan eşleme ise oluşturduğunuz biçimdir FlatEventMapping .
JSON giriş verilerine benzer bir şemayla yeni bir tablo oluşturun. Bu tabloyu aşağıdaki tüm örnekler ve alma komutları için kullanırız.
var tableName = "Events";
var command = CslCommandGenerator.GenerateTableCreateCommand(
tableName,
new[]
{
Tuple.Create("Time", "System.DateTime"),
Tuple.Create("Device", "System.String"),
Tuple.Create("MessageId", "System.String"),
Tuple.Create("Temperature", "System.Double"),
Tuple.Create("Humidity", "System.Double")
}
);
await kustoClient.ExecuteControlCommandAsync(command);
JSON eşlemesini oluşturun.
var tableMappingName = "FlatEventMapping";
command = CslCommandGenerator.GenerateTableMappingCreateCommand(
IngestionMappingKind.Json,
tableName,
tableMappingName,
new ColumnMapping[]
{
new() { ColumnName = "Time", Properties = new Dictionary<string, string> { { MappingConsts.Path, "$.timestamp" } } },
new() { ColumnName = "Device", Properties = new Dictionary<string, string> { { MappingConsts.Path, "$.deviceId" } } },
new() { ColumnName = "MessageId", Properties = new Dictionary<string, string> { { MappingConsts.Path, "$.messageId" } } },
new() { ColumnName = "Temperature", Properties = new Dictionary<string, string> { { MappingConsts.Path, "$.temperature" } } },
new() { ColumnName = "Humidity", Properties = new Dictionary<string, string> { { MappingConsts.Path, "$.humidity" } } }
}
);
await kustoClient.ExecuteControlCommandAsync(command);
Bu eşlemede, tablo şeması tarafından tanımlandığı gibi, timestamp girdiler sütuna Time veri türü olarak datetime alınır.
Verileri tabloya Events alın.
var blobPath = "https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/simple.json";
var properties = new KustoQueuedIngestionProperties(databaseName, tableName)
{
Format = DataSourceFormat.json,
IngestionMapping = new IngestionMapping { IngestionMappingReference = tableMappingName }
};
await ingestClient.IngestFromStorageAsync(blobPath, properties).ConfigureAwait(false);
'simple.json' dosyasında birkaç satırla ayrılmış JSON kaydı var. biçimi, jsonalma komutunda kullanılan eşleme ise oluşturduğunuz biçimdir FlatEventMapping .
JSON giriş verilerine benzer bir şemayla yeni bir tablo oluşturun. Bu tabloyu aşağıdaki tüm örnekler ve alma komutları için kullanırız.
TABLE = "Events"
CREATE_TABLE_COMMAND = ".create table " + TABLE + " (Time: datetime, Device: string, MessageId: string, Temperature: double, Humidity: double)"
RESPONSE = KUSTO_CLIENT.execute_mgmt(DATABASE, CREATE_TABLE_COMMAND)
dataframe_from_result_table(RESPONSE.primary_results[0])
JSON eşlemesini oluşturun.
MAPPING = "FlatEventMapping"
CREATE_MAPPING_COMMAND = ".create table Events ingestion json mapping '" + MAPPING + """' '[{"column":"Time","Properties":{"path":"$.timestamp"}},{"column":"Device","Properties":{"path":"$.deviceId"}},{"column":"MessageId","Properties":{"path":"$.messageId"}},{"column":"Temperature","Properties":{"path":"$.temperature"}},{"column":"Humidity","Properties":{"path":"$.humidity"}}]'"""
RESPONSE = KUSTO_CLIENT.execute_mgmt(DATABASE, CREATE_MAPPING_COMMAND)
dataframe_from_result_table(RESPONSE.primary_results[0])
Verileri tabloya Events alın.
BLOB_PATH = 'https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/simple.json'
INGESTION_PROPERTIES = IngestionProperties(database=DATABASE, table=TABLE, dataFormat=DataFormat.JSON, ingestion_mapping_reference=MAPPING)
BLOB_DESCRIPTOR = BlobDescriptor(BLOB_PATH, FILE_SIZE)
INGESTION_CLIENT.ingest_from_blob(
BLOB_DESCRIPTOR, ingestion_properties=INGESTION_PROPERTIES)
'simple.json' dosyasında birkaç satır ayrılmış JSON kaydı var. biçimi, jsonalma komutunda kullanılan eşleme ise oluşturduğunuz biçimdir FlatEventMapping .
Çok satırlı JSON kayıtlarını alma
Bu örnekte, çok satırlı JSON kayıtlarını alırsınız. Her JSON özelliği tablodaki tek bir sütuna eşlenir. 'multilined.json' dosyasında birkaç girintili JSON kaydı var. Biçimi multijson , JSON yapısına göre kayıtların okunmasını belirtir.
Verileri tabloya Events alın.
.ingest into table Events ('https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/multilined.json') with '{"format":"multijson", "ingestionMappingReference":"FlatEventMapping"}'
Verileri tabloya Events alın.
var tableMappingName = "FlatEventMapping";
var blobPath = "https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/multilined.json";
var properties = new KustoQueuedIngestionProperties(databaseName, tableName)
{
Format = DataSourceFormat.multijson,
IngestionMapping = new IngestionMapping { IngestionMappingReference = tableMappingName }
};
await ingestClient.IngestFromStorageAsync(blobPath, properties).ConfigureAwait(false);
Verileri tabloya Events alın.
MAPPING = "FlatEventMapping"
BLOB_PATH = 'https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/multilined.json'
INGESTION_PROPERTIES = IngestionProperties(database=DATABASE, table=TABLE, dataFormat=DataFormat.MULTIJSON, ingestion_mapping_reference=MAPPING)
BLOB_DESCRIPTOR = BlobDescriptor(BLOB_PATH, FILE_SIZE)
INGESTION_CLIENT.ingest_from_blob(
BLOB_DESCRIPTOR, ingestion_properties=INGESTION_PROPERTIES)
Diziler içeren JSON kayıtlarını alma
Dizi veri türleri sıralı bir değer koleksiyonudur. JSON dizisinin alımı bir güncelleştirme ilkesi tarafından yapılır. JSON bir ara tabloya olduğu gibi alınır. Güncelleştirme ilkesi tabloda önceden tanımlanmış bir işlev RawEvents çalıştırarak sonuçları hedef tabloya yeniden kaydeder. Verileri aşağıdaki yapıya sahip olarak alıyoruz:
{
"records":
[
{
"timestamp": "2019-05-02 15:23:50.0000000",
"deviceId": "ddbc1bf5-096f-42c0-a771-bc3dca77ac71",
"messageId": "7f316225-839a-4593-92b5-1812949279b3",
"temperature": 31.0301639051317,
"humidity": 62.0791099602725
},
{
"timestamp": "2019-05-02 15:23:51.0000000",
"deviceId": "ddbc1bf5-096f-42c0-a771-bc3dca77ac71",
"messageId": "57de2821-7581-40e4-861e-ea3bde102364",
"temperature": 33.7529423105311,
"humidity": 75.4787976739364
}
]
}
update policy koleksiyondaki records her değerin işlecini kullanarak mv-expand ayrı bir satır alması için koleksiyonunu genişleten bir işlev oluşturun. Tabloyu kaynak tablo RawEvents ve Events hedef tablo olarak kullanırız.
.create function EventRecordsExpand() {
RawEvents
| mv-expand records = Event.records
| project
Time = todatetime(records["timestamp"]),
Device = tostring(records["deviceId"]),
MessageId = tostring(records["messageId"]),
Temperature = todouble(records["temperature"]),
Humidity = todouble(records["humidity"])
}
İşlev tarafından alınan şema, hedef tablonun şemasıyla eşleşmelidir. Şemayı gözden geçirmek için işlecini kullanın getschema .
EventRecordsExpand() | getschema
Güncelleştirme ilkesini hedef tabloya ekleyin. Bu ilke, ara tablodaki yeni alınan veriler RawEvents üzerinde sorguyu otomatik olarak çalıştırır ve sonuçları tabloya Events alır. Ara tablonun kalıcı olmasını önlemek için sıfır bekletme ilkesi tanımlayın.
.alter table Events policy update @'[{"Source": "RawEvents", "Query": "EventRecordsExpand()", "IsEnabled": "True"}]'
Verileri tabloya RawEvents alın.
.ingest into table RawEvents ('https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/array.json') with '{"format":"multijson", "ingestionMappingReference":"RawEventMapping"}'
Tablodaki Events verileri gözden geçirin.
Events
koleksiyondaki records her değerin işlecini kullanarak mv-expand ayrı bir satır alması için koleksiyonunu genişleten bir güncelleştirme işlevi oluşturun. Tabloyu kaynak tablo RawEvents ve Events hedef tablo olarak kullanırız.
var command = CslCommandGenerator.GenerateCreateFunctionCommand(
"EventRecordsExpand",
"UpdateFunctions",
string.Empty,
null,
@"RawEvents
| mv-expand records = Event
| project
Time = todatetime(records['timestamp']),
Device = tostring(records['deviceId']),
MessageId = tostring(records['messageId']),
Temperature = todouble(records['temperature']),
Humidity = todouble(records['humidity'])",
ifNotExists: false
);
await kustoClient.ExecuteControlCommandAsync(command);
Not
İşlev tarafından alınan şema, hedef tablonun şemasıyla eşleşmelidir.
Güncelleştirme ilkesini hedef tabloya ekleyin. Bu ilke, ara tablodaki yeni alınan veriler RawEvents üzerinde sorguyu otomatik olarak çalıştırır ve sonuçlarını tabloya Events alır. Ara tablonun kalıcı olmasını önlemek için sıfır bekletme ilkesi tanımlayın.
command = ".alter table Events policy update @'[{'Source': 'RawEvents', 'Query': 'EventRecordsExpand()', 'IsEnabled': 'True'}]";
await kustoClient.ExecuteControlCommandAsync(command);
Verileri tabloya RawEvents alın.
var blobPath = "https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/array.json";
var tableName = "RawEvents";
var tableMappingName = "RawEventMapping";
var properties = new KustoQueuedIngestionProperties(databaseName, tableName)
{
Format = DataSourceFormat.multijson,
IngestionMapping = new IngestionMapping { IngestionMappingReference = tableMappingName }
};
await ingestClient.IngestFromStorageAsync(blobPath, properties);
Tablodaki Events verileri gözden geçirin.
koleksiyondaki records her değerin işlecini kullanarak mv-expand ayrı bir satır alması için koleksiyonunu genişleten bir güncelleştirme işlevi oluşturun. Tabloyu kaynak tablo RawEvents ve Events hedef tablo olarak kullanırız.
CREATE_FUNCTION_COMMAND =
'''.create function EventRecordsExpand() {
RawEvents
| mv-expand records = Event
| project
Time = todatetime(records["timestamp"]),
Device = tostring(records["deviceId"]),
MessageId = tostring(records["messageId"]),
Temperature = todouble(records["temperature"]),
Humidity = todouble(records["humidity"])
}'''
RESPONSE = KUSTO_CLIENT.execute_mgmt(DATABASE, CREATE_FUNCTION_COMMAND)
dataframe_from_result_table(RESPONSE.primary_results[0])
Not
İşlev tarafından alınan şemanın hedef tablonun şemasıyla eşleşmesi gerekir.
Güncelleştirme ilkesini hedef tabloya ekleyin. Bu ilke, ara tablodaki yeni alınan veriler RawEvents üzerinde sorguyu otomatik olarak çalıştırır ve sonuçlarını tabloya Events alır. Ara tablonun kalıcı olmasını önlemek için sıfır bekletme ilkesi tanımlayın.
CREATE_UPDATE_POLICY_COMMAND =
""".alter table Events policy update @'[{'Source': 'RawEvents', 'Query': 'EventRecordsExpand()', 'IsEnabled': 'True'}]"""
RESPONSE = KUSTO_CLIENT.execute_mgmt(DATABASE, CREATE_UPDATE_POLICY_COMMAND)
dataframe_from_result_table(RESPONSE.primary_results[0])
Verileri tabloya RawEvents alın.
TABLE = "RawEvents"
MAPPING = "RawEventMapping"
BLOB_PATH = 'https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/array.json'
INGESTION_PROPERTIES = IngestionProperties(database=DATABASE, table=TABLE, dataFormat=DataFormat.MULTIJSON, ingestion_mapping_reference=MAPPING)
BLOB_DESCRIPTOR = BlobDescriptor(BLOB_PATH, FILE_SIZE)
INGESTION_CLIENT.ingest_from_blob(
BLOB_DESCRIPTOR, ingestion_properties=INGESTION_PROPERTIES)
Tablodaki Events verileri gözden geçirin.
İlgili içerik