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。让我试着澄清一下:

  1. Table.ExpandListColumn 函数将记录扩展为多行,因为 API 端点确实返回了多行记录。

    • 除非您之后应用过滤器逻辑,否则代码无法理解要选择哪一行记录。
  2. 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"

希望对您有所帮助:)