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
フィールドにアクセスできないことを示しています。
このエラーが発生する理由
このエラーが発生する原因はいくつかあります。
- 参照しているフィールドが存在しません。
-
参照しているフィールドがディメンション グループ全体である - たとえば、
timeframe
が追加されていないディメンション グループが参照されている。 - 結合がないため、一部の Explore でフィールドにアクセスできない。
オプション 1: フィールドが存在しない
フィールド user_order_facts.lifetime_orders
が LookML フィールドで参照されているが、フィールド自体が存在しない場合、unknown or inaccessible field
エラーが発生します。
このエラーは、エラーの原因となっているフィールド(この例では user_order_facts.lifetime_orders
)を、問題のフィールドを含むビューに追加することで解決できます。この場合、フィールドが user_order_facts
ビューで定義されていることを確認できます。存在しない場合は追加できます。
オプション 2: フィールドがディメンション グループ全体を参照している
ディメンション グループは、ディメンションのグループを表します。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 に認識されず、エラーが発生します。
オプション 3: 結合がない
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
と 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 でも、user_order_facts.lifetime_orders
を参照する users.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
が使用されたときに、データ探索ツールが 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 からエラーの原因となっているフィールドを除外する
user_order_facts
ビューを、users
が結合されているすべての Explore に結合したくない場合もあります。例えば、orders
Explore でuser_order_facts
ビューからフィールドにアクセスさせたくないが、users
ビューからフィールドにエラーなくアクセスさせたい場合などです。これは、fields
パラメータを使用して、orders
Explore からエラー(users.lifetime_orders
)の原因となっているフィールドを除外することで実現できます。
Explore の fields
パラメータを使用すると、Explore に特定のフィールドを含めたり、除外したりできます。この場合は、次のように orders
Explore から users.lifetime_orders
を除外できます。
explore: orders { fields: [ALL_FIELDS*, -users.lifetime_orders] # exclude users.lifetime_orders join: users { relationship: many_to_one sql_on: ${orders.user_id} = ${users.id} } }