TiDB上的数据转换变得更容易了
通过dbt-tidb插件,使用TiDB的分析工程师可以直接创建表单并通过SQL进行数据匹配。
数据构建工具(dbt)是一个流行的开源数据转换工具,使分析工程师能够通过SQL语句转换仓库中的数据。TiDB社区最近发布了dbt-tidb适配器,使TiDB成为分布式SQL数据库,与dbt协同工作。通过dbt-tidb插件,使用TiDB的分析工程师可以直接创建表单,通过SQL匹配数据,而不必考虑创建表或视图的过程。他们还可以使用Jinja这个dbt模板语言来编写SQL、测试、包管理和其他功能,这大大提高了效率。
在本教程中,我将向你展示如何在TiDB中使用dbt。在你尝试下面的任何步骤之前,请确保已经安装了以下项目:
- TiDB 5.3或更高版本
- dbt 1.01或更高版本
- dbt-tidb 1.0.0
安装
有几种方法可以安装dbt和dbt-tidb,在本教程中,我们将使用pypi。当你安装dbt-tidb时,dbt会作为一个依赖项被安装。所以你只需要一个命令就可以安装这两个东西:
$ pip install dbt-tidb
你也可以单独安装dbt。请参考dbt文档中的How to install dbt。
创建项目:jaffle shop
dbt-lab提供了一个项目,jaffle_shop,来演示dbt的功能。你可以直接从GitHub获得该项目。
$ git clone https://github.com/dbt-labs/jaffle_shop
$ cd jaffle_shop
jaffle_shop项目目录下的所有文件的结构如下:
ubuntu@ubuntu:~/jaffle_shop$ tree
.
├── dbt_project.yml
├── etc
│ ├── dbdiagram_definition.txt
│ └── jaffle_shop_erd.png
├── LICENSE
├── models
│ ├── customers.sql
│ ├── docs.md
│ ├── orders.sql
│ ├── overview.md
│ ├── schema.yml
│ └── staging
│ ├── schema.yml
│ ├── stg_customers.sql
│ ├── stg_orders.sql
│ └── stg_payments.sql
├── README.md
└── seeds
├── raw_customers.csv
├── raw_orders.csv
└── raw_payments.csv
- dbt_project.yml是dbt项目的配置文件,它持有项目名称和数据库配置文件信息。
- models目录包含项目的SQL模型和表模式。注意,你公司的数据分析师会写这一部分。要了解更多关于模型的信息,请看dbt文档。
- seed目录存储了从数据库导出工具转出的CSV文件。例如,TiDB可以通过Dumpling将表的数据导出为CSV文件。在jaffle shop项目中,这些CSV文件被用作要处理的原始数据。
配置项目
要配置该项目:
-
完成全局配置。在用户目录中,编辑默认的全局配置文件,
~/.dbt/profiles.yml,配置与TiDB的连接。$ vi ~/.dbt/profiles.yml jaffle_shop_tidb: # project name target: dev # target outputs: dev: type: tidb # adapter type server: 127.0.0.1 port: 4000 schema: analytics # database name username: root password: "" -
完成项目配置: 在jaffle_shop项目目录下,进入项目配置文件
dbt_project.yml,并将配置文件字段改为jaffle_shop_tidb。该配置允许项目从~/.dbt/profiles.yml文件中指定的数据库查询。$ cat dbt_project.yml name: 'jaffle_shop' config-version: 2 version: '0.1' profile: 'jaffle_shop_tidb' # note the modification here model-paths: ["models"] # model path seed-paths: ["seeds"] # seed path test-paths: ["tests"] analysis-paths: ["analysis"] macro-paths: ["macros"] target-path: "target" clean-targets: - "target" - "dbt_modules" - "logs" require-dbt-version: [">=1.0.0", "<2.0.0"] models: jaffle_shop: materialized: table # *.sql which in models/ would be materialized to table staging: materialized: view # *.sql which in models/staging/ would bt materialized to view -
验证该配置: 运行下面的命令来检查数据库和项目配置是否正确。
$ dbt debug
加载CSV文件
现在你已经成功地创建和配置了项目,是时候加载CSV数据并将CSV作为目标数据库中的一个表来实现。注意,对于dbt项目来说,一般不需要这个步骤,因为要处理的数据项已经在数据库中了。
-
通过运行下面的命令加载CSV文件。
$ dbt seed这时显示如下:
Running with dbt=1.0.1 Partial parse save file not found. Starting full parse. Found 5 models, 20 tests, 0 snapshots, 0 analyses, 172 macros, 0 operations, 3 seed files, 0 sources, 0 exposures, 0 metrics Concurrency: 1 threads (target='dev') 1 of 3 START seed file analytics.raw_customers.................................. [RUN] 1 of 3 OK loaded seed file analytics.raw_customers.............................. [INSERT 100 in 0.19s] 2 of 3 START seed file analytics.raw_orders..................................... [RUN] 2 of 3 OK loaded seed file analytics.raw_orders................................. [INSERT 99 in 0.14s] 3 of 3 START seed file analytics.raw_payments................................... [RUN] 3 of 3 OK loaded seed file analytics.raw_payments............................... [INSERT 113 in 0.24s]正如你在结果中看到的,种子文件被启动并加载到三个表中:
analytics.raw_customers,analytics.raw_orders, 和analytics.raw_payments。 -
验证TiDB中的结果。showdatabases命令列出了dbt创建的新的分析数据库。show tables命令显示,在分析数据库中有三个表,与我们上面创建的表相对应。
mysql> show databases; +--------------------+ | Database | +--------------------+ | INFORMATION_SCHEMA | | METRICS_SCHEMA | | PERFORMANCE_SCHEMA | | analytics | | mysql | | test | +--------------------+ 6 rows in set (0.00 sec) mysql> show tables; +---------------------+ | Tables_in_analytics | +---------------------+ | raw_customers | | raw_orders | | raw_payments | +---------------------+ 3 rows in set (0.00 sec)
运行dbt项目
现在你已经准备好运行配置好的项目并完成 数据转换。
-
运行dbt项目,完成数据转换。
$ dbt runRunning with dbt=1.0.1 Unable to do partial parsing because profile has changed Unable to do partial parsing because a project dependency has been added Found 5 models, 20 tests, 0 snapshots, 0 analyses, 172 macros, 0 operations, 3 seed files, 0 sources, 0 exposures, 0 metrics Concurrency: 1 threads (target='dev') 1 of 5 START view model analytics.stg_customers................................. [RUN] 1 of 5 OK created view model analytics.stg_customers............................ [SUCCESS 0 in 0.12s] 2 of 5 START view model analytics.stg_orders.................................... [RUN] 2 of 5 OK created view model analytics.stg_orders............................... [SUCCESS 0 in 0.08s] 3 of 5 START view model analytics.stg_payments.................................. [RUN] 3 of 5 OK created view model analytics.stg_payments............................. [SUCCESS 0 in 0.07s] 4 of 5 START table model analytics.customers.................................... [RUN] 4 of 5 OK created table model analytics.customers............................... [SUCCESS 0 in 0.16s] 5 of 5 START table model analytics.orders....................................... [RUN] 5 of 5 OK created table model analytics.orders.................................. [SUCCESS 0 in 0.12s]结果显示三个视图(
analytics.stg_customers,analytics.stg_orders, 和analytics.stg_payments)和两个表(analytics.customers和analytics.orders)被成功创建。 -
转到TiDB数据库,验证操作是否成功。
mysql> show tables; +---------------------+ | Tables_in_analytics | +---------------------+ | customers | | orders | | raw_customers | | raw_orders | | raw_payments | | stg_customers | | stg_orders. | | stg_payments | +---------------------+ 8 rows in set (0.00 sec) mysql> select * from customers; +-------------+------------+-----------+-------------+-------------------+------------------+-------------------------+ | customer_id | first_name | last_name | first_order | most_recent_order | number_of_orders | customer_lifetime_value | +-------------+------------+-----------+-------------+-------------------+------------------+-------------------------+ | 1 | Michael | P. | 2018-01-01 | 2018-02-10 | 2 | 33.0000 | | 2 | Shawn | M. | 2018-01-11 | 2018-01-11 | 1 | 23.0000 | | 3 | Kathleen | P. | 2018-01-02 | 2018-03-11 | 3 | 65.0000 | | 4 | Jimmy | C. | NULL | NULL | NULL | NULL | | 5 | Katherine | R. | NULL | NULL | NULL | NULL | | 6 | Sarah | R. | 2018-02-19 | 2018-02-19 | 1 | 8.0000 | | 7 | Martin | M. | 2018-01-14 | 2018-01-14 | 1 | 26.0000 | | 8 | Frank | R. | 2018-01-29 | 2018-03-12 | 2 | 45.0000 |输出显示还有5个表或视图被添加,并且表或视图中的数据已经被转换。注意,这里只显示了客户表的部分数据。
生成可视化文档
dbt可以让你生成可视化文档,显示项目的整体结构并描述所有的表和视图。要生成可视化文档。
-
生成文件。
$ dbt docs generate -
启动服务器。
$ dbt docs serve Running with dbt=1.0.1 Serving docs at 0.0.0.0:8080 -
要从浏览器中访问文档视图,请导航到http://localhost:8080。
目前,TiDB在TiDB 4.0及以后的版本中支持dbt。早期版本的TiDB在使用dbt的时候可能会遇到问题。详情请访问GitHub上的tidb-dbt项目。为了充分利用dbt,我们建议你运行TiDB 5.3或更高版本。这些版本支持dbt的所有功能。