increment_key

用法

view: my_view {
  derived_table: {
    increment_key: "created_date"
    ...
  }
}
层次结构
increment_key

- 或 -

increment_key
默认值

接受
基于时间的 LookML 维度的名称

特殊规则
increment_key 仅支持持久表,且仅适用于特定方言

定义

如果您的 dialect 支持增量 PDT,您可以在项目中创建增量 PDT。增量 PDT 是一种永久性派生表 (PDT),Looker 通过将最新数据附加到该表来构建它,而不是重建整个表。如需了解详情,请参阅增量 PDT 文档页面。

increment_key 参数用于指定应查询哪些时间增量的新鲜数据并将其附加到 PDT,从而将 PDT 转换为增量 PDT。除了 increment_key 之外,您还可以选择提供 increment_offset 来指定重新构建的先前时间段数(以增量键的粒度为单位),以考虑迟到的数据。

PDT 的 increment_key 与 PDT 的持久性触发器无关。如需查看一些示例场景,了解 increment_keyincrement_offset 和持久性策略的互动,请参阅增量 PDT 文档页面。

increment_key 参数仅适用于受支持的方言,并且仅适用于具有持久性策略的表,例如 PDT 和汇总表(一种 PDT)。

increment_key 必须指定基于时间的 LookML 维度:

此外,increment_key 必须:

  • 截断的绝对时间,例如天、月、年、财政季度等。不支持“星期几”等时间范围。
  • 随着新数据的增加而可预测地增加的时间戳,例如订单创建日期。换句话说,只有当添加到表中的最新数据也具有最新时间戳时,才应将时间戳用作增量键。用户生日等时间戳不适合作为增量键,因为随着向表中添加新用户,生日时间戳不会可靠地增加。

创建基于 LookML 的增量 PDT

如需将 基于 LookML(原生)的 PDT 转换为增量 PDT,请使用 increment_key 参数指定基于时间的 LookML 维度的名称。维度必须在 PDT 的 explore_source 所基于的视图中定义。

例如,以下是基于 LookML 的 PDT 的视图文件,其中使用了 explore_source LookML 参数。PDT 是根据 flights 探索创建的,在本示例中,该探索基于 flights 视图:

view: flights_lookml_incremental_pdt {
  derived_table: {
    indexes: ["id"]
    increment_key: "departure_date"
    increment_offset: 3
    datagroup_trigger: flights_default_datagroup
    distribution_style: all
    explore_source: flights {
      column: id {}
      column: carrier {}
      column: departure_date {}
    }
  }

  dimension: id {
    type: number
  }
  dimension: carrier {
    type: string
  }
  dimension: departure_date {
    type: date
  }
}

首次对此表运行查询时,系统会完整构建此表。之后,系统会以一天 (increment_key: departure_date) 为增量重建 PDT,最多回溯三天 (increment_offset: 3)。

departure_date 维度实际上是 departure 维度组中的 date 时间范围。(如需简要了解维度组的工作原理,请参阅 dimension_group 参数文档页面。)维度组和时间范围均在 flights 视图中定义,该视图是相应 PDT 的 explore_source。以下是 departure 维度组在 flights 视图文件中的定义方式:

...
  dimension_group: departure {
    type: time
    timeframes: [
      raw,
      date,
      week,
      month,
      year
    ]
    sql: ${TABLE}.dep_time ;;
  }
...

创建基于 SQL 的增量 PDT

Looker 建议您使用基于 LookML 的(原生)派生表作为增量 PDT 的基础,而不是使用基于 SQL 的派生表。原生派生表本身可以处理增量 PDT 所需的复杂逻辑。基于 SQL 的 PDT 依赖于手动创建的逻辑,在与高度复杂的功能搭配使用时容易出错。

如需定义增量 SQL 型 PDT,请像使用基于 LookML 的 PDT 一样使用 increment_key 和(可选)increment_offset。不过,由于基于 SQL 的 PDT 不是基于 LookML 视图文件,因此要将基于 SQL 的 PDT 转换为增量 PDT,还需要满足以下额外要求:

  • 您必须根据在 PDT 的视图文件中定义的时间型 LookML 维度来确定增量键。
  • 您必须在 PDT 中提供 {% incrementcondition %} Liquid 过滤条件,以将增量键连接到增量键所基于的数据库时间列。{% incrementcondition %} 过滤条件必须指定数据库中列的名称,而不是 SQL 别名或基于该列的维度的名称(请参阅以下示例)。

Liquid 过滤器的基本格式如下:

   WHERE {% incrementcondition %} database_table_name.database_time_column {% endincrementcondition %}

例如,以下是基于 SQL 的 PDT 的视图文件,该 PDT 以一天为增量 (increment_key: "dep_date") 进行重建,其中最近三天的数据将在重建时添加到表中 (increment_offset: 3):

view: sql_based_incremental_date_pdt {
  derived_table: {
    datagroup_trigger: flights_default_datagroup
    increment_key: "dep_date"
    increment_offset: 3
    distribution_style: all
    sql: SELECT
        flights.id2  AS "id",
        flights.origin  AS "origin",
        DATE(flights.leaving_time )  AS "departure"
      FROM public.flights  AS flights
      WHERE {% incrementcondition %} flights.leaving_time {%  endincrementcondition %}
          ;;
  }

  dimension_group: dep {
    type: time
    timeframes: [date, week, month, year]
    datatype: date
    sql:  ${TABLE}.departure
    ;;
  }
  dimension: id {
      type: number
    }
    dimension: origin {
      type: string
  }
}

请注意有关此示例的以下事项:

  • 派生表基于 SQL 语句。此 SQL 语句会在派生表中创建一个基于数据库中 flights.leaving_time 列的列。该列的别名为 departure
  • PDT 的视图文件定义了一个名为 dep 的维度组。
    • 维度组的 sql 参数表示该维度组基于派生表中的 departure 列。
    • 维度组的 timeframes 参数包含 date 作为时间范围。
  • 派生表的 increment_key 使用 dep_date 维度,该维度基于 dep 维度组的 date 时间范围。(如需简要了解维度组的工作原理,请参阅 dimension_group 参数文档页面。)
  • {% incrementcondition %} Liquid 过滤条件用于将增量键与数据库中的 flights.leaving_time 列相关联。
    • {% incrementcondition %} 必须指定数据库中 TIMESTAMP 列的名称(或必须评估为数据库中的 TIMESTAMP 列)。
    • {% incrementcondition %} 必须根据 FROM 子句(用于定义 PDT)中可用的内容进行评估,例如 FROM 子句中指定的表中的列。{% incrementcondition %} 不能引用 SELECT 语句的结果,例如 SQL 语句中指定给列的别名,或基于该列的维度的名称。在此示例中,{% incrementcondition %}flights.leaving_time。由于 FROM 子句指定了 flights 表,因此 {% incrementcondition %} 可以引用 flights 表中的列。
    • {% incrementcondition %} 必须指向用于增量密钥的同一数据库列。在此示例中,增量键为 dep_date,这是一个由 PDT 中的 departure 列定义的维度,该列是数据库中 flights.leaving_time 列的别名。因此,过滤条件指向 flights.leaving_time
WHERE {% incrementcondition %} flights.leaving_time {%  endincrementcondition %}

您可以向 WHERE 子句添加内容,以创建其他过滤条件。例如,如果数据库表中的数据可追溯到很多年前,您可以创建一个过滤条件,以便 PDT 的初始构建仅使用特定日期之后的数据。以下 WHERE 会创建一个包含 2020 年 1 月 1 日之后数据的 PDT:

WHERE {% incrementcondition %} flights.leaving_time {%  endincrementcondition %}
  AND flights.leaving_time > '2020-01-01'

您还可以使用 WHERE 子句在 SQL 中将数据解析为时间戳,然后为其指定别名。例如,以下增量 PDT 使用基于 text_column 的 15 分钟增量,text_column 是已解析为时间戳数据的字符串数据:

view: sql_based_incremental_15min_pdt {
  derived_table: {
    datagroup_trigger: flights_default_datagroup
    increment_key: "event_minute15"
    increment_offset: 1
    sql: SELECT PARSE_TIMESTAMP("%c", flights.text_column) as parsed_timestamp_column,
        flights.id2  AS "id",
        flights.origin  AS "origin",
      FROM public.flights  AS flights
      WHERE {% incrementcondition %} PARSE_TIMESTAMP("%c", flights.text_column)
          {% endincrementcondition %} ;;
  }

  dimension_group: event {
    type: time
    timeframes: [raw, minute15, hour, date, week, month, year]
    datatype: timestamp
    sql:  ${TABLE}.parsed_timestamp_column ;;
  }
  dimension: id {
    type: number
  }
  dimension: origin {
    type: string
  }
}

您可以在维度组 sql 定义中使用 SQL 的别名,但必须在 WHERE 子句中使用 SQL 表达式。然后,由于 minute15event 维度组中设置为时间范围,因此您可以使用 event_minute15 作为增量键,以获取 PDT 的 15 分钟增量。

创建增量汇总表

如需创建增量汇总表,请在 aggregate_table 参数的 materialization 参数下添加 increment_key 和(可选)increment_offset。使用 increment_key 参数指定基于时间的 LookML 维度的名称。维度必须在汇总表的探索所基于的视图中定义。

例如,此汇总表基于 accidents 探索,在本例中,该探索基于 accidents 视图。汇总表以一周 (increment_key: event_week) 为增量重建,最长可追溯到两周前 (increment_offset: 2):

explore: accidents {
  . . .
  aggregate_table: accidents_daily {
    query: {
      dimensions: [event_date, id, weather_condition]
      measures: [count]
    }
    materialization: {
      datagroup_trigger: flights_default_datagroup
      increment_key: "event_week"
      increment_offset: 2
    }
  }
}

增量键使用 event_week 维度,该维度基于 event 维度组中的 week 时间范围。(如需简要了解维度组的工作原理,请参阅 dimension_group 参数文档页面。)维度组和时间范围均在 accidents 视图中定义:

. . .
view: accidents {
  . . .
  dimension_group: event {
      type: time
      timeframes: [
        raw,
        date,
        week,
        year
      ]
      sql: ${TABLE}.event_date ;;
  }
  . . .
}

注意事项

针对基于时间的查询优化源表

确保增量 PDT 的源表已针对基于时间的查询进行了优化。具体而言,用于增量键的时间列必须具有优化策略,例如分区排序键索引或您的方言支持的任何优化策略。强烈建议您优化源表,因为每次更新增量表时,Looker 都会查询源表,以确定用作增量键的时间列的最新值。如果源表未针对这些查询进行优化,Looker 查询最新值的速度可能会很慢,而且费用很高。

增量 PDT 支持的数据库方言

为了让 Looker 支持 Looker 项目中的增量 PDT,您的数据库方言必须支持可用于删除和插入行的数据定义语言 (DDL) 命令。

下表显示了 Looker 最新版本中哪些方言支持增量 PDT:

方言 是否支持?
Actian Avalanche
Amazon Athena
Amazon Aurora MySQL
Amazon Redshift
Amazon Redshift 2.1+
Amazon Redshift Serverless 2.1+
Apache Druid
Apache Druid 0.13+
Apache Druid 0.18+
Apache Hive 2.3+
Apache Hive 3.1.2+
Apache Spark 3+
ClickHouse
Cloudera Impala 3.1+
Cloudera Impala 3.1+ with Native Driver
Cloudera Impala with Native Driver
DataVirtuality
Databricks
Denodo 7
Denodo 8 & 9
Dremio
Dremio 11+
Exasol
Google BigQuery Legacy SQL
Google BigQuery Standard SQL
Google Cloud PostgreSQL
Google Cloud SQL
Google Spanner
Greenplum
HyperSQL
IBM Netezza
MariaDB
Microsoft Azure PostgreSQL
Microsoft Azure SQL Database
Microsoft Azure Synapse Analytics
Microsoft SQL Server 2008+
Microsoft SQL Server 2012+
Microsoft SQL Server 2016
Microsoft SQL Server 2017+
MongoBI
MySQL
MySQL 8.0.12+
Oracle
Oracle ADWC
PostgreSQL 9.5+
PostgreSQL pre-9.5
PrestoDB
PrestoSQL
SAP HANA
SAP HANA 2+
SingleStore
SingleStore 7+
Snowflake
Teradata
Trino
Vector
Vertica