LookML ファイルで作業し、更新に問題がなければ、LookML の変更をデプロイするために次に行うことは、LookML バリデータを実行してモデルの完全な検証の実行です。
次のようなエラーが表示されることがあります。
Unknown or inaccessible field "user_order_facts.lifetime_orders" referenced in "users.lifetime_orders". Check for typos and missing joins.
この例では、エラーは users ビューの lifetime_orders フィールドを参照しています。このエラーは、users.lifetime_orders が参照する user_order_facts.lifetime_orders フィールドにアクセスできないことを示しています。
デバッグツリー
次の決定木を使用して、一般的な Liquid の問題をトラブルシューティングします。
以降のセクションでは、ツリー内のシナリオについて詳しく説明します。
このエラーが発生する原因
このエラーが発生する原因はいくつかあります。
- 参照しているフィールドが存在しません。
-
参照しているフィールドがディメンショングループ全体である - たとえば、ディメンショングループが
timeframeを追加せずに参照されている。 - 結合がないため、一部の Explore でフィールドにアクセスできない。
フィールドが存在しない
フィールド user_order_facts.lifetime_orders が LookML フィールドで参照されているが、フィールド自体が存在しない場合は、unknown or inaccessible field エラーが表示されます。
このエラーを解決するには、エラーの原因となっているフィールド(この例では user_order_facts.lifetime_orders)を、問題のフィールドを含むビューに追加します。この場合、フィールドが user_order_facts ビューで定義されていることを確認できます。存在しない場合は、追加できます。
フィールドがディメンショングループ全体を参照している
ディメンショングループは、ディメンションのグループを表します。type: time ディメンション グループは、timeframe パラメータで定義された期間ディメンションのグループを表します。LookML でディメンション グループを参照する場合は、ディメンション グループ名に適切なディメンション(この場合は timeframe)を付加する必要があります。
たとえば、次のディメンショングループについて考えてみましょう。
dimension_group: created {
type: time
timeframes: [date, week, month]
sql: ${TABLE}.created_at ;;
}
別の LookML フィールドで created ディメンション グループを参照する場合は、グループ内の特定のタイムフレームのディメンション(以下のいずれか)を参照する必要があります。
-
date:${created_date} -
week:${created_week} -
month:${created_month}
ディメンション グループの名前(${created})のみを使用しようとすると、参照しようとしているタイムフレームが Looker に認識されず、エラーが生成されます。
結合が欠落している
users.lifetime_orders の LookML 定義は次のとおりです。
dimension: lifetime_orders {
type: number
sql: ${user_order_facts.lifetime_orders};;
}
置換演算子${}を使用して LookML フィールドuser_order_facts.lifetime_ordersを参照していることに注意してください。
users ビューの lifetime_orders ディメンションは、user_order_facts ビューの lifetime_orders フィールドを参照します。この場合、モデルファイルに users ビューが Explore に結合されているにもかかわらず、user_order_facts も結合されていないインスタンスがあるため、このエラーが発生します。
問題の原因となっている Explore を確認するには、エラー メッセージでハイライト表示されているオカレンスを展開します。
これらのオカレンスは、ecommerce モデルの order_items Explore と orders Explore がエラーの原因であることを示しています。これらの Explore には多くの結合があり、モデルファイルで次のように定義されています。
explore: orders {
join: users { # users joined without user_order_facts
relationship: many_to_one
sql_on: ${orders.user_id} = ${users.id}
}
}
explore: order_items {
join: inventory_items {
relationship: many_to_one
sql_on: ${order_items.inventory_item_id} = ${inventory_items.id}
}
join: orders {
relationship: many_to_one
sql_on: ${order_items.order_id} = ${orders.id}
}
join: users { # users joined without user_order_facts
relationship: many_to_one
sql_on: ${orders.user_id} = ${users.id}
}
}
これらの両方の Explore では、users ビューを結合しても user_order_facts ビューを結合しないため、どちらの Explore も user_order_facts.lifetime_orders フィールドにアクセスできません。Explore で users.lifetime_orders フィールド(user_order_facts.lifetime_orders を参照)をクエリしようとすると、エラーがトリガーされます。
LookML バリデータは、ユーザーが users_order_facts.lifetime_orders をクエリするとエラーを受け取るという警告をします。user_order_facts も結合されている Explore では、users.lifetime_orders フィールドでエラーは発生しません。
たとえば、次の users Explore について考えてみましょう。
explore: users {
join: user_order_facts {
sql_on: ${users.id} = ${user_order_facts.users_id}
}
}
ここでは user_order_facts が結合されているため、users.lifetime_orders をクエリしてもエラーはトリガーされません。
結合がないためにエラーが発生した場合、エラーを修正するにはどうすればよいですか?
結合がないためにエラーが発生した場合は、いくつかの方法でエラーを修正できます。
-
欠落しているビューをすべてのケースで結合します。このページで使用している例では、
usersビューが Explore で結合されているすべての場所でuser_order_factsビューが結合されていることを確認してください。 - 欠落しているビューを結合しない場合は、Explore のエラーを引き起こすフィールドを除外します。
欠落しているビューを結合する
上記の例では、users が結合されているすべての Explore に user_order_facts を結合することで、エラーを解決できます。これにより、クエリで users.lifetime_orders が使用されている場合に、Explore が user_order_facts.lifetime_orders にアクセスできるようになります。
IDE のメタデータ パネルを使用すると、users ビューを使用するすべての Explore を確認できます。
次の例では、欠落しているビューを結合します。
explore: order_items {
join: inventory_items {
relationship: many_to_one
sql_on: ${inventory_items.id} = ${order_items.inventory_item_id}
}
join: orders {
relationship: many_to_one
sql_on: ${order_items.order_id} = ${orders.id}
}
join: users {
relationship: many_to_one
sql_on: ${orders.user_id} = ${users.id}
}
join: user_order_facts { # join user_order_facts through users
relationship: many_to_one
sql_on: ${users.id} = ${user_order_facts.users_id}
}
}
LookML バリデータを再実行すると、このエラーは表示されなくなります。
Explore からエラーの原因となっているフィールドを除外する
users ビューが結合されているすべての Explore に user_order_facts ビューを結合したくない場合もあります。例えば、orders Explore でuser_order_facts ビューからフィールドにアクセスさせたくないが、users ビューからフィールドにエラーなくアクセスさせたい場合などです。これは、fields パラメータを使用して、orders Explore からエラー(users.lifetime_orders)の原因となっているフィールドを除外することで実現できます。
Explore の fields パラメータを使用すると、Explore から特定のフィールドを含めるか除外するかを指定できます。この場合、次のように orders Explore から users.lifetime_orders フィールドを除外できます。
explore: orders {
fields: [-users.lifetime_orders] # exclude users.lifetime_orders
join: users {
relationship: many_to_one
sql_on: ${orders.user_id} = ${users.id}
}
}