Over the past few years I’ve blogged and presented extensively on the subject of Power Query’s data privacy settings (see here for a post with links to all this content). I thought I knew everything there was to know… but of course I didn’t, and I’ve recently learned about an issue that can cause mysterious errors.
As always it’s easiest to show an example of how it can occur. Here’s a table of airport names taken from the TripPin public OData feed:
Note how the Location column contains nested values of data type Record, and note that I have not expanded this column.
Here’s another query with sales data for these airports coming from Excel:
Now let’s say we want to join these two queries together using a Merge operation in the Power Query Editor. When you do this, because you are combining data from two different sources and because OData supports query folding, you will be prompted to set data privacy settings on these sources (unless you have already done so at some point in the past) because a Merge could result in data being sent from Excel to the OData source.
If you set the data privacy levels to Private on each source, like so:
…you are telling Power Query that it should never send data from these sources to any other source. As a result, Power Query has to load the data from both sources, buffer that data in memory, and do the Merge inside its own engine.
When you do the Merge everything looks normal at first:
But when you expand the Airports column you’ll see that the nested values in the Location column have been turned into the text “[Record]” and as a result can no longer be expanded.
This is because Power Query has had to buffer the values in the Airports query but it is unable to buffer nested values (I wrote about this here).
There are two ways to fix this. First of all, you can change the data privacy settings or turn them off completely. I don’t recommend turning them off completely because this is only possible in Power BI Desktop and not in the Power BI Service, and even changing the data privacy settings can lead to some unexpected issues later on. For example, if you set the data privacy levels for both sources to Public like so:
…then no buffering is needed (because data can now be sent from one source to another) and the nested values in the Location field can be expanded:
…and of course you do so:
However, people always forget that you have to set your data privacy levels again after publishing your dataset to the Power BI Service. And if you or someone else subsequently sets the data privacy levels back to Private you’ll get the following error in the output of the query:
The error message here is:
“Expression.Error: We cannot convert the value “[Record]” to type Record.”
Depending on the data type of the nested field you might get:
“Expression.Error: We cannot convert the value “[Table]” to type Table.”
or
“Expression.Error: We cannot convert the value “[List]” to type List.”
…instead.
The second way to fix the problem is easier and probably safer: you just need to expand the Location column before the Merge operation instead of after it. That way there are no nested fields present when the Merge takes place so all the values can be buffered. Here’s what the Airports table looks like after the Location column has been expanded, before the Merge:
…and here’s the output of the Merge even when the data privacy levels for both sources are set to Private: