高级教程
本教程内容展望?
在本教程中,您将使用建模定义语言 (MDL) 中的许多出色功能。
注意: 本教程假定您已拥有正在运行的 Wren 引擎。如果尚未安装,请参阅 快速入门 和 初始化。
在使用 Wren 引擎之前,让我们向您展示 Wren 引擎最重要的部分 - 建模定义语言 (MDL)。 我们使用 MDL 来定义引用和关系,它提供了许多便捷的功能。了解更多信息请访问 建模概览
准备 MDL 文件
您必须在路径 etc/mdl
中创建一个名为 mdl.json
的文件。
├── etc
│ ├── mdl
│ │ └── mdl.json
│ ├── config.properties
在 etc/config.properties
中将属性 wren.directory
设置为 etc/mdl
。
wren.directory=etc/mdl
所有 MDL 设置都将保存在 etc/mdl/mdl.json
中。现在让我们为您修改 mdl.json
。
什么是建模定义语言 (MDL)
MDL 的基本元素必须包含以下字段。
catalog
: 您可以定义一个新的目录名称来抽象原始目录。schema
: 您可以定义一个新的模式名称来抽象原始模式。models
: 定义一个新的模型来引用实际数据实体。
{
"catalog": "my_catalog",
"schema": "my_schema",
"models": [
{
"name": "Orders",
"properties": {},
"refSql": "select * from tpch.orders",
"columns": [
{
"name": "orderkey",
"expression": "o_orderkey",
"type": "integer"
},
{
"name": "custkey",
"type": "integer",
"expression": "o_custkey"
}
],
"primaryKey": "orderkey"
},
{
"name": "Customer",
"refSql": "select * from tpch.customer",
"columns": [
{
"name": "custkey",
"expression": "c_custkey",
"type": "integer"
},
{
"name": "name",
"expression": "c_name",
"type": "varchar"
}
],
"primaryKey": "custkey"
}
]
}
什么是模型?
模型作为表的逻辑层,允许您丰富其含义而不影响实际数据。您应该只暴露打算与最终用户共享的特定数据集。
模型是对数据库中物理表的引用。Wren 引擎提供了一些用于描述模型的属性。通常,我们可以将模型定义为 JSON 对象。
您可以在 模型 中找到每个字段的更多详细信息
查询模型
让我们通过 Wren 引擎查询数据。
所有数据集(模型、指标或视图)都将放置在搜索路径 my_catalog.my_schema
中。然后,我们可以使用 Wren 引擎 SQL 查询已定义的模型
SELECT orderkey FROM my_catalog.my_schema.Orders
您可以像使用传统 RDBMS 一样查询数据。Wren 引擎随后会将您的 SQL 翻译成适用于您的特定数据源的可执行代码。
添加更多不同数据集
我们提供多种类型的数据集
- 模型
- 关系
- 指标
- 视图
在本教程中,我们将在 mdl.json
中添加 Relationship
。对于其他数据建模类型,您可以在 数据建模 - 概览 中找到它们
什么是关系?
关系描述了两个模型如何关联在一起,并支持跨两个实体进行无缝数据集成和分析,例如如何正确计算特定列或 JOIN 两个表。当您查询相关表时,我们将通过 joinType
和 condition
自动连接两个模型。更多详情请参阅 关系。
"relationships": [
{
"name": "OrdersCustomer",
"models": [ "Orders", "Customer" ],
"joinType": "MANY_TO_ONE",
"condition": "Orders.custkey = Customer.custkey"
}
]
添加 relationships
后,您可以在模型中添加一个名为 relationship
的新字段,以建立两个模型之间的关系。
{
"name": "Orders",
"refSql": "select * from tpch.orders",
"columns": [
{
"name": "orderkey",
"type": "integer",
"expression": "o_orderkey"
},
{
"name": "custkey",
"type": "integer",
"expression": "o_custkey"
},
{
"name": "customer",
"type": "Customer",
// add relationship field here
"relationship": "CustomerOrders"
}
],
"primaryKey": "orderkey"
}
计算字段
您可以添加带有 isCalculated
的新字段,以便通过引用其他模型来获取列值。
{
"name": "Orders",
"refSql": "select * from tpch.orders",
"columns": [
{
"name": "orderkey",
"type": "integer",
"expression": "o_orderkey"
},
{
"name": "custkey",
"type": "integer",
"expression": "o_custkey"
},
{
"name": "customer",
"type": "Customer",
"relationship": "CustomerOrders"
},
{
"name": "customer_name",
"type": "varhcar",
// add `isCalculated` field
"isCalculated": true,
// reference to `customer.name` column
"expression": "customer.name"
}
],
"primaryKey": "orderkey"
}
最后,您可以构建一个 MDL 来查询计算字段,如下所示。
{
"catalog": "my_catalog",
"schema": "my_schema",
"models": [
{
"name": "Orders",
"refSql": "select * from tpch.orders",
"columns": [
{
"name": "orderkey",
"type": "integer",
"expression": "o_orderkey"
},
{
"name": "custkey",
"type": "integer",
"expression": "o_custkey"
},
{
"name": "customer",
"type": "Customer",
"relationship": "CustomerOrders"
},
{
"name": "customer_name",
"type": "varhcar",
"isCalculated": true,
"expression": "customer.name"
}
],
"primaryKey": "orderkey"
},
{
"name": "Customer",
"refSql": "select * from tpch.customer",
"columns": [
{
"name": "custkey",
"expression": "c_custkey",
"type": "integer"
},
{
"name": "name",
"expression": "c_name",
"type": "varchar"
}
],
"primaryKey": "custkey"
}
],
"relationships": [
{
"name": "OrdersCustomer",
"models": [ "Orders", "Customer" ],
"joinType": "MANY_TO_ONE",
"condition": "Orders.custkey = Customer.custkey"
}
]
}
现在,您可以直接查询与订单相关的客户姓名
SELECT customer_name FROM Orders;
customer_name
--------------------
Customer#000000370
Customer#000000781
Customer#000001234
Customer#000001369
Customer#000000557
Customer#000000392
...
在原始数据库中,如果您想通过订单的 o_custkey
获取客户姓名,需要编写如下查询
SELECT
Customer.c_name
FROM
tpch.orders AS Orders
JOIN
tpch.customer AS Customer ON Orders.o_custkey = Customer.c_custkey;
借助 Wren 引擎中的计算字段,您可以在查询不同指标和 KPI 时减少大量的 JOIN 语句和聚合函数重复。
下一步?
- 如果您想了解更多关于数据模型的信息,请查看 数据建模 - 概览