关于 lookml-refinements
面向 LookML 开发者的文件引入与 refinement 指南,介绍如何分层修改现有视图或 Explore,以及组织大型项目文件。内容还说明 include 顺序、字段覆盖和按 Explore 拆分文件的做法。
主要功能
- 01按范围引入 LookML 文件
- 02使用 refinement 分层修改视图
- 03遵循 include 顺序处理覆盖
- 04按 Explore 拆分文件
适用场景
- 01在不修改原文件时定制供应商视图
- 02为特定 Explore 添加专用字段
- 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,而无需更改原始文件。这对于以下场景至关重要:
- 中心辐射模式:将核心“中心”模型调整为适用于特定“辐射”场景。
- 供应商代码块:自定义只读代码块(例如 Google Analytics),而无需派生分支。
语法
- 原始定义:
view: users { ... } - Refinement:
view: +users { ... } - 要求:必须先
include原始文件,才能找到它。
使用规则
- 最后引入的优先:如果多个文件对
+users进行 refinement,include的顺序决定最终状态。 - 累加:新增参数会被添加。
- 覆盖:现有参数会被替换。
- 例外:列表参数(如
drill_fields)通常会被替换而非合并,具体取决于实现方式。显式重新声明整个列表更稳妥。
- 例外:列表参数(如
- 字段修改:
- 如需修改字段,请使用完全相同的名称重新声明。
- 只需指定要更改的参数(例如添加
description或label)。
3. “每个文件一个 Explore”模式
为了让 LookML 易于维护并适用于企业级规模,请使用 .explore.lkml 文件,遵循每个文件一个 Explore模式。
结构
- 文件:
explores/orders.explore.lkml - 内容:
- 仅
include此 Explore 所需的视图。 - 定义
explore: orders { ... }。
- 仅
- 模型文件:
models/my_model.model.lkmlinclude: "/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