Use Synapse On-Demand SQL to read Power BI Dataflow CDM data.

This blog post describes how you can read Power BI Dataflow data with Azure Synapse On-Demand SQL.

Power BI service has a special functionality called Power BI Dataflow (https://docs.microsoft.com/en-us/power-bi/transform-model/dataflows/dataflows-introduction-self-service). It allows business users to create data wrangling pipelines, read data from various sources and save it to Azure Datalake Gen2 account.

Dataflow data is useable within Power BI. You can create reports on top of the data contained in dataflows. There are also readers for Python and some other programming languages. Unfortunately there is no reader currently for Azure Synapse Analytics On-Demand SQL.

Azure Synapse Analytics is a new Data Platform umberella from Microsoft (https://azure.microsoft.com/en-us/services/synapse-analytics/). It contains fully compliant T-SQL endpoint for querying data that is located on various sources. Here we are interested about data that sits on Azure Storage.

I have a customer who really needs this functionality as he does not use only Power BI to read but also would like for example use Excel or 3rd party tools to query imported dataflows. If the data would be available from t-sql view then it would be easily accessible.

Demo and walk-through

Power BI Dataflow data structure

Power BI Dataflow uses following structure in Datalake Gen2:

Power BI creates container “powerbi” for Storage Account. Under that container there will be a folder for workspace and then folder for dataflow. In this example workspace is “Synapse Integrated” and dataflow is “qsql”.

model.json file contains information about all the entities. Actual entities and their data is stored in folders.

You can see that as the Dataflow has entity DimCustomer then Datalake Gen2 has a folder for DimCustomer.

Model.json describes the content. It has description for each entity, its fields and actual datafiles that should be included for the entity.

Datafiles and versioning

When you refresh your dataflow, Power BI will save new version of the entity data. It can be found from Datalake.

Model.json file describes which of these files are used to read the data.

How to read data?

Ok, enough for CDM data description. How can I read that data? We need to iterated through model.json files as they contain the required information.

I created a view [powerbi].[PowerBIModels] that does exactly that.

You can query that view to find what dataflows you have. What columns there are and what are the filenames behind.

This is not enough, we need to create the actual view from this information that would read the CDM data. This is done with the Stored Procedure [powerbi].[createModelView]

It takes 3 parameters.

  • Workspace name
  • Dataflow name
  • Entity name

After you run the procedure it creates a view for you. Name of the view is in format: [powerbi].[workspace name_dataflowname_entity-name]

Example: [powerbi].[Synapse Integrated_qsql_DimCustomer]

Data is easy to query. Data remains same until we refresh the view.

View is refreshed by re-running the procedure.

Code..

Ok, sounds interesting? Where do I find the code? I created a public Github repo and uploaded these scripts there. Feel free to download them from: https://github.com/vesatikkanen/Synapse-PowerBI-DataFlow-Reader

And yes, if you want to enchange the script someway you can do so and if you are willing to share your enhancements I would be very happy!

Joulupähkinän tulokset

Tein joulukuussa blogisarjan, jossa jokaisena joulukuun 24 ensimmäisenä päivänä näille sivuille tuli jokin Microsoft Data-aiheinen pulma. Aikaa ratkaista pulma oli kyseinen päivä ja sit seuraavana päivänä tuli vastaus + uusi pulma. Eräänlainen joulupulmakalenteri siis.

Ensimmäisenä päivänä pulmaan tuli eniten vastauksia, yhteensä 21 kpl (2. päivän blogissa lukee 19 mutta varmaan silmät haritti tai jotain). Sen jälkeen määrä vaihteli ollen pienimmillään 5 ja suurimmillaan 18.

Aiheina Power BI/tabulaarisen mallinnuksen ongelmat olivat suosituimpia. T-SQL kielen sisäisen tietämyksen ongelmat sellaisia, joihin tuli vähiten vastauksia. Esimerkiksi 12. ongelma suoritussuunnitelmista sai vain 5 vastausta lopulta. Ehkä pilviaika näkyy siinä mielessä että moni meistä soveltaa ja käyttää palveluita, eikä enää tutki niiden sielunelämää. Tämä on hyvä suuntaus, koska sillä tavalla tuotetaan enemmän lisäarvoa. Epäilen kuitenkin että myös pinnanalla tapahtuvalle selvittelylle on sijaa vielä kauas tulevaisuuteeen. Ongelmat ehkä vaihtuvat, mutta eivät ne palvelut toimi ikinä kaikissa tapauksissa täydellisesti.

Vastauksia tuli siis aika hienosti. Yhteensä 46 eri nimimerkkiä palautti vastauksen. Kuitenkin vain 16 henkilöä palautti useamman kuin yhden vastauksen.

Vastausten kärki meni seuraavasti (nimet julkaistu henkilöiden luvalla)

  • Joni Juutilainen, 24 vastausta
  • Santeri Virtanen, 23 vastausta
  • xx, 18 vastausta
  • xx2, 16 vastausta
  • xx3, 15 vastausta

Jussi Roine Microsoftilta (https://twitter.com/jussiroine) lupasi ennen joulua pari palkintoakin kisaan. Jonille ja Santerille on siis lähdössä postilla Azure-henkinen tuotepalkinto! Jussi kerkesi tuon jälkeen jo vaihtaa uusiin haasteisiin ja hänet löytää nykyisin http://www.northadvisors.com – startupin puikoista, mutta palkinnot ovat silti tulossa. 🙂

Muutama kysely on tullut, toistuuko tämä ensi vuonna? En lupaa vielä, koska loppua kohden alkoi tuntumaan ehkä vähän isolta kakulta mutta jospa aika kuultaa muistot ja tämä toistuu! Toisaalta olen miettinyt sellaista viikottaista pähkinää, jolloin olisi 52 pähkinää vuodessa mutta ei tarttis joka ilta miettiä mikä on sopiva pähkinä huomiselle.

Iso kiitos myös Oskari Heikkiselle (https://twitter.com/oskarialex)! Oskari teki yhden pulman ja auttoi mielipiteellään monessa.

Lopuksi kiitos Lauralle! (https://www.linkedin.com/in/lauratikkanen/) Ei olisi onnistunut ilman vaimoa! Iskä miettii joka ilta seuraavan päivän pähkinää ja lapset saatiin silti nukkumaan ja kaikki perheen jutut tehtyä. Meillä on jo reilu 15-vuotta yhteistä matkaa takana (5585 päivää tarkalleen tätä kirjoittaessa) ja rouva on jaksanut näitä mun tempauksia koko ajan!

Joulupähkinä #24 – Paljonko on aikaa jouluun 2021?

Viimeinen joulupähkinä on täällä! Mietin että minkälainen on viineine joulupähkinä? Joku tosi vaikea, työläs vai mikä? Lopulta olen aika varma että käytännössä kaikki haluavat vain hiljentyä Joulun viettoon ja pähkinä on varmasti aika lailla listan pohjalla. Siksi niille muutamille, jotka tiedän että aikovat palauttaa myös viimeisen joulupähkinän ajattelin että sen on oltava jotenkin helppo, mukautuva ja eteenpäin katsova.

Pähkinä on siis: Tee kysely, koodi, skripti tai ohjelmanpätkä joka laskee aikaa jouluaaton alkuun 2021! Saat tehdä sen ihan just sillä helpoimmalla ja nopeimmalla kielellä. Jos siis luulet että onnistuu helpoiten DAX-suureella, tee se sillä, jos T-SQL selectillä, tee sillä! Jos Python tai c# on parasta, sillä tai ehkä PowerShellillä? Tai ihan millä tahansa muulla ohjelmointikielellä ja tuloksen muotoilunkin saat miettiä just itselle sopivaksi. Kysymys siis: Tee yksinkertainen toteutus joka suoritettaessa palauttaa ajan jouluun 2021 sopivassa muodossa.

Erittäin huippua, kun oikeasti tosi moni kävi joka päivä katsomassa pähkinää. Pähkinän sivulla oli aina n. 40-100 kävijää per päivä. Palautuksia tuli alkuun enemmän, isoimpana päivänä muistaakseni 25 kpl. Kun joulukuu eteni, palautusmäärät vähenivät ja pienimpinä päivinä oli 4 palautusta. Nämä ko. päivänä palauttaneet taisivat palauttaa melkein jokaisena päivänä, ainakin nimimerkit olivat kovin tuttuja.

Toivottavasti sinulla on huippu Joulu! Rauhoitu nyt, kun on 4 päivää enemmän ja vähemmän pyhiä putkeen. Jos olet työtehtävissä Joulun aikaan, toivottavasti pääset välipäivinä tai heti vuoden alussa vetämään happea!

Kiitos kaikille ja nähdään Microsoft Data juttujen parissa seuraavaksi ainakin kahvihetkien kautta! Pähkinän palkintoihin palaan joulun pyhinä tai välipäivinä. Lasken palautukset ja olen Jussi Roineeseen Microsoftille yhteydessä koska Jussi lupasi Microsoftin sponsoroivan community-paketit voittajille!

Jouluaaton palautuksen voit tehdä tuttuun tyyliin Microsoft Forms lomakkeella.

Ja jos missasit maanantain kahvihetken, kannattaa tsekata oheinen video! Aisla esittää matkustusraporttia ja Power BI:n uusinta ominaisuutta.

Pähkinän #23 vastaus

Kiitos Oskarille pähkinästä. Vastaus voi olla riippuvainen käytössäsi olevasta Azure tenantista, joten vastaukseksi hyväksytään kaikki perusteluineen annetut.

Vastaus löytyi ainakin https://portal.azure.com/#blade/Microsoft_Azure_Support/HelpAndSupportBlade/newsupportrequest -sivulta aloittamalla tekemään uutta tukitikettiä. Kun valitsee seuraavasti:

Voi tämän jälkeen painaa Enter details nappia:

Ja kun on painanut, avautuu valikko josta nykyisen defaultin näkee:

Ja tuossa lukee 2 petatavua tällä hetkellä storage accountin kokorajoituksena.

Joulupähkinä #23 – Azure Storagen kapasiteetti

Toiseksi viimeisen pähkinän takana on Oskari Heikkinen (Twitter: @oskarialex). Kyse on Azure Storagesta ja siitä, paljonko sinne saa tavaraa sisään? Azure Storage accountin maksimikapasiteetti on 5PB (listattu täällä: https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#storage-limits). Oletusarvoisesti maksimikapasiteetti on kuitenkin vähemmän. Kuinka paljon dataa voit tallentaa Azure Storage accounttiisi West Europe regionassa oletusarvoisesti avaamatta tukitikettiä Microsoftin suuntaan?

Vastaus voi periaatteessa olla moniselitteinen ja toisaalta voi vaatia Azure AD loginin, joten nyt on tärkeää perustella vastaus.

Oskarilta voit kysyä lisätietoja Twitterissä: @oskarialex) / Twitter tai Linkedinissä: Oskari Heikkinen | LinkedIn

Enää yksi päivä aattoon! vielä jaksaa jaksaa pari pulmaa!

Microsoft Forms lomakkeella pystyt vastaamaan kyselyyn.

Pähkinän #22 vastaus

Vastaus pähkinään 21 ja 22 menee siis suurin piirtein samalla lailla. 22:ssa on vain * polussa! Vastauksia tuli 21 kysymykseen 8kpl ja 22 kysymykseen 6 kpl. Kiitos kaikille!

Joulupähkinä #22 – synapse on-demand SQL ja kansiorakenne

Tämän päivän pähkinä jatkaa siitä mihin eilinen jäi, eikä pitäisi olla kauhean monimutkainen! Sama kysymys, kuin eilen mutta ota kaikki lokakuut jokaiselta vuodelta! Tee laskenta yhdellä kyselyllä.

Aineisto on osoitteessa: https://qsynapse.dfs.core.windows.net/demodata/Microsoft/MicrosoftOpenData/parquet/taxi/year=2017/month=10/

Kansiossa on parquet formatoituja tiedostoja ja huomaa että tuossa esimerkkiosoitteessa on nyt vuosi 2017. Sun pitää kysellä kuitenkin yli kaikkien vuosien!

Käytössäsi on palvelin seuraavilla tiedoilla:

Palvelin: qdw-ondemand.sql.azuresynapse.net
käyttäjätunnus: joulu
salasana: kalenteri123!
tietokanta: joulu

Päivän #21 pähkinän tulos tulee vasta myöhemmin, koska tämä nojaa niin vahvasti siinä tehtyihin löydöksiin 🙂

Voit palauttaa tehtävän Microsoft Forms lomakkeella.

Joulupähkinä #21 – Synapse On-Demand SQL kyselyt

Tänään Synapsea! Tehtävänäsi on katsoa, montako matkaa, paljonko niistä on yhteensä veloitettu, sekä miten pitkä matka on kuljettu yhteensä aineistosta, jotka löytyvät datalakesta.

Aineisto on osoitteessa: https://qsynapse.dfs.core.windows.net/demodata/Microsoft/MicrosoftOpenData/parquet/taxi/year=2017/month=10/

Kansiossa on parquet formatoituja tiedostoja.

Käytössäsi on palvelin seuraavilla tiedoilla:

Palvelin: qdw-ondemand.sql.azuresynapse.net
käyttäjätunnus: joulu
salasana: kalenteri123!
tietokanta: joulu

Tuohon tietokantaan on liitetty credential automaattisesti, jota joulu-käyttäjällä on lupa käyttää. Luo siis kysely, joka kysyy tuosta kansiosta kaikkia tiedostoja. Sen jälkeen summaa sieltä löytyvät trip_distance ja total_amount ja lisäksi laske rivien lukumäärä. Palauta nämä tiedot vastauksessasi.

Vastauksen voit palauttaa Microsoft Forms -lomakkeella.

Pähkinän #20 vastaus

Pähkinä #20 oli vähän kompa. Se kuningasajatus on, että tuollainen exists-lause palauttaa aina true, jos kyseessä on aggregaatti… eli tämä palauttaa kaikki 8-riviä:

Ja jos otan tuon MIN() tuosta pois, palautuu vain 6-riviä:

Mutta mitään ei käytännössä tartte laskea, koska MIN-funktio palauttaa aina true.

Joulupähkinä #20 – SQL Serverin with-lauseet ja vertailut

Joulupähkinä #20 on SQL server with-lausepulma. Kysymys on, montako riviä kysely palauttaa?

Kyselyssä on 2 väliaikaistaulua ja ne palauttavat tietoja seuraavasti:

Ylempi kysely on siis productSales väliaikaistaulusta.

Seuraava kysely on CurrencySales-taulusta:

Ja kysymys kuuluu, montako riviä seuraava kysely palauttaa:

Vastaa rivien lukumääärä Microsoft Forms-lomakkeella.

Pähkinän #19 vastaus

Vastauksia tuli 4 kpl. Yhdessä vastauksessa kritisoitiin termistöä, joka oli itseasiassa ihan oikein! Juoksin tehtävän liian nopeasti, enkä käyttänyt oikeaa termiä “Tasaerä”.. Eli jokainen payment olisi saman kokoinen, sen takia vastauksia tuli pari erilaista, enkä voi sanoa kummankaan olevan väärin. Tavoitteenani oli käyttää termiä “tasaerä”, jolloin jokainen kk-maksu on aina yhtä iso. Ja oikeastaan tarkoituksena oli avata sitä että DAX:ssa on tosi paljon funktioita valmiina. Sellainen funktiolistan läpikäynti: DAX function reference – DAX | Microsoft Docs aina välillä olisi oikeasti ihan hyödyllistä ajankäyttöä!

Koodi, jolla tuohon datasettiin saa lyhennyksen näkyviin on: Lyhennys= PMT([Korko],[Laina-aika (vuotta)]*12,[Lainamäärä],0,0)

Joulupähkinä #19 – Matemaattiset laskennat DAX:lla

Päivän pähkinän ei pitäisi olla kovinkaan vaikea! Eli vähän laina-matematiikkaa. Tarkoitus olisi oheiseen tauluun lisätä sarake, joka laskee kk-maksun. Eli paljonko lainaa tulee maksaa kuukaudessa takaisin. Lainaa lyhennetään tasalyhennyksellä jokaisen kuukauden lopussa. Laina on nostettu kuukauden alussa.

Palauta siis kolumnin lisäyskoodi vastauksessasi.

Palautus onnistuu Microsoft Forms lomakkeella.

Pähkinän #18 vastaus

Pähkinässä yhdisteltiin MongoDB-tietokantaan. Yhdistin sinne itse Visual Studio Codella.

Siihen on saatavissa Azure Databases laajennus:

Connection stringin liittäminen onnistuu käyttöliittymästä

Ja sieltä voi ihan surffailla collectioneihin ja dokumentteihin. Sieltä se ainut dokumentti sitten löytyi:

Joulupähkinä #18 – MongoDB Azuressa!

Ensi viikolla on Joulu! Pähkinässä 18 otetaan yhteys MongoDB tietokantaan CosmosDB:n sisällä. Tehtävä on siis ottaa oheisella connection stringillä yhteys Cosmos DB:hen ja lukea sieltä collection: “joulu”. Siellä on yksi dokumentti, jossa on attribuutti “tehtava”. Palauta kyseinen kysymys ja vastaa siihen omin sanoin.

mongodb://qumio-mongodb:zTm7mNGvVGi9BRjgONCzg8vBKhuWTCcfDqML61wjkwa2yJwpRg4MxV7m4KMuDBGLW7oHsaNNf1FN82I5MPynAA==@qumio-mongodb.mongo.cosmos.azure.com:10255/?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000&appName=@qumio-mongodb@

Halutessasi mukaan kisaan, jätä vastauksesi Microsoft Forms lomakkeella

Joulupähkinän #17 ratkaisu

Joulupähkinään 17 tuli ratkaisuja 8 kpl. Kaikki olivat oikein! Kiitos kun vielä moni jaksaa vastailla. Nyt alkaa kyllä ihan samat nimet toistua melkein jokoa päivä 🙂

Käytin yhteyden muodostamiseen PowerShelliä. Ratkaisu meni seuraavasti:

Joulupähkinä #17 – Azure Storage Table nosql

Joulupähkinä #17 vie meidät nosql maailmaan ja tarkemmin Azure Storagen Table-apiin. Tehtävänäsi on hakea taulun sisältö ja palauttaa siellä oleva viesti vastauksessasi. Tauluja on accountissa 1 ja siinä taulussa on 1 objekti, joten mitään kauhean vaikeaa etsimistä ei tarvitse tehdä.

Azure Storagen Table api on hyödyllinen myös dataihmisille, jos on tarve säilöä dokumenttipohjaista dataa. Tietenkin Cosmos DB on ykkösvaihtoehto, mutta ei se Storage Table tarpeeton ole. Tämä ominaisuus on kuitenkin monelle jäänyt vähän ohuelle, joten tutustutaan siihen!

Tarvitsemasi SAS-avain on: https://joulu.table.core.windows.net/?sv=2019-12-12&ss=t&srt=sco&sp=rl&se=2020-12-18T05:34:56Z&st=2020-12-16T21:34:56Z&spr=https&sig=zznKDqRiDsptWlZGjlVJbZPuDz7Iq1z7G2aTsKGVCrU%3D

Kuten sanottu, palauta vastauksessasi viesti jonka löydät tablesta.

Voit palauttaa tuttuun tyyliin Microsoft Forms – lomakkeella.

Joulupähkinän #16 ratkaisu – SQL rekursio

Common Table Expression… Yhtä vastausta mukaillen: “Rekursio sattuu aina päähän.” … Välttämätön paha kaikenlaisessa rakenteellisissa kyselyissä ja joka kerta joutuu kattoon sitä samaa Microsoftin esimerkkiä 🙂

Mutta hienoa, 6 vastausta, kaikki oikein! Tässä yhden palautuksen koodi esimerkkivastauksena:

WITH CTE AS ( SELECT EmployeeKey, ParentEmployeeKey, convert(varchar(max), FirstName + ‘ ‘ +LastName) as fullname FROM DBO.DimEmployee WHERE ParentEmployeeKey IS NULL UNION ALL SELECT t.EmployeeKey, t.ParentEmployeeKey, c.fullname + ‘/’ + convert(varchar(max), t.FirstName + ‘ ‘ + t.LastName) FROM DBO.DimEmployee t INNER JOIN CTE c on c.EmployeeKey = t.ParentEmployeeKey ) select e.*, c.fullname as organisaatio from DimEmployee e left join CTE c on e.EmployeeKey = c.EmployeeKey