跳到主要内容

高级教程

本教程内容展望?

在本教程中,您将使用建模定义语言 (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)?

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 两个表。当您查询相关表时,我们将通过 joinTypecondition 自动连接两个模型。更多详情请参阅 关系

"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 语句和聚合函数重复。

下一步?