Power BI 从嵌套的记录值创建列
Power BI create column from nested Record values
我正在尝试从列表类型列中的一条记录创建一个新列。该值是与纬度和经度字段对应的国家/地区。信息是从 Bing 地图 API 中检索的,它使用从 Web 获取数据(遵循此处的教程:https://sqldusty.com/2016/04/26/power-bi-and-the-bing-maps-api/)。
基本上我需要List.Record[1].address.countryRegion。是否可以在不执行 "Expand to new rows" 的情况下创建一个包含此特定值的列?问题是部分列返回法国,行数增加到 1000 多行,但应该只有 250 左右。
这是我如何得到列表列的方法:
1. 从网络获取数据
2. 使用基本选项并粘贴工作 API 位置请求与我的 bing 地图键。然后点击确定。
http://dev.virtualearth.net/REST/v1/Locations/point=40,-122?&key=BingMapsKey
3. 导航到视图 > 高级编辑器中的高级编辑器。
4. 制作了一个使用纬度和经度作为输入的函数
let getCountry = (Latitude as text, Longitude as text) =>
let
Source = Json.Document(Web.Contents("http://dev.virtualearth.net/REST/v1/Locations/point="& Latitude &","& Longitude &"?&key=BingMapsKey"))
in
Source
in
getCountry
5. 将函数重命名为 GetCountry,然后导航到所需的 table 以将列添加到(带有纬度和经度)
6. 在目标 table 中,导航到添加列 > 调用自定义函数
7. 从函数列表中选择 GetCountry,将类型更改为列名并将输入分配给相应的列名(纬度和经度)。然后单击确定。
8. 该列显示在右侧。我过滤掉了 'resourceSets' 以外的所有列,因为它具有地址值。
EDIT 我找到了一种减少请求中返回的列表数量的方法,即只请求 Country/Region 作为查询参数:
http://dev.virtualearth.net/REST/v1/Locations/40,-122?key=BingMapsKey&includeEntityTypes=CountryRegion
这暂时可以满足我的需要,但也许最好将其保持打开状态,看看是否有人知道如何从嵌套的 table 值中生成 table?感谢您的帮助!
您是否使用参数来过滤您想要的行?
看看那里:
这对我来说听起来像是 XY Problem。让我试着澄清一下:
Table.ExpandListColumn
函数将记录扩展为多行,因为 API 端点确实返回了多行记录。
- 除非您之后应用过滤器逻辑,否则代码无法理解要选择哪一行记录。
API 不应返回多行记录。 (找到给定 (lat, long)
的 countryRegion
)
因此,在通读问题后,真正的问题在于您使用的 API 端点。
应该是
http://dev.virtualearth.net/REST/v1/Locations/40,-122?key=yourAPIKey
而不是
http://dev.virtualearth.net/REST/v1/Locations/point=40,-122?key=yourAPIKey
不需要point=
。 (是的,documentation 有点令人困惑)
因此您可以按如下方式更新 GetCountry
函数:
let getCountry = (Latitude as text, Longitude as text) =>
let
Source = Json.Document(Web.Contents("http://dev.virtualearth.net/REST/v1/Locations/"& Latitude &","& Longitude &"?key=yourAPIKey"))
in
Source
in
getCountry
(旁注:最好不要将 API 密钥暴露给 public :))
因此,每个地方应该只有一个countryRegion
。
我的查询供您参考:
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45Wcs/PT89JLchJrVDSUTI21zMxMjIwMACydQ2NjPQMLEwMTM2VYnWilRwLgIoUPPPSMvMyS1IVfPLzCyA6jI0NzczN4DqMDQwtLJViYwE=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Place = _t, Lat = _t, Long = _t]),
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Place", type text}}),
#"Invoked Custom Function" = Table.AddColumn(#"Changed Type", "GetCountry", each GetCountry([Lat], [Long])),
#"Expanded GetCountry" = Table.ExpandRecordColumn(#"Invoked Custom Function", "GetCountry", {"resourceSets"}, {"GetCountry.resourceSets"}),
#"Expanded GetCountry.resourceSets" = Table.ExpandListColumn(#"Expanded GetCountry", "GetCountry.resourceSets"),
#"Expanded GetCountry.resourceSets1" = Table.ExpandRecordColumn(#"Expanded GetCountry.resourceSets", "GetCountry.resourceSets", {"resources"}, {"resources"}),
#"Expanded resources" = Table.ExpandListColumn(#"Expanded GetCountry.resourceSets1", "resources"),
#"Expanded resources1" = Table.ExpandRecordColumn(#"Expanded resources", "resources", {"address"}, {"address"}),
#"Expanded address" = Table.ExpandRecordColumn(#"Expanded resources1", "address", {"countryRegion"}, {"countryRegion"})
in
#"Expanded address"
希望对您有所帮助:)
我正在尝试从列表类型列中的一条记录创建一个新列。该值是与纬度和经度字段对应的国家/地区。信息是从 Bing 地图 API 中检索的,它使用从 Web 获取数据(遵循此处的教程:https://sqldusty.com/2016/04/26/power-bi-and-the-bing-maps-api/)。
基本上我需要List.Record[1].address.countryRegion。是否可以在不执行 "Expand to new rows" 的情况下创建一个包含此特定值的列?问题是部分列返回法国,行数增加到 1000 多行,但应该只有 250 左右。
这是我如何得到列表列的方法:
1. 从网络获取数据
2. 使用基本选项并粘贴工作 API 位置请求与我的 bing 地图键。然后点击确定。
http://dev.virtualearth.net/REST/v1/Locations/point=40,-122?&key=BingMapsKey
3. 导航到视图 > 高级编辑器中的高级编辑器。
4. 制作了一个使用纬度和经度作为输入的函数
let getCountry = (Latitude as text, Longitude as text) =>
let
Source = Json.Document(Web.Contents("http://dev.virtualearth.net/REST/v1/Locations/point="& Latitude &","& Longitude &"?&key=BingMapsKey"))
in
Source
in
getCountry
5. 将函数重命名为 GetCountry,然后导航到所需的 table 以将列添加到(带有纬度和经度)
6. 在目标 table 中,导航到添加列 > 调用自定义函数
7. 从函数列表中选择 GetCountry,将类型更改为列名并将输入分配给相应的列名(纬度和经度)。然后单击确定。
8. 该列显示在右侧。我过滤掉了 'resourceSets' 以外的所有列,因为它具有地址值。
EDIT 我找到了一种减少请求中返回的列表数量的方法,即只请求 Country/Region 作为查询参数:
http://dev.virtualearth.net/REST/v1/Locations/40,-122?key=BingMapsKey&includeEntityTypes=CountryRegion
这暂时可以满足我的需要,但也许最好将其保持打开状态,看看是否有人知道如何从嵌套的 table 值中生成 table?感谢您的帮助!
您是否使用参数来过滤您想要的行?
看看那里:
这对我来说听起来像是 XY Problem。让我试着澄清一下:
Table.ExpandListColumn
函数将记录扩展为多行,因为 API 端点确实返回了多行记录。- 除非您之后应用过滤器逻辑,否则代码无法理解要选择哪一行记录。
API 不应返回多行记录。 (找到给定
(lat, long)
的countryRegion
)
因此,在通读问题后,真正的问题在于您使用的 API 端点。
应该是
http://dev.virtualearth.net/REST/v1/Locations/40,-122?key=yourAPIKey
而不是
http://dev.virtualearth.net/REST/v1/Locations/point=40,-122?key=yourAPIKey
不需要point=
。 (是的,documentation 有点令人困惑)
因此您可以按如下方式更新 GetCountry
函数:
let getCountry = (Latitude as text, Longitude as text) =>
let
Source = Json.Document(Web.Contents("http://dev.virtualearth.net/REST/v1/Locations/"& Latitude &","& Longitude &"?key=yourAPIKey"))
in
Source
in
getCountry
(旁注:最好不要将 API 密钥暴露给 public :))
因此,每个地方应该只有一个countryRegion
。
我的查询供您参考:
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45Wcs/PT89JLchJrVDSUTI21zMxMjIwMACydQ2NjPQMLEwMTM2VYnWilRwLgIoUPPPSMvMyS1IVfPLzCyA6jI0NzczN4DqMDQwtLJViYwE=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Place = _t, Lat = _t, Long = _t]),
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Place", type text}}),
#"Invoked Custom Function" = Table.AddColumn(#"Changed Type", "GetCountry", each GetCountry([Lat], [Long])),
#"Expanded GetCountry" = Table.ExpandRecordColumn(#"Invoked Custom Function", "GetCountry", {"resourceSets"}, {"GetCountry.resourceSets"}),
#"Expanded GetCountry.resourceSets" = Table.ExpandListColumn(#"Expanded GetCountry", "GetCountry.resourceSets"),
#"Expanded GetCountry.resourceSets1" = Table.ExpandRecordColumn(#"Expanded GetCountry.resourceSets", "GetCountry.resourceSets", {"resources"}, {"resources"}),
#"Expanded resources" = Table.ExpandListColumn(#"Expanded GetCountry.resourceSets1", "resources"),
#"Expanded resources1" = Table.ExpandRecordColumn(#"Expanded resources", "resources", {"address"}, {"address"}),
#"Expanded address" = Table.ExpandRecordColumn(#"Expanded resources1", "address", {"countryRegion"}, {"countryRegion"})
in
#"Expanded address"
希望对您有所帮助:)