Power Query连接Azure存储表时出现间歇性OData格式不支持错误
问题场景
使用Azure AI知识库,数据存储于Azure Storage Tables中,在Power BI Desktop或Power Query Online查询数据时,间歇性触发以下错误:
DataFormat.Error: OData: The format 'application/json;odata=fullmetadata;streaming=true;charset=utf-8' is not supported.
Details:
application/json;odata=fullmetadata;streaming=true;charset=utf-8
用户使用的Power Query代码如下:
Source = AzureStorage.Tables(KnowledgeStoreStorageAccount), ThisTable = Table.Buffer(Source{[Name=GetTableName("Document")]}[Data]), RemovedColumns = Table.RemoveColumns(ThisTable,ColumnsToRemove), ExpandedContent = Table.ExpandRecordColumn(RemovedColumns, "Content", Record.FieldNames(RemovedColumns{0}[Content])) in ExpandedContent
排查情况:硬编码表名仍会触发错误,尝试Table.Buffer无效,刷新后可临时恢复;数据量极小(最多几百行),Power Query Online也存在相同问题。
解决方案
1. 强制指定请求格式
绕过AzureStorage.Tables内置连接器,改用Web.Contents直接调用Azure Table Storage的OData API,显式设置支持的请求格式头,避免连接器自动生成不兼容的格式参数。示例代码:
StorageAccount = "your-storage-account-name", TableName = GetTableName("Document"), Url = "https://" & StorageAccount & ".table.core.windows.net/" & TableName, Headers = [ #"Accept" = "application/json;odata=minimalmetadata", #"x-ms-version" = "2020-08-04" ], Source = Web.Contents(Url, [Headers=Headers]), JsonData = Json.Document(Source), Rows = JsonData[value], ToTable = Table.FromRecords(Rows), RemovedColumns = Table.RemoveColumns(ToTable, ColumnsToRemove), ExpandedContent = Table.ExpandRecordColumn(RemovedColumns, "Content", Record.FieldNames(RemovedColumns{0}[Content])) in ExpandedContent
注:需确保Power BI已配置Azure Storage的合法访问权限(如OAuth认证或SAS令牌)。
2. 添加错误重试逻辑
针对间歇性错误,在Power Query中添加自定义重试函数,捕获指定错误时自动重试请求。示例:
RetryFunction = (retryCount as number) as table => try let Source = AzureStorage.Tables(KnowledgeStoreStorageAccount), ThisTable = Source{[Name=GetTableName("Document")]}[Data] in ThisTable otherwise if retryCount > 0 then RetryFunction(retryCount - 1) else error "重试次数耗尽", ThisTable = RetryFunction(3), RemovedColumns = Table.RemoveColumns(ThisTable, ColumnsToRemove), ExpandedContent = Table.ExpandRecordColumn(RemovedColumns, "Content", Record.FieldNames(RemovedColumns{0}[Content])) in ExpandedContent
可根据实际情况调整重试次数(示例中为3次)。
3. 更新Power BI及连接器
确保Power BI Desktop为最新版本,同时检查Azure Storage Tables连接器是否已更新——旧版本连接器可能存在OData格式兼容性的间歇性Bug,更新后可解决部分问题。
内容的提问来源于stack exchange,提问作者MikeAinOz

