İngilizce dilinde oku

Aracılığıyla paylaş


Şemayı işleme

Veri kaynağınıza bağlı olarak, veri türleri ve sütun adları hakkındaki bilgiler açıkça sağlanabilir veya sağlanmayabilir. OData REST API'leri bunu genellikle $metadata tanımını kullanarak işler ve Power Query OData.Feed yöntemi bu bilgileri ayrıştırma ve OData kaynağından döndürülen verilere uygulama işlemlerini otomatik olarak gerçekleştirir.

Birçok REST API'sinde şemalarını program aracılığıyla belirlemenin bir yolu yoktur. Bu durumlarda bağlayıcınıza bir şema tanımı eklemeniz gerekir.

Basit sabit kodlanmış yaklaşım

En basit yaklaşım, bağlayıcınıza bir şema tanımını sabit kodlamaktır. Bu, çoğu kullanım örneği için yeterlidir.

Genel olarak, bağlayıcınız tarafından döndürülen veriler üzerinde bir şema zorlamanın aşağıdakiler gibi birden çok avantajı vardır:

  • Doğru veri türlerini ayarlama.
  • Son kullanıcılara gösterilmesi gerekmeyen sütunları kaldırma (iç kimlikler veya durum bilgileri gibi).
  • Yanıtta eksik olabilecek sütunları ekleyerek her veri sayfasının aynı şekle sahip olduğundan emin olun (REST API'leri genellikle alanların tamamen çıkarılarak null olması gerektiğini belirtir).

Ile mevcut şemayı görüntüleme Table.Schema

TripPin OData örnek hizmetinden basit bir tablo döndüren aşağıdaki kodu göz önünde bulundurun:

let
    url = "https://services.odata.org/TripPinWebApiService/Airlines",
    source = Json.Document(Web.Contents(url))[value],
    asTable = Table.FromRecords(source)
in
    asTable

Not

TripPin bir OData kaynağı olduğundan, gerçekçi bir şekilde işlevin otomatik şema işlemesini OData.Feed kullanmak daha mantıklı olacaktır. Bu örnekte, kaynağı tipik bir REST API olarak ele alacağız ve Web.Contents kullanarak şemayı el ile sabit kodlama tekniğini göstereceksiniz.

Bu tablo sonucudur:

TripPin Havayolu verilerinin tablosu.

Sütunların veri türünü denetlemek için kullanışlı Table.Schema işlevini kullanabilirsiniz:

let
    url = "https://services.odata.org/TripPinWebApiService/Airlines",
    source = Json.Document(Web.Contents(url))[value],
    asTable = Table.FromRecords(source)
in
    Table.Schema(asTable)

Table.Schema'nın TripPin Havayolu verilerine uygulanması sonucu.

Hem AirlineCode hem de Name türündedir any . Table.Schema adlar, konumlar, tür bilgileri ve Precision, Scale ve MaxLength gibi birçok gelişmiş özellik de dahil olmak üzere tablodaki sütunlar hakkında çok sayıda meta veri döndürür. Şimdilik yalnızca atfedilen tür (), ilkel tür ()TypeNameKind ve sütun değerinin null (IsNullable) olup olmadığıyla ilgilenmeniz gerekir.

Basit bir şema tablosu tanımlama

Şema tablonuz iki sütundan oluşur:

Sütun Ayrıntılar
Veri Akışı Adı Sütunun adı. Bu, hizmet tarafından döndürülen sonuçlardaki adla eşleşmelidir.
Tür Ayarlayacağımız M veri türü. Bu ilkel bir tür (metin, sayı, tarih saat vb.) veya atfedilen bir tür (Int64.Type, Currency.Type vb.) olabilir.

Tablonun sabit kodlanmış şema tablosu Airlines ve Name sütunlarını AirlineCode text olarak ayarlar ve şöyle görünür:

Airlines = #table({"Name", "Type"}, {
        {"AirlineCode", type text},
        {"Name", type text}
    })

Diğer uç noktalardan bazılarına baktığınızda aşağıdaki şema tablolarını göz önünde bulundurun:

Tabloda Airports tutmak istediğiniz dört alan vardır (türünden recordbiri dahil):

Airports = #table({"Name", "Type"}, {
        {"IcaoCode", type text},
        {"Name", type text},
        {"IataCode", type text},
        {"Location", type record}
    })

Tabloda People s (, ), null atanabilir sütun ( AddressInfoEmails) ve atfedilen türe (GenderConcurrency) sahip bir sütun dahil olmak üzere listyedi alan vardır:

People = #table({"Name", "Type"}, {
        {"UserName", type text},
        {"FirstName", type text},
        {"LastName", type text},
        {"Emails", type list},
        {"AddressInfo", type list},
        {"Gender", type nullable text},
        {"Concurrency", Int64.Type}
    })

Bu tabloların tümünü tek bir ana şema tablosuna SchemaTableyerleştirebilirsiniz:

SchemaTable = #table({"Entity", "SchemaTable"}, {
        {"Airlines", Airlines},
        {"Airports", Airports},
        {"People", People}
    })

Şema tablosu.

SchemaTransformTable yardımcı işlevi

SchemaTransformTable Aşağıda açıklanan yardımcı işlevi, verilerinizde şemaları zorunlu kılmak için kullanılır. Aşağıdaki parametreleri alır:

Parametre Tür Açıklama
table table Şemanızı zorunlu kılmak istediğiniz veri tablosu.
schema table Sütun bilgilerini okumak için aşağıdaki türdeki şema tablosu: type table [Name = text, Type = type].
enforceSchema Numara (isteğe bağlı) İşlevin davranışını denetleen bir sabit listesi.
Varsayılan değer (EnforceSchema.Strict = 1), çıkış tablosunun eksik sütunları ekleyerek ve ek sütunları kaldırarak sağlanan şema tablosuyla eşleşmesini sağlar.
Bu EnforceSchema.IgnoreExtraColumns = 2 seçenek, sonuçtaki ek sütunları korumak için kullanılabilir.
Kullanıldığında EnforceSchema.IgnoreMissingColumns = 3 , hem eksik sütunlar hem de ek sütunlar yoksayılır.

Bu işlevin mantığı şuna benzer:

  1. Kaynak tabloda eksik sütun olup olmadığını belirleyin.
  2. Fazladan sütun olup olmadığını belirleyin.
  3. Yapılandırılmış sütunları (türü list, recordve ) ve tabletürüne anyayarlanmış sütunları yoksayın.
  4. Her sütun türünü ayarlamak için kullanın Table.TransformColumnTypes .
  5. Şema tablosunda göründükleri sırayla sütunları yeniden sıralar.
  6. kullanarak Value.ReplaceTypetablonun kendisinde türünü ayarlayın.

Not

Tablo türünü ayarlamaya yönelik son adım, sorgu düzenleyicisinde sonuçları görüntülerken tür bilgilerini çıkarmak için Power Query kullanıcı arabirimi gereksinimini ortadan kaldırır ve bu da bazen API'ye çift çağrıya neden olabilir.

Hepsini bir araya getirme

Tam bir uzantının daha büyük bağlamında, API'den bir tablo döndürülürken şema işleme gerçekleşir. Bu işlev genellikle bir gezinti tablosundan geçirilen varlık bilgileriyle disk belleği işlevinin en düşük düzeyinde (varsa) gerçekleşir.

Disk belleği ve gezinti tablolarının uygulanması bağlama özgü olduğundan, sabit kodlanmış şema işleme mekanizması uygulama örneği burada gösterilmez. Bu TripPin örneği , bir uçtan uca çözümün nasıl görünebileceğini gösterir.

Gelişmiş yaklaşım

Yukarıda açıklanan sabit kodlanmış uygulama, şemaların basit JSON repsonses için tutarlı kalmasını sağlamak için iyi bir iştir, ancak yanıtın ilk düzeyini ayrıştırmayla sınırlıdır. İç içe veri kümeleri, M Türlerinden yararlanan aşağıdaki yaklaşımdan yararlanır.

Aşağıda, Dil Belirtimi'nden M dilindeki türler hakkında hızlı bir yenileme verilmiştir:

Tür değeri, diğer değerleri sınıflandırır. Bir tür tarafından sınıflandırılan bir değerin bu türe uygun olduğu söylenir. M türü sistemi aşağıdaki türlerden oluşur:

  • İlkel değerleri (binary, date, , datetime, datetimezone, , listduration, logical, numbertypetimetextnullrecord, ) sınıflandıran ve ayrıca bir dizi soyut türü (function, table, anyve none) içeren ilkel türler.
  • Alan adlarına ve değer türlerine göre kayıt değerlerini sınıflandıran kayıt türleri.
  • Tek bir öğe temel türünü kullanarak listeleri sınıflandıran liste türleri.
  • İşlev değerlerini parametrelerinin türlerine ve dönüş değerlerine göre sınıflandıran işlev türleri.
  • Tablo değerlerini sütun adlarına, sütun türlerine ve anahtarlara göre sınıflandıran tablo türleri.
  • Bir temel tür tarafından sınıflandırılan tüm değerlere ek olarak null değerini sınıflandıran null atanabilir türler.
  • Tür olan değerleri sınıflandıran tür türleri.

Elde ettiğiniz ham JSON çıkışını kullanarak (ve/veya hizmetin $metadata tanımlarını arayarak), OData karmaşık türlerini temsil etmek için aşağıdaki kayıt türlerini tanımlayabilirsiniz:

LocationType = type [
    Address = text,
    City = CityType,
    Loc = LocType
];

CityType = type [
    CountryRegion = text,
    Name = text,
    Region = text
];

LocType = type [
    #"type" = text,
    coordinates = {number},
    crs = CrsType
];

CrsType = type [
    #"type" = text,
    properties = record
];

ve öğesine nasıl LocationType başvurarak CityType LocType yapılandırılmış sütunlarını temsil ettiğine dikkat edin.

Tablo olarak gösterilmesini istediğiniz üst düzey varlıklar için tablo türleri tanımlayabilirsiniz:

AirlinesType = type table [
    AirlineCode = text,
    Name = text
];
AirportsType = type table [
    Name = text,
    IataCode = text,
    Location = LocationType
];
PeopleType = type table [
    UserName = text,
    FirstName = text,
    LastName = text,
    Emails = {text},
    AddressInfo = {nullable LocationType},
    Gender = nullable text,
    Concurrency  Int64.Type
];

Ardından değişkeninizi SchemaTable (varlık-tür eşlemeleri için arama tablosu olarak kullanabilirsiniz) şu yeni tür tanımlarını kullanacak şekilde güncelleştirebilirsiniz:

SchemaTable = #table({"Entity", "Type"}, {
    {"Airlines", AirlinesType},
    {"Airports", AirportsType},
    {"People", PeopleType}
});

Önceki alıştırmada kullandığınız SchemaTransformTable gibi verilerinizde bir şemayı zorlamak için ortak bir işleve (Table.ChangeType) güvenebilirsiniz. aksine SchemaTransformTable, Table.ChangeType bağımsız değişken olarak gerçek bir M tablo türünü alır ve şemanızı tüm iç içe türler için özyinelemeli olarak uygular. İmzası:

Table.ChangeType = (table, tableType as type) as nullable table => ...

Not

Esneklik için, işlev hem tablolarda hem de kayıt listelerinde kullanılabilir (tabloların JSON belgesinde nasıl temsil edilir).

Ardından, parametresini table typeolarak değiştirmek schema için bağlayıcı kodunu güncelleştirmeniz ve öğesine bir çağrı Table.ChangeTypeeklemeniz gerekir. Yine, bunu yapmak için ayrıntılar uygulamaya özgü ve bu nedenle burada ayrıntılı olarak girmeye değmez. Bu genişletilmiş TripPin bağlayıcısı örneği , şemayı işlemeye yönelik bu daha karmaşık yaklaşımı uygulayan uçtan uca bir çözümü gösterir.