エラー: 不明またはアクセス不可のフィールド

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 の問題をトラブルシューティングするには、次の決定木を使用します。

以降のセクションでは、ツリーのシナリオについて詳しく説明します。

このエラーが発生する理由

このエラーが発生する理由はいくつかあります。

  1. 参照しているフィールドが存在しない
  2. 参照しているフィールドがディメンション グループ全体である。たとえば、ディメンション グループが timeframe を追加せずに参照されている。
  3. 結合がないため、一部の 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 を確認するには、エラー メッセージでハイライト表示されているオカレンスを展開します。

ビュー、コード行、および 2 つの原因の Explore を表示する拡張されたエラー メッセージ: users:79(ecommerce:order_items)と users:79(ecommerce:orders)

これらのオカレンスは、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 をクエリするとエラーを受け取るという警告をします。users.lifetime_orders フィールドは、user_order_facts も結合されている Explore ではエラーをトリガーしません。

たとえば、users Explore について考えてみましょう。

  explore: users {
    join: user_order_facts {
      sql_on: ${users.id} = ${user_order_facts.users_id}
    }
  }

ここで user_order_facts が結合されているため、users.lifetime_orders をクエリしてもエラーは発生しません。

結合がないためにエラーが発生した場合、エラーを修正するにはどうすればよいですか?

結合がないためにエラーが発生した場合は、いくつかの方法でエラーを修正できます。

  1. 欠落しているビューをすべてのケースで結合します。このページで使用している例では、users ビューが Explore で結合されているすべての場所で user_order_facts ビューが結合されていることを確認してください。
  2. 欠落しているビューを結合しない場合は、エラーの原因となっているフィールドを Explore から除外します。

欠落しているビューを結合する

前の例では、user_order_factsusers も結合されているすべての Explore に結合することで、エラーを解決できます。これにより、クエリで 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 から除外する

user_order_facts ビューを users が結合されているすべての Explore に結合したくない場合があります。たとえば、ユーザーが orders Explore の user_order_facts ビューのフィールドにアクセスできないようにしたいが、ユーザーがエラーなしで users ビューのフィールドにアクセスできるようにしたいとします。これを行うには、 users.lifetime_orders エラーの原因となっているフィールドを orders Explore から除外します。 fields パラメータを使用します。

Explore の fields パラメータを使用すると、特定のフィールドを Explore に含めたり、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}
    }
  }