Fehler: Unbekanntes oder nicht zugängliches Feld

Wenn Sie an Ihren LookML-Dateien arbeiten und mit den Updates zufrieden sind, führen Sie im nächsten Schritt zum Bereitstellen Ihrer LookML-Änderungen den LookML Validator aus, um eine vollständige Modellvalidierung durchzuführen.

Gelegentlich kann ein Fehler wie der folgende angezeigt werden:

 Unknown or inaccessible field "user_order_facts.lifetime_orders" referenced in "users.lifetime_orders". Check for typos and missing joins.

In diesem Beispiel bezieht sich der Fehler auf das Feld lifetime_orders in der Ansicht users. Der Fehler weist darauf hin, dass users.lifetime_orders nicht auf das user_order_facts.lifetime_orders-Feld zugreifen kann, auf das es verweist.

Warum tritt dieser Fehler auf?

Dafür kann es mehrere Gründe geben:

  1. Das Feld, auf das Sie verweisen, ist nicht vorhanden.
  2. Das Feld, auf das Sie verweisen, ist eine gesamte Dimensionsgruppe. Auf eine Dimensionsgruppe wird z. B. ohne angehängtes timeframe verwiesen.
  3. Das Feld ist für einige Explores nicht zugänglich, da eine Verbindung fehlt.

Option 1: Das Feld ist nicht vorhanden

Wenn in LookML-Feldern auf das Feld user_order_facts.lifetime_orders verwiesen wird, es aber nicht selbst als Feld vorhanden ist, wird der Fehler unknown or inaccessible field angezeigt.

Sie können den Fehler beheben, indem Sie das Feld, das den Fehler auslöst (in diesem Beispiel user_order_facts.lifetime_orders), der Ansicht hinzufügen, die das betreffende Feld enthält. In diesem Fall können Sie prüfen, ob das Feld in der user_order_facts-Ansicht definiert ist. Ist das nicht der Fall, können Sie es hinzufügen.

Option 2: Das Feld verweist auf eine ganze Dimensionsgruppe.

Dimensionsgruppen stellen eine Gruppe von Dimensionen dar. type: time-Dimensionsgruppen stellen eine Gruppe von Zeitraumdimensionen dar, die im Parameter timeframe definiert sind. Wenn Sie in LookML auf Dimensionsgruppen verweisen, müssen hängen Sie die entsprechende Dimension, in diesem Fall timeframe, an den Namen der Dimensionsgruppe an.

Betrachten Sie beispielsweise die folgende Dimensionsgruppe:

  dimension_group: created {
    type: time
    timeframes: [date, week, month]
    sql: ${TABLE}.created_at ;;
  }

Wenn Sie in einem anderen LookML-Feld auf die Dimensionsgruppe created verweisen möchten, müssen Sie auf eine bestimmte Zeitrahmendimension innerhalb der Gruppe verweisen, z. B.:

  • date: ${created_date}
  • week: ${created_week}
  • month: ${created_month}

Wenn Sie versuchen, nur den Namen der Dimensionsgruppe (${created}) zu verwenden, weiß Looker nicht, auf welchen Zeitraum Sie sich beziehen, und generiert den Fehler.

Option 3: Ein Join fehlt

Im Folgenden finden Sie die LookML-Definition von users.lifetime_orders:

  dimension: lifetime_orders {
    type: number
    sql: ${user_order_facts.lifetime_orders};;
  }
Beachten Sie die Verwendung des Substitutionsoperatoren ${}, um auf das LookML-Feld user_order_facts.lifetime_orders zu verweisen.

Die Dimension lifetime_orders in der Ansicht users verweist auf das Feld lifetime_orders aus der Ansicht user_order_facts. In diesem Fall wird der Fehler ausgelöst, weil es Instanzen in der Modelldatei gibt, bei denen die Ansicht users mit einem Explore verbunden ist, ohne dass auch user_order_facts verknüpft wurde.

Um zu sehen, welche Explores das Problem verursachen, können Sie die in der Fehlermeldung hervorgehobenen Vorkommen maximieren:

Maximierte Fehlermeldung mit den Datenansichten, Codezeilen der Datenansichten und Explores für zwei Ursachen: „users:79“ (ecommerce:order_items) und „users:79“ (ecommerce:orders).

Diese Vorkommen zeigen, dass die explorativen Datenanalysen order_items und orders im Modell ecommerce den Fehler verursachen. Diese Explores enthalten viele Joins und werden in der Modelldatei so definiert:

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

In beiden Explores wird die Ansicht users ohne die Ansicht user_order_facts verknüpft. Daher kann kein Explore auf das Feld user_order_facts.lifetime_orders zugreifen. Wenn Sie versucht haben, das Feld users.lifetime_orders, das auf user_order_facts.lifetime_orders verweist, in einem der beiden Explores abzufragen, wird der Fehler ausgelöst.

Der LookML-Validator warnt Sie, dass Nutzer den Fehler erhalten, wenn sie users_order_facts.lifetime_orders abfragen. Das Feld users.lifetime_orders löst nicht den Fehler in einem Explore aus, mit dem auch user_order_facts verknüpft ist.

Ein Beispiel ist die users-Erkundung:

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

Hier wird user_order_facts verknüpft, daher löst die Abfrage von users.lifetime_orders keinen Fehler aus.

Wie kann ich den Fehler beheben, wenn er durch einen fehlenden Join verursacht wird?

Wenn der Fehler durch einen fehlenden Join verursacht wird, können Sie diesen Fehler auf verschiedene Arten beheben:

  1. Verknüpfen Sie die fehlende Ansicht in allen Fällen. Achten Sie bei dem Beispiel auf dieser Seite darauf, dass die user_order_facts-Ansicht überall dort verbunden ist, wo die users-Ansicht in einem Explore verbunden ist.
  2. Schließen Sie das Feld, das den Fehler verursacht, aus Explores aus, wenn Sie die fehlende Ansicht nicht zusammenführen möchten.

Fehlende Ansicht verknüpfen

Im vorherigen Beispiel kann der Fehler behoben werden, indem user_order_facts mit allen Explores zusammengeführt wird, in denen auch users verknüpft ist. Dadurch wird sichergestellt, dass Explores auf user_order_facts.lifetime_orders zugreifen können, wenn users.lifetime_orders in einer Abfrage verwendet wird.

Im Metadatenbereich in der IDE können Sie alle Explores aufrufen, in denen die Ansicht users verwendet wird.

Im folgenden Beispiel werden die fehlenden Datenansichten zusammengeführt:

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

Wenn Sie den LookML-Validator noch einmal ausführen, sollte dieser Fehler nicht mehr angezeigt werden.

Das Feld, das den Fehler verursacht, aus Explores ausschließen

Möglicherweise möchten Sie die Ansicht user_order_facts nicht mit allen Explores verbinden, in denen users verbunden ist. Vielleicht möchten Sie beispielsweise nicht, dass Nutzer im Explore orders auf die Felder der Ansicht user_order_facts zugreifen, aber ja, dass sie fehlerfrei auf die Felder der Ansicht users zugreifen. Dazu können Sie das Feld, das den Fehler verursacht, also users.lifetime_orders, mit dem Parameter fields aus dem orders-Explore ausschließen.

Mit dem Parameter fields für Explores können Sie bestimmte Felder in ein Explore aufnehmen oder daraus ausschließen. In diesem Fall können Sie users.lifetime_orders so aus dem orders-Explore ausschließen:

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