使用状況
derived_table: {
increment_key: ["created_date"]
...
}
}
階層
increment_key または increment_key |
デフォルト値
なし許可
時間ベースの LookML ディメンションの名前特別なルール
increment_key は、永続テーブル、特定の言語でのみサポートされます。 |
定義
言語がサポートされている場合、プロジェクトに増分 PDT を作成できます。インクリメンタル PDT は、テーブル全体を再ビルドするのではなく、最新のデータをテーブルに追加して Looker が構築する永続的な派生テーブル(PDT)です。詳細については、増分 PDT のドキュメントをご覧ください。
increment_key
は、PDT に新しいデータをクエリして PDT に追加する時間の増分を指定して、PDT を増分 PDT にするパラメータです。increment_key
に加えて、必要に応じて increment_offset
を指定して、遅延データを考慮して再作成する過去の期間の数(インクリメント キーの粒度)を指定できます。
PDT の
increment_key
は、PDT の永続トリガーとは無関係です。increment_key
、increment_offset
、永続性戦略の相互作用を示すいくつかのシナリオについては、増分 PDT のドキュメント ページをご覧ください。
increment_key
パラメータはサポートされている言語、および PDT や集計表(PDT の一種)などの永続性戦略のあるテーブルでのみ機能します。
increment_key
では、時間ベースの LookML ディメンションを指定する必要があります。
- LookML ベースの PDT の場合、
increment_key
は PDT のexplore_source
のベースとなるビューで定義されている LookML ディメンションに基づく必要があります。例については、このページのLookML ベースの増分 PDT の作成をご覧ください。 - 集約テーブルの場合、
increment_key
は、集約テーブルの Explore の基になるビューで定義されている LookML ディメンションに基づく必要があります。例については、このページの増分集計テーブルの作成セクションをご覧ください。 - SQL ベースの PDT の場合、
increment_key
は PDT のビューファイル内で定義されている LookML ディメンションに基づく必要があります。例については、このページのSQL ベースの増分 PDT の作成をご覧ください。
また、increment_key
は次の条件を満たす必要があります。
- 日、月、年、会計四半期などの切り捨てた絶対時間。曜日などの時間枠はサポートされていません。
- 注文作成日など、新しいデータとともに予測可能な増加するタイムスタンプ。つまり、タイムスタンプは、テーブルに追加された最新のデータにも最新のタイムスタンプがある場合にのみ、インクリメント キーとして使用する必要があります。ユーザーの誕生日などのタイムスタンプは、インクリメント キーとしては機能しません。誕生日のタイムスタンプは、表に新しいユーザーを追加しても確実に増加しないからです。
増分 LookML ベースの PDT の作成
LookML ベース(ネイティブ)の PDT を増分 PDT にするには、increment_key
パラメータを使用して、時間ベースの LookML ディメンションの名前を指定します。ディメンションは、PDT の explore_source
の基になるビューで定義する必要があります。
たとえば、以下は explore_source
LookML パラメータを使用した、LookML に基づく PDT のビューファイルです。PDT は flights
Explore から作成されます。この例では、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
}
}
このテーブルは、クエリの初回実行時に全体が構築されます。 その後、PDT は 1 日分(increment_key: departure_date
)単位で再構築され、3 日分(increment_offset: 3
)に戻ります。
departure_date
ディメンションは、実際には departure
ディメンション グループの date
期間です。(ディメンション グループの仕組みの概要については、dimension_group
パラメータのドキュメント ページをご覧ください)。ディメンション グループと期間の両方を flights
ビューで定義します。これは、この PDT の explore_source
です。flights
ビューファイルで departure
ディメンション グループを定義する方法は次のとおりです。
...
dimension_group: departure {
type: time
timeframes: [
raw,
date,
week,
month,
year
]
sql: ${TABLE}.dep_time ;;
}
...
増分 SQL ベースの PDT の作成
Looker では、SQL ベースの派生テーブルではなく、増分 PDT のベースとして LookML ベース(ネイティブ)の派生テーブルを使用することをおすすめします。ネイティブ派生テーブルは、増分 PDT に必要な複雑なロジックを本質的に処理します。SQL ベースの PDT は手動で作成されたロジックに依存しており、非常に複雑な機能で使用するとエラーが発生しやすくなります。
増分 SQL ベースの PDT を定義するには、LookML ベースの PDT の場合と同様に、increment_key
と(省略可)increment_offset
を使用します。ただし、SQL ベースの PDT は LookML ビューファイルに基づいていないため、SQL ベースの PDT を増分 PDT にするための追加の要件があります。
- インクリメント キーは、PDT のビューファイルで定義した時間ベースの LookML ディメンションをベースとする必要があります。
- インクリメント キーをベースとするデータベース時間列にインクリメント キーを接続するには、PDT に
Liquid フィルタを指定する必要があります。{% incrementcondition %}
フィルタは、SQL エイリアスや、列に基づくディメンションの名前ではなく、データベース内の列名を指定する必要があります(次の例を参照)。{% incrementcondition %}
Liquid フィルタの基本形式は次のとおりです。
WHERE {% incrementcondition %} database_table_name.database_time_column {% endincrementcondition %}
たとえば、次のようにして 1 日単位で再ビルドされる SQL ベースの PDT のビューファイルは次のようになります(increment_key: "dep_date"
)。過去 3 日間のデータが再ビルド時にテーブルに追加されます(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: [raw, date, week, month, year]
datatype: timestamp
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
パラメータのドキュメント ページをご覧ください)。 Liquid フィルタは、increment キーをデータベースの{% incrementcondition %}
flights.leaving_time
列に接続するために使用されます。 は、データベースの{% incrementcondition %}
TIMESTAMP
列の名前を指定する必要があります(または、データベースのTIMESTAMP
列に評価される必要があります)。 は、PDT を定義する{% incrementcondition %}
FROM
句で使用可能なもの(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 分単位が使用されます。
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 式を使用する必要があります。次に、minute15
が event
ディメンション グループで期間として設定されているため、event_minute15
をインクリメント キーとして使用して PDT の 15 分の増分を取得できます。
増分集約テーブルを作成する
インクリメンタル テーブルを作成するには、aggregate_table
パラメータの materialization
パラメータに increment_key
と(省略可)increment_offset
を追加します。increment_key
パラメータを使用して、時間ベースの LookML ディメンションの名前を指定します。ディメンションは、集約テーブルの Explore の基になるビューで定義する必要があります。
たとえば、この集計テーブルは accidents
Explore に基づいていますが、この場合は accidents
ビューに基づいています。集約テーブルは 1 週間ごとに再ビルドされます(increment_key: event_week
)。2 週間前のものになります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
}
}
}
increment キーでは 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 プロジェクトで増分 PDT に対応するためには、データベースダイアレクトが、行の削除と挿入を有効にするデータ定義言語(DDL)のコマンドに対応している必要があります。
次の表は、Looker の最新リリースで増分 PDT をサポートしている言語を示しています。