looker-open-source/looker-skills

lookml-explore

Use this skill when you need to create or modify a LookML Explore.

查看源码

使用方法

  1. 复制安装命令,在自己的智能体环境安装前先检查源码包。
  2. 从原始文档核对所需工具、凭据和支持的宿主。
  3. 说明输入材料与期望交付物,并对照来源检查输出。
npx skills add https://github.com/looker-open-source/looker-skills --skill lookml-explore

开始前需了解

  • 安装不包含模型订阅、API 额度或访问文件的权限。
  • 仓库星数和安装量反映活跃情况,不等于独立质量或安全测试。
仓库原始内容

按源仓库内容呈现,保留标题、案例、代码、表格、链接以及原文引用的演示图片。

Instructions

1. Core Standards

  1. Naming Convention: snake_case for the Explore name.
  2. Required Parameters:
  • description: 100% Coverage. Every Explore MUST have a description.
  • label: A user-friendly name for the Explore in the UI.
  • view_name: Defaults to explore name, but explicit definition is safer.
  1. Joins:
  • relationship: Required (onetoone, manytoone).
  • sql_on: Required. Use ${left.id} = ${right.id} syntax.
  • type: defaults to left_outer. Use inner or full_outer explicitly if needed.
  1. Formatting:
  • Do NOT use from to rename views just for aesthetics. Use view_label instead.
  • Exception: Polymorphic joins, Self-joins, Rescoping extensions.

2. Advanced Configuration

  • always_filter: specific filters that users can change but cannot remove.
  • sql_always_where: specific restrictions that users cannot change.
  • persist_with: Link explore cache to datagroups (e.g., default_datagroup).
  • fields: Use inclusive lists to strictly control content when necessary (ALL_FIELDS*, -view.field).

3. Performance Optimization (Aggregate Tables)

Aggregate Tables (Aggregate Awareness) allow Looker to query smaller, pre-aggregated tables instead of the raw granular data, drastically improving query performance.

Anatomy of an Aggregate Table

lookml
explore: orders {
  aggregate_table: rollup_name {
    query: {
      dimensions: [created_date, status]
      measures: [total_revenue, count]
      filters: [orders.created_date: "6 months"]
    }
    materialization: {
      datagroup_trigger: ecommerce_etl
      # partition_keys: ["created_date"] # BigQuery/Presto optimization
      # increment_key: "created_date"    # Incremental builds
      # increment_offset: 3              # Rebuild last 3 periods
    }
  }
}

Key Parameters

  1. Query: Defines the "shape" of the rollup.
  • Dimensions: Include all dimensions commonly used in dashboards (including filters).
  • Measures: Include base measures (sum, count). Looker can derive averages from sum+count.
  • Filters: Optional. Restricts the rollup to a subset of data (e.g., "last 6 months").
  1. Materialization:
  • datagroup_trigger: (Recommended) Rebuilds when the ETL job completes.
  • sql_trigger_value: Rebuilds when a SQL query returns a new value.
  • increment_key: (Advanced) Appends new data instead of full rebuilds. Best for massive tables.
  • indexes / partition_keys / cluster_keys: Dialect-specific optimizations.
  1. Best Practices:
  • Timeframes: Include the finest grain needed (e.g., date). Looker can roll up date to month or year automatically.
  • Exact Match: The user's query must be a strict subset of the aggregate table's fields to satisfy the awareness logic.
  • Filter Awareness: If a user filters on a field not in the aggregate table, Looker cannot use it (unless it's an "exact match" special case). Add common filter fields to the dimensions list.

4. Extending Explores

  • Extends: Use extends: [base_explore] to inherit joins, fields, and descriptions from another explore.
  • Use Case: Create a "Base" explore with common joins, then "Extended" explores for specific analysis (e.g., orders -> marketing_orders).

Examples

Basic Explore

lookml
explore: orders {
  label: "Orders"
  description: "Analyze order data, including user and product details."
  view_name: orders
  
  join: users {
    relationship: many_to_one
    sql_on: ${orders.user_id} = ${users.id} ;;
  }
}

Explore with Filters & Caching

lookml
explore: events {
  label: "Web Events"
  description: "User interaction events."
  persist_with: default_datagroup

  # Users can change this filter, but it defaults to '7 days'
  always_filter: {
    filters: [events.created_date: "7 days"]
  }

  # Users CANNOT change this filter.
  sql_always_where: ${events.is_test_data} = false ;;
  
  join: sessions {
    relationship: many_to_one
    sql_on: ${events.session_id} = ${sessions.session_id} ;;
  }
}

## Aggregate Table (Advanced)

explore: orders { aggregatetable: monthlysalessummary { query: { dimensions: [createdmonth, status, products.category] measures: [totalrevenue, count] filters: [orders.createddate: "2 years"] } materialization: { datagrouptrigger: ecommerceetl partitionkeys: ["createdmonth"] incrementkey: "createdmonth" increment_offset: 1 # Rebuild current and previous month } } }


## Extended Explore

explore: ordersextended { extends: [orders] label: "Orders (Marketing View)" viewname: orders

Add new joins specific to this view

join: marketingchannels { sqlon: ${orders.channelid} = ${marketingchannels.id} ;; relationship: manytoone } }

Reference Skills

For more complex scenarios, refer to these specialized skills:

按任务相关推荐

来自同一仓库

更多 Skills

全部 Skills