mcpField
L
lookml-refinements

lookml-refinements

github.com/looker-open-source数据与数据库43146 次安装2 周前更新
代码仓库

关于 lookml-refinements

面向 LookML 开发者的文件引入与 refinement 指南,介绍如何分层修改现有视图或 Explore,以及组织大型项目文件。内容还说明 include 顺序、字段覆盖和按 Explore 拆分文件的做法。

主要功能

  1. 01按范围引入 LookML 文件
  2. 02使用 refinement 分层修改视图
  3. 03遵循 include 顺序处理覆盖
  4. 04按 Explore 拆分文件

适用场景

  1. 01在不修改原文件时定制供应商视图
  2. 02为特定 Explore 添加专用字段
  3. 03降低大型项目中的命名冲突与协作冲突

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/looker-open-source/looker-skills --skill lookml-refinements

安装后在 Claude Code 中输入/lookml-refinements确认已加载。

详细介绍

说明

1. Includes 机制

include 会使 Open LookML 对象(视图、Explore、信息中心)在当前文件中可用。

  • 通配符(*):匹配任意字符串。

    • /views/*.view:绝对路径 /views 目录中的所有视图。
    • *.view:当前目录中的所有视图。
    • /**/*.view:(递归)当前目录及其所有子目录中的所有视图。
    • //project-name/views/*.view:远程项目导入(需要项目清单)。
  • 最佳实践:明确指定范围,避免命名空间冲突和性能负担。

    • 不推荐:include: "/**/*.view"(导入所有目录中的所有内容,速度慢且有风险)。
    • 推荐:include: "/views/users.view"(明确指定)。
    • 推荐:include: "/views/finance/*.view"(限定在某个领域)。

2. Refinements(分层)

Refinement 允许你修改现有视图或 Explore,而无需更改原始文件。这对于以下场景至关重要:

  1. 中心辐射模式:将核心“中心”模型调整为适用于特定“辐射”场景。
  2. 供应商代码块:自定义只读代码块(例如 Google Analytics),而无需派生分支。
语法
  • 原始定义:view: users { ... }
  • Refinement:view: +users { ... }
  • 要求:必须先 include 原始文件,才能找到它。
使用规则
  1. 最后引入的优先:如果多个文件对 +users 进行 refinement,include 的顺序决定最终状态。
  2. 累加:新增参数会被添加。
  3. 覆盖:现有参数会被替换。
    • 例外:列表参数(如 drill_fields)通常会被替换而非合并,具体取决于实现方式。显式重新声明整个列表更稳妥。
  4. 字段修改:
    • 如需修改字段,请使用完全相同的名称重新声明。
    • 只需指定要更改的参数(例如添加 description 或 label)。

3. “每个文件一个 Explore”模式

为了让 LookML 易于维护并适用于企业级规模,请使用 .explore.lkml 文件,遵循每个文件一个 Explore模式。

结构
  • 文件:explores/orders.explore.lkml
  • 内容:
    1. 仅 include 此 Explore 所需的视图。
    2. 定义 explore: orders { ... }。
  • 模型文件:models/my_model.model.lkml
    • include: "/explores/orders.explore.lkml"
    • 模型文件本身不定义 explore。
优势
  • 性能:连接只解析请求的 Explore 所需的内容。
  • 命名空间整洁:视图命名冲突会被隔离在引入这些视图的特定 Explore 文件中。
  • 协作:开发者可以分别处理不同的 Explore,而不会在模型文件中产生合并冲突。

示例

场景:修改供应商视图

原始定义(只读)://lkr_block/users.view

view: users {
  dimension: id { primary_key: yes }
  dimension: name {}
}

Refinement:views/users_rfn.view

include: "//lkr_block/users.view"

view: +users {
  # 1. New Dimension
  dimension: email {
    sql: ${TABLE}.email ;;
  }

  # 2. Modify Existing Dimension
  dimension: name {
    label: "Full Name"
    description: "Legal name of the user."
  }
}

场景:特定 Explore 的逻辑

文件:explores/marketing_orders.explore.lkml

include: "/views/orders.view"
include: "/views/users.view"

# Refine users ONLY for this explore to add marketing-specific fields
view: +users {
  dimension: acquisition_channel {
    sql: ${TABLE}.utm_source ;;
  }
}

explore: marketing_orders {
  view_name: orders
  from: orders # mapping 'orders' view to 'orders' alias (standard)
  
  join: users {
    sql_on: ${orders.user_id} = ${users.id} ;;
  }
}

评论

支持 Markdown