Error: Kolom tidak dikenal atau tidak dapat diakses

Setelah Anda mengerjakan file LookML dan puas dengan pembaruannya, langkah selanjutnya untuk men-deploy perubahan LookML adalah menjalankan Validator LookML untuk melakukan validasi model lengkap.

Terkadang, Anda mungkin melihat error seperti berikut:

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

Dalam contoh ini, error mengacu pada kolom lifetime_orders dalam tampilan users. Error menunjukkan bahwa users.lifetime_orders tidak dapat mengakses kolom user_order_facts.lifetime_orders yang dirujuknya.

Mengapa error ini terjadi?

Ada beberapa alasan terjadinya error ini:

  1. Kolom yang Anda referensikan tidak ada.
  2. Kolom yang Anda rujuk adalah keseluruhan grup dimensi — misalnya, grup dimensi direferensikan tanpa tambahantimeframe.
  3. Kolom tidak dapat diakses oleh beberapa Jelajah karena tidak ada gabungan.

Opsi 1: Kolom tidak ada

Jika kolom user_order_facts.lifetime_orders direferensikan dalam kolom LookML tetapi tidak ada sebagai kolom itu sendiri, Anda akan menerima error unknown or inaccessible field.

Anda dapat mengatasi error tersebut dengan menambahkan kolom yang memicu error — dalam contoh ini, user_order_facts.lifetime_orders — ke tampilan yang berisi kolom yang dimaksud. Dalam hal ini, Anda dapat memastikan kolom telah ditentukan dalam tampilan user_order_facts. Jika tidak ada, Anda dapat menambahkannya.

Opsi 2: Kolom mereferensikan seluruh grup dimensi

Grup dimensi mewakili grup dimensi. Grup dimensi type: time mewakili grup dimensi jangka waktu yang ditentukan dalam parameter timeframe. Saat mereferensikan grup dimensi di LookML, Anda harus menambahkan dimensi yang sesuai — dalam hal ini timeframe — ke nama grup dimensi.

Misalnya, pertimbangkan grup dimensi berikut:

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

Jika ingin mereferensikan grup dimensi created di kolom LookML lainnya, Anda harus mereferensikan dimensi jangka waktu tertentu dalam grup, seperti salah satu dari berikut ini:

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

Jika Anda mencoba hanya menggunakan nama grup dimensi — ${created} — Looker tidak akan mengetahui rentang waktu mana yang Anda rujuk dan akan menghasilkan error.

Opsi 3: Terdapat join yang hilang

Berikut adalah definisi LookML dari users.lifetime_orders:

  dimension: lifetime_orders {
    type: number
    sql: ${user_order_facts.lifetime_orders};;
  }
Perhatikan penggunaan operator substitusi ${} untuk mereferensikan kolom LookML user_order_facts.lifetime_orders.

Dimensi lifetime_orders dalam tampilan users mereferensikan kolom lifetime_orders dari tampilan user_order_facts. Dalam hal ini, error dipicu karena ada instance dalam file model tempat tampilan users digabungkan ke Jelajah tanpa user_order_facts juga digabungkan.

Untuk melihat Explore mana yang menyebabkan masalah, Anda dapat memperluas kemunculan yang disorot dalam pesan error:

Pesan error diperluas yang menampilkan tampilan, baris kode, dan Jelajah dari dua penyebab: users:79 (ecommerce:order_items) dan users:79 (ecommerce:orders).

Kejadian ini menunjukkan bahwa Jelajah order_items dan orders dalam model ecommerce menyebabkan error. Jelajah ini memiliki banyak gabungan dan didefinisikan sebagai berikut dalam file model:

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

Di kedua Jelajah ini, tampilan users digabungkan tanpa juga bergabung dengan tampilan user_order_facts; dengan demikian, tidak ada Jelajah yang dapat mengakses kolom user_order_facts.lifetime_orders. Jika mencoba membuat kueri pada kolom users.lifetime_orders — yang merujuk user_order_facts.lifetime_orders — di salah satu Eksplorasi, Anda akan memicu error.

Validator LookML memperingatkan Anda bahwa pengguna akan menerima error saat mereka membuat kueri users_order_facts.lifetime_orders. Kolom users.lifetime_orders tidak akan memicu error di Eksplorasi tempat user_order_facts juga digabungkan.

Misalnya, pertimbangkan Eksplorasi users:

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

Di sini user_order_facts digabungkan, sehingga kueri users.lifetime_orders tidak akan memicu error.

Bagaimana cara memperbaiki error yang disebabkan oleh tidak adanya join?

Jika error disebabkan oleh join yang hilang, Anda dapat memperbaiki error ini dengan beberapa cara:

  1. Gabung ke tampilan yang belum ada di semua kasus. Untuk contoh yang digunakan di seluruh halaman ini, pastikan tampilan user_order_facts digabungkan di mana pun tampilan users digabungkan di Explore.
  2. Kecualikan kolom yang menyebabkan error dari Jelajah jika Anda tidak ingin bergabung dengan tampilan yang tidak ada.

Bergabung ke tampilan yang hilang

Pada contoh sebelumnya, error dapat diatasi dengan menggabungkan user_order_facts ke semua Jelajah tempat users juga digabungkan. Tindakan ini akan memastikan bahwa Jelajah dapat mengakses user_order_facts.lifetime_orders saat users.lifetime_orders digunakan dalam kueri.

Anda dapat menggunakan panel metadata di IDE untuk melihat semua Jelajah yang menggunakan tampilan users.

Contoh berikut menggabungkan tampilan yang tidak ada:

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

Sekarang, jika Anda menjalankan ulang validator LookML, error ini seharusnya tidak muncul.

Mengecualikan kolom yang menyebabkan error dari Eksplorasi

Anda mungkin tidak ingin bergabung dengan tampilan user_order_facts untuk semua Jelajah tempat users bergabung. Misalnya, mungkin Anda tidak ingin pengguna mengakses kolom dari tampilan user_order_facts di Explore orders, tetapi Anda ingin pengguna mengakses kolom dari tampilan users tanpa error. Anda dapat melakukannya dengan mengecualikan kolom yang menyebabkan error — users.lifetime_orders — dari Jelajah orders, menggunakan parameter fields.

Parameter fields untuk Jelajah memungkinkan Anda menyertakan atau mengecualikan kolom tertentu dari Jelajah. Dalam kasus ini, Anda dapat mengecualikan users.lifetime_orders dari Jelajah orders seperti ini:

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