配置增量刷新和实时数据

本文介绍如何为语义模型配置增量刷新和实时数据。 若要了解如何为数据流配置增量刷新,请参阅数据流的高级功能 - 增量刷新

配置增量刷新包括创建 RangeStart 和 RangeEnd 参数、应用筛选器以及定义增量刷新策略。 发布到 Power BI 服务后,你将对模型执行初始刷新操作。 初始刷新操作和后续的刷新操作会应用你定义的增量刷新策略。 在完成这些步骤之前,请确保完全了解语义模型增量刷新和实时数据中所述的功能。

创建参数

在此任务中,你将使用 Power Query 编辑器创建具有默认值的 RangeStart 和 RangeEnd 参数。 仅当筛选要在 Power BI Desktop 中加载到模型中的数据时,默认值才适用。 输入的值应该只包含来自数据源的少量最新数据。 发布到服务时,这些时间范围会由增量刷新策略替代。 也就是说,策略会逐个创建传入数据的窗口。

  1. 在 Power BI Desktop 中,选择“主页”功能区上的“转换数据”以打开 Power Query 编辑器。

  2. 选择“管理参数”下拉列表,然后选择“新建参数”。

  3. 在“名称”字段中,输入 RangeStart(区分大小写)。 在“类型”字段中,从下拉列表中选择“日期/时间”。 在“当前值”字段中,输入开始日期和时间值。

    Define the Range Start parameter in the Manage Parameters dialog.

  4. 选择“新建”以创建名为 RangeEnd 的第二个参数。 在“类型”字段中,选择“日期/时间”,然后在“当前值”字段中输入结束日期和时间值。 选择“确定”

    Define the Range End parameter in the Manage Parameters dialog.

现在,你已定义 RangeStart 和 RangeEnd 参数,接下来,可以根据这些参数对要加载到模型中的数据进行筛选。

筛选数据

注意

继续执行此任务前,请先验证源表是否有数据类型为日期/时间的日期列。 如果没有日期/时间列,但具有格式为 yyyymmdd 的整数代理键日期列,请按照本文后面的将 DateTime 转换为整数中的步骤,创建一个函数,用于将参数中的日期/时间值转换为与源表的整数代理键匹配的值。

现在你将根据 RangeStart 和 RangeEnd 参数中的条件应用筛选器。

  1. 在 Power Query 编辑器中,选择要筛选的日期列,然后选择下拉箭头 >“日期筛选器”>“自定义筛选器”。

  2. 在“筛选行”中,若要指定第一个条件,请选择“晚于”或“晚于或等于”,再选择“参数”,然后选择“RangeStart”。

    若要指定第二个条件,如果已在第一个条件中选择“晚于”,则选择“早于或等于”,而如果已在第一个条件中选择“晚于或等于”,则在第二个条件中选择“早于”,再选择“参数”,然后选择“RangeEnd”。

    Filter rows dialog showing Range Start and Range End conditions.

    重要说明: 确保查询中的 RangeStart 或 RangeEnd 参数上存在一个等号 (=),但二者不能同时具有等号。 如果这两个参数都具有等号 (=),部分行可能满足两个分区的条件,导致模型中存在重复数据。 例如,如果 OrderDate 同时等于 RangeStart 和 RangeEnd,则 = Table.SelectRows(#"Changed Type", each [OrderDate] >= RangeStart and [OrderDate] <= RangeEnd) 可能会导致数据重复。

    选择“确定”以关闭。

  3. 在 Power Query 编辑器的“主页”功能区中,选择“关闭并应用”。 Power Query 会根据 RangeStart 和 RangeEnd 参数定义的筛选器以及你定义的任何其他筛选器加载数据。

    Power Query 仅加载 RangeStart 和 RangeEnd 参数之间指定的数据。 根据该时间段内的数据量,表的加载速度应该很快。 如果看起来很慢并且处理强度大,则可能是查询没有折叠

定义策略

定义了 RangeStart 和 RangeEnd 参数,并根据这些参数对数据进行筛选后,便可定义增量刷新策略。 只有在将模型发布到服务并执行手动或计划的刷新操作后,此策略才适用。

  1. 在数据视图中,右键单击“数据”窗格中的表,然后选择“增量刷新”。

    Data view showing Table context menu with Incremental refresh selected.

  2. 在“增量刷新和实时数据”>“选择表”中,验证或选择表。 “选择表”列表框的默认值是你在数据视图中选择的表。

  3. 指定所需的设置:

    在“设置导入和刷新范围”>“增量刷新此表”中,将滑块移动到“开”。 如果滑块处于禁用状态,则意味着表的 Power Query 表达式不包括基于 RangeStart 和 RangeEnd 参数的筛选器。

    在“存档数据开始日期”中,指定要包括在模型中的历史存储期。 除非应用其他筛选器,否则此期间内所有带有日期的行将加载到服务的模型中。

    在“增量刷新数据开始日期”中,指定“刷新”周期。 每次 Power BI 服务执行手动或计划的刷新操作时,都会在模型中刷新该周期内所有带日期的行。

  4. 指定可选设置:

    在“选择可选设置”中,选择“使用 DirectQuery (仅限高级版)实时获取最新数据”以包含上次刷新周期后数据源上发生的最新数据更改。 此设置会导致增量刷新策略将 DirectQuery 分区添加到表中。

    选择“仅刷新完整天数”以仅刷新全天。 如果刷新操作检测到某一天不完整,则不会刷新这一天的行。 选择“使用 DirectQuery (仅限高级版)实时获取最新数据”时,会自动启用此选项。

    选择“检测数据更改”,指定用于仅标识和刷新数据更改日期的日期/时间列。 数据源中必须存在日期/时间列(通常出于审核目的)。 此列不应与用于使用 RangeStart 和 RangeEnd 参数对数据进行分区的列相同。 将针对增量范围中的每个周期评估此列的最大值。 如果自上次刷新后未更改,则无需刷新当前周期。 对于发布到高级容量的模型,还可以指定自定义查询。 若要了解详细信息,请参阅高级增量刷新 - 用于检测数据更改的自定义查询

    根据设置,策略应如下所示:

    Incremental refresh and real-time data policy dialog showing incremental refresh range.

  5. 检查设置,然后选择“应用”以完成刷新策略。 此步骤不会加载数据。

保存并发布到服务

RangeStart 和 RangeEnd 参数、筛选和刷新策略设置完成后,保存模型,然后将其发布到服务。 如果模型将变得很大,请务必在调用服务中的第一次刷新前启用大型模型存储格式

刷新模型

在服务中刷新模型。 第一次刷新将在刷新周期内加载新数据和更新的数据,以及整个存储期间的历史数据。 此次刷新可能需要很长时间,具体取决于数据量。 后续刷新(手动或计划刷新)通常要快得多,因为应用了增量刷新策略,只有刷新策略设置中所指定周期的数据才会刷新。

将 DateTime 转换为整数

只有在表使用整数代理键而不是要用于 RangeStart 和 RangeEnd 筛选器定义的日期列中的日期/时间值时,才需要执行此任务。

RangeStart 和 RangeEnd 参数的数据类型必须是日期/时间数据类型,而不考虑日期列的数据类型。 但是,对于许多数据源,表没有数据类型为日期/时间的列,而是具有格式为 yyyymmdd 的整数代理键日期列。 通常无法将这些整数代理键转换为日期/时间数据类型,因为结果将是非折叠查询表达式,但你可以创建一个函数来转换参数中的日期/时间值,以匹配数据源表的整数代理键,而不会失去可折叠性。 然后,在筛选步骤中调用该函数。 如果数据源表仅包含代理键作为整数数据类型,就必须执行此转换步骤。

  1. 在 Power Query 编辑器的“主页”功能区中,选择“新建源”下拉列表,然后选择“空白查询”。

  2. 在“查询设置”中,键入名称(例如 DateKey),然后在公式编辑器中输入以下公式:

    = (x as datetime) => Date.Year(x)*10000 + Date.Month(x)*100 + Date.Day(x)

    Power BI function editor showing the integer surrogate DateKey function.

  3. 若要测试公式,请在“输入参数”中输入日期/时间值,然后选择“调用”。 如果公式正确,则返回日期的整数值。 验证后,删除此新的调用的函数查询。

  4. 在“查询”中,选择表,然后编辑查询公式,调用具有 RangeStart 和 RangeEnd 参数的函数。

    = Table.SelectRows(#"Reordered Column OrderDateKey", each [OrderDateKey] > DateKey(RangeStart) and [OrderDateKey] <= DateKey(RangeEnd))

    Power BI table showing DateKey filter.