Menangani transformasi

Untuk situasi di mana respons sumber data tidak disajikan dalam format yang bisa digunakan Power BI secara langsung, Power Query dapat digunakan untuk melakukan serangkaian transformasi.

Transformasi statis

Dalam kebanyakan kasus, sumber data menyajikan data dengan cara yang konsisten: nama kolom, jenis data, dan struktur hierarkis konsisten untuk titik akhir tertentu. Dalam situasi ini, adalah tepat untuk selalu menerapkan kumpulan transformasi yang sama untuk mendapatkan data dalam format yang dapat diterima oleh Power BI.

Contoh transformasi statis dapat ditemukan di TripPin Bagian 2 - Konektor Data untuk tutorial Layanan REST ketika sumber data diperlakukan sebagai layanan REST standar:

let
    Source = TripPin.Feed("https://services.odata.org/v4/TripPinService/Airlines"),
    value = Source[value],
    toTable = Table.FromList(value, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    expand = Table.ExpandRecordColumn(toTable, "Column1", {"AirlineCode", "Name"}, {"AirlineCode", "Name"})
in
    expand

Transformasi dalam contoh ini adalah:

  1. Source adalah Rekaman yang dikembalikan dari panggilan ke TripPin.Feed(...).
  2. Anda menarik nilai dari salah satu pasangan kunci-nilai Source. Nama kuncinya adalah value, dan Anda menyimpan hasilnya dalam variabel yang disebut value.
  3. value adalah daftar, yang Anda konversi ke tabel. Setiap elemen dalam value menjadi baris dalam tabel, yang dapat Anda panggil toTable.
  4. Setiap elemen di value adalah Rekaman itu sendiri. toTable memiliki semua ini dalam satu kolom: "Column1". Langkah ini menarik semua data dengan kunci "AirlineCode" ke dalam kolom yang disebut "AirlineCode" dan semua data dengan kunci "Name" ke dalam kolom yang disebut "Name", untuk setiap baris di toTable. "Column1" digantikan oleh dua kolom baru ini.

Pada akhirnya, Anda memiliki data dalam format tabular sederhana yang dapat diolah dan dirender dengan mudah oleh Power BI.

Cuplikan layar data dalam bentuk tabular.

Penting untuk dicatat bahwa urutan transformasi statis dari kekhususan ini hanya berlaku untuk satu titik akhir. Dalam contoh sebelumnya, urutan transformasi ini hanya berfungsi jika "AirlineCode" dan "Name" ada di respons titik akhir REST, karena dikodekan secara permanen ke dalam kode M. Dengan demikian, urutan transformasi ini mungkin tidak berfungsi jika Anda mencoba mengakses endpoint /Event.

Tingkat kekhususan tinggi ini mungkin diperlukan untuk mengirimkan data ke tabel navigasi. Tetapi untuk fungsi akses data yang lebih umum, kami sarankan Anda hanya melakukan transformasi yang sesuai untuk semua titik akhir.

Nota

Pastikan untuk menguji transformasi dalam berbagai keadaan data. Jika pengguna tidak memiliki data apa pun di /airlines titik akhir, apakah transformasi Anda menghasilkan tabel kosong dengan skema yang benar? Atau apakah terjadi kesalahan selama evaluasi? Lihat TripPin Bagian 7: Skema Tingkat Lanjut dengan Jenis M untuk diskusi tentang pengujian unit.

Transformasi Dinamis

Logika yang lebih kompleks terkadang diperlukan untuk mengonversi respons API menjadi bentuk yang stabil dan konsisten yang sesuai untuk model data Power BI.

Respons API yang tidak konsisten

Alur kontrol M Dasar (pernyataan if, kode status HTTP, blok try...catch, dan sebagainya) biasanya cukup untuk menangani situasi di mana API memiliki beberapa cara respons.

Menentukan Skema Secara Dinamis

Beberapa API dirancang sedih sehingga beberapa informasi harus digabungkan untuk mendapatkan format tabular yang benar. Pertimbangkan /sheets Smartsheet, yang berisi array nama kolom dan array baris data. Konektor Smartsheet dapat mengurai respons ini dengan cara berikut:

raw = Web.Contents(...),
columns = raw[columns],
columnTitles = List.Transform(columns, each [title]),
columnTitlesWithRowNumber = List.InsertRange(columnTitles, 0, {"RowNumber"}),
                
RowAsList = (row) =>
    let
        listOfCells = row[cells],
        cellValuesList = List.Transform(listOfCells, each if Record.HasFields(_, "value") then [value]
                else null),
        rowNumberFirst = List.InsertRange(cellValuesList, 0, {row[rowNumber]})
    in
        rowNumberFirst,

listOfRows = List.Transform(raw[rows], each RowAsList(_)),
result = Table.FromRows(listOfRows, columnTitlesWithRowNumber)
  1. Pertama, memproses informasi header kolom. Anda dapat menarik catatan title dari setiap kolom ke dalam daftar, dengan menambahkan kolom RowNumber yang Anda tahu selalu menjadi kolom pertama.
  2. Selanjutnya Anda dapat menentukan fungsi yang memungkinkan Anda mengurai baris ke dalam Daftar sel value. Anda dapat kembali menempatkan informasi rowNumber di awal.
  3. Terapkan fungsi Anda RowAsList() ke setiap elemen row yang dikembalikan dalam respons API.
  4. Konversi Daftar menjadi tabel, menentukan header kolom.