오류: 알 수 없거나 액세스할 수 없는 필드

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 필드에 액세스할 수 없음을 나타냅니다.

이 오류가 발생하는 이유는 무엇인가요?

이 오류가 발생하는 이유는 몇 가지가 있습니다.

  1. 참조하는 필드가 존재하지 않습니다.
  2. 참조하는 필드는 전체 측정기준 그룹입니다. 예를 들어 추가된 timeframe 없이 측정기준 그룹을 참조합니다.
  3. 조인이 누락되어 일부 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 필드를 참조합니다. 이 경우 user_order_facts도 조인되지 않은 상태에서 users 뷰가 Explore에 조인되는 모델 파일에 인스턴스가 있기 때문에 오류가 트리거됩니다.

문제를 일으키는 탐색 항목을 확인하려면 오류 메시지에 강조표시된 일치하는 항목을 펼치면 됩니다.

펼쳐진 오류 메시지는 두 가지 원인인 users:79 (ecommerce:order_items)와 users:79 (ecommerce:orders)의 보기, 코드 보기, Explore 분석을 보여줍니다.

이 발생은 ecommerce 모델의 order_itemsorders 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 필드를 쿼리하려고 하면 오류가 발생합니다.

사용자가 users_order_facts.lifetime_orders를 쿼리하면 LookML 검사기에 오류가 발생한다는 경고가 표시됩니다. 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에서 오류를 일으키는 필드를 제외합니다.

누락된 뷰를 조인합니다

앞의 예에서는 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 보기에서 필드에 액세스하는 것을 실제로 원할 수 있습니다. 오류를 발생시키는 필드(users.lifetime_orders)를 orders Explore에서 제외할 때 fields 매개변수를 사용하면 됩니다.

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}
    }
  }