PowerBI Server上提供的计划刷新功能很方便,但也有一定的限制,比如刷新次数最大为每天48次,而这还是需要Premium许可的情况下才拥有的刷新次数,如果只是Pro许可,那么刷新次数就只有每天8次。此外,计划刷新时是刷新整个数据集的,此时可能只是部分表的数据有变化,但仍然刷新了所有表,增加了不必要的刷新时间。虽然有这些限制,但一般来说,计划刷新功能已经足够使用。
但如果想突破最大刷新次数或只刷新数据集中的部分表,那么可以通过REST API的方式来进行刷新,使用REST API的增强型刷新可以只刷新数据集中的部分表,并且可以突破每天48次的刷新次数,但这需要Premium许可才行,Pro许可的刷新次数仍然被限制在每天8次。
另外,当对数据的实时性有一定要求时,也经常使用REST API来进行刷新,比如该常见场景:当数据库的数据更新后就同步最新数据到PowerBI报表上。由于数据库的数据更新可能具有不确定性,此时采用计划刷新将使PowerBI报表上的数据存在延时,因此在该场景下通常是把刷新报表的操作嵌入到ETL的某个环节中,从而需要使用到REST API。
调用REST API刷新报表
PowerBI的REST API有很多,这里只介绍刷新报表所用到的API,若对其它API感兴趣,可以自行浏览官方文档:了解 Power BI REST API。
API接口:
Url:https://api.powerbi.com/v1.0/myorg/groups/{groupId}/datasets/{datasetId}/refreshes # Global
Url:https://api.powerbi.cn/v1.0/myorg/groups/{groupId}/datasets/{datasetId}/refreshes # 21Vianet
Method:POST
Request Headers: {Authorization:访问令牌, Content-Type:application/json}
1、默认刷新整个数据集:
Request Body = {}
2、增强型刷新,可刷新部分表
Request Body =
{
"type": "full",
"commitMode": "transactional",
"maxParallelism": 2,
"retryCount": 2,
"objects": [
{"table": "tableName1"},
{"table": "tableName2"}
]
}
参数说明:
1. 访问令牌
关于获取访问令牌的具体步骤与原理,请参考我的另一篇文章:Azure应用注册与访问令牌获取,并从该文章末尾处复制给出的现成代码,然后填写相关参数即可。注意:需要给Azure应用授予PowerBI Services的Dataset.ReadWrite.All权限。
2. groupId与datasetId
groupId与datasetId为需要刷新的报表所关联的数据集所在的工作区ID与数据集ID,一般来说报表与数据集都是位于同一工作区的,但如果报表与数据集分别位于不同的工作区时就需要注意,使用的是数据集所在的工作区的ID。
可以打开报表所关联的数据集,然后从浏览器上方地址栏处获取这两个ID,具体如下图所示:
3. Request Body
该参数为调用API时的请求体参数,通过它可以更细致的控制刷新时的行为,比如指定只刷新某几个表,以及刷新失败是否有邮件通知,失败后重新尝试多少次等等。如果采用默认的刷新策略,那么将该参数设置为:{}
即可。如果想要刷新某几个表,那么可以设置为:
{
"type": "full",
"commitMode": "transactional",
"maxParallelism": 2,
"retryCount": 2,
"objects": [
{"table": "tableName1"},
{"table": "tableName2"}
...
]
}
以上只是简单的举例,关于Request Body的更多信息与说明,请见官方文档。
当所有参数都获取到后,就可以调用该REST API刷新报表了。以Python为例,调用REST API刷新报表的代码如下:
def refresh_pbi_dataset(ENVIRONMENT_TYPE,TOKEN,WORKSPACE_ID,DATASET_ID,REQUEST_BODY={}):
# refresh pbi dataset and return refresh status
if ENVIRONMENT_TYPE.lower() not in ['global','21vianet']:
return 404
apiRootUrl = 'https://api.powerbi.com/v1.0/myorg/groups/' if ENVIRONMENT_TYPE.lower()=="global" else 'https://api.powerbi.cn/v1.0/myorg/groups/'
refresh_api = apiRootUrl + WORKSPACE_ID + '/datasets/' + DATASET_ID + '/refreshes'
response = requests.post(refresh_api, headers={'authorization':TOKEN},json=REQUEST_BODY)
return response.status_code
# Refreash Entire Dataset:
result = refresh_pbi_dataset(ENVIRONMENT_TYPE,TOKEN,WORKSPACE_ID,DATASET_ID)
# Refreash some tables in Dataset:
REQUEST_BODY = {
"type": "full",
"commitMode": "transactional",
"maxParallelism": 2,
"retryCount": 2,
"objects": [
{"table": "tableName1"},
{"table": "tableName2"}
]
}
result = refresh_pbi_dataset(ENVIRONMENT_TYPE,TOKEN,WORKSPACE_ID,DATASET_ID,REQUEST_BODY)
注意事项
1、服务主体API访问
在获取访问令牌时,若选择使用服务主体模式,则必须在PowerBI Service的门户管理中打开服务主体API访问的功能,若只使用主用户模式,则不用打开该功能。
2、工作区的访问权限
获取访问令牌时无论是使用主用户模式还是服务主体模式,都需要给相应的主用户或服务主体授予工作区的访问权限。具体的权限级别视情况而定,比如刷新报表就需要参与者或以上权限,如果是共享报表那就需要成员或以上权限,因此建议授予成员或管理员权限是比较好的。
给工作区添加权限时,如果添加的是服务主体,则使用Azure应用的名称进行搜索并添加;如果添加的是主用户,则使用主用户的名称或邮箱进行搜索并添加。
完整的实现代码
为方便使用,下面给出从获取访问令牌到调用REST API刷新PowerBI报表的完整实现代码,有多个版本,可自选其一,均支持国际版与世纪互联两个环境,且可以选择使用主用户或服务主体模式,只需要填写相应参数即可。