暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

另辟蹊径:在云端使用 SQL 语言实现数据转化,测试和文档维护

西云数据云计算 2022-02-08
301



本文作者 | 韩医徽

前言

在这篇文章中主要介绍 ELT 的模式,开源工具 DBT,以及 DBT 的简要用法。


全球化经济放缓带来的需求乏力、竞争过度、产能过剩等问题日益突出,传统企业面临着比以往更加激烈的市场竞争,迫切需要探寻新的增长机会和发展模式。企业如何利用数字化技术,实施以创新为核心的数字化转型,就变得尤为重要。

作为一名解决方案架构师,按我的理解,从技术角度去看,数字化转型的本质就是利用大数据的技术来提升企业的运营效率。

在当前这个数据量,数据来源,数据类型爆炸的时代,企业做数据分析也面临着新的挑战, 如何能够更高效的去做数据准备,从而缩短整个数据分析的周期,让数据更有实效性,增加数据的价值,就变得尤为重要。数据量巨大,数据来源众多,数据类型多样也对数据分析人员提出了挑战,有客户讲,在“数据准备”这个环节所占用的时间,很多情况下会超过整个项目时间的 80%,这其中又包含了开发,测试和文档维护等多个环节。

有没有什么办法可以提高数据准备的效率呢?本篇文章将为大家介绍一个新的开源工具:DBT(Data Build Tool),并详细演示如何使用 DBT 基于 Amazon Redshift  使用 SQL 语言来做数据转换,测试用例编写和文档维护。

↓↓↓ 在开始介绍 DBT 之前,我们先来回顾下数据准备的两个常见模式:ELT 和 ETL。



数据准备模式:
ETL 还是 ELT, 如何选择?



在 ETL and ELT design patterns for lake house architecture using Amazon Redshift 中,详细分析对比了 ETL 和 ELT 两种模式。在本篇文章中,不再详细去分析对比,只是选取其中关键部分加上笔者理解,目的是帮助大家能够更全面的理解本文中基于 DBT 做数据准备的方案。

扫码查看 Amazon Web Services Blog:
ETL and ELT design patterns for
lake house architecture using Amazon Redshift 文章


ETL(Extract –> Transform –> Load) 和 ELT(Extract –> Load –> Transform) 的概要对比图如下:


ETL 和 ELT 两种模式的区别在于,先做数据转换(Transform) 还是先做数据加载(Load)

在 ETL 的模式中,先做数据转换,这个过程是在数据仓库之外完成的,做数据转换的工具可以选择 Amazon EMR 或者 Glue。

在 ELT 的模式中,先把数据加载到数据仓库中,然后再做数据转换。

在亚马逊云科技上,就可以选择 Amazon Redshift,充分利用 Redshift MPP 的架构优势来做数据转换。同时也得益于 Redshift Spectrum 的功能,可以简单的使用 CTAS(Create Table as )命令来做数据转换, 整个流程图如下:


可以看出,使用 ELT 模式,技术栈也相对简单,开发人员只需要使用 SQL 就可以完成数据转换。而在 ETL 的模式中,做数据转换,开发人员则需要掌握 Spark 等技能,使用的技术语言则是 Scala 或者 Python。所以,如果大家已经非常熟悉 SQL,而面对学习 Scala/Python 又有些不知所措时,ELT 模式会是一个好的选择。

那么在选择 ELT 的模式之后,如何高效开发,如何进行测试,如何维护项目文档?这些问题可以尝试下 DBT,接下来将带大家认识 DBT,学会如何使用 DBT。



DBT 简介



DBT(data build tool) 是一个开源的工具,利用 DBT,数据分析人员可以使用 SQL 来做数据转换,DBT 会负责将命令转化为表或者视图。并且 DBT 支持多种数仓产品(Redshift, Snowflake, BigQuery, Presto 等),DBT 会根据用户的配置,自动将用户编写的代码转换为特定数据仓库支持的命令。因此,DBT 广受欢迎,目前以后 850+ 企业在他们的生产环境使用 DBT 做数据转换,其中包括 Casper, Seatgeek, Wistia 等知名公司。



DBT 可以大幅度的提高数据分析人员的效率:

1、DBT 集成了 package manager 的功能。

数据分析人员可以把常用的包做成 Package,发布到私有或者公开的仓库,方便重用;

2、DBT 支持开发人员定义测试用例,可以方便的对编写的代码进行测试,保障代码质量;

3、DBT 支持根据开发人员编写代码中的元数据生成对应文档(类似于数据分析领域的 Swagger), 降低文档维护工作量。




使用 DBT 在 Redshift 中做数据转换
(Data Transformation)



本文接下来为大家详细演示,如何配置使用 DBT 在 Redshift 中做数据转换。演示所使用的示例代码,大家可以扫码下载运行,示例代码仅供参考。

扫码下载演示所使用的的示例代码


环境准备


创建演示用的 Redshift 集群,为了演示方便,在本文中打开了 Redshift 集群的公网访问权限。

笔者封装成了 Amazon Web Services CDK 的 Project,可以使用如下方法创建 (不习惯 Amazon Web Services CDK 的用户,可以参考 Redshift 官方文档手工创建集群):

扫码查看 Redshift 官方文档


▼Amazon Web Services CDK 开发环境搭建


开发 Amazon Web Services CDK 需要先安装 Amazon Web Services CDK CLI,利用 Amazon Web Services CDK CLI 可以生成对应的 CDK 的Project。

Amazon Web Services CDK CLI 的安装依赖于 Node.js, 所以在您的开发环境需要先安装 node.js。node.js 的安装可扫码参看官方教程:

扫码参看官方教程


安装好 node.js 之后,可以直接使用如下命令安装 Amazon Web Services CDK CLI:
npm install -g aws-cdk  #安装cdk cli

cdk --version #查看版本

安装 CDK CLI 后,需要通过 Amazon configure 命令配置开发环境的用户权限,扫码查看详情:

扫码查看详情


▼搭建测试 Redshift 集群


配置好之后,在命令行使用如下命令,创建 Redshift 集群:
git clone https://github.com/readybuilderone/elt-with-dbt-demo.git

cd elt-with-dbt-demo

npx projen

npx cdk bootstrap

npx cdk deploy --profile <YOUR-PROFILE>

注意,请将上述代码中的  替换为您配置的 Amazon Web Services Credential 的 Profile。

执行完成之后,会创建一具有公网访问权限的 S3 Bucket 和 一个 Redshift 集群。

创建成功后,会在命令行打印出:
  • 用于存放需要加载到 Redshift 数据的 S3 的 BucketName;
  • Redshift 的 Host 地址;
  • Redshift 的 Execute Role 的 ARN。


Redshift 的链接信息如下
  • Redshift DB Name: redshift-db
  • Redshift User: redshift-user
  • Redshift Port: 5439
  • Redshift Host: 参考CDK运行截图

上述 CDK 代码会在 Secrets Manager 中创建名为“redshift-credentials” 的 secrets,您可以通过 Retrieve secret value 查看。

可以使用如下命令,测试 Redshift 连接:

psql -h <endpoint> -U <userid> -d <databasename> -p <port>


安装 DBT — DBT 的安装非常简单并且有多种选择, 扫码即可查看:

扫码查看详情


安装完成之后,运行如下命令检查 DBT 安装是否成功:
dbt --version
#正确安装应该会输出如下内容

installed version: 0.20.2

   latest version: 0.20.2
Up to date!
Plugins:

  - bigquery: 0.20.2

  - snowflake: 0.20.2

  - redshift: 0.20.2

  - postgres: 0.20.2

▼新建 DBT Project


DBT 安装好之后,使用如下命令创建 Project:
dbt init dbt-demo


这个命令将会创建 profiles.yml 和 一个 dbt-demo 的文件夹, profiles.yml 存放 RedShift的Credentials。dbt-demo 文件夹为 DBT 的项目文件夹。


根据创建的 Redshift 的值,修改 profiles.yml 中 default –> outputs –> dev 的配置项:


之后,在 dbt-demo 中执行如下命令,验证 dbt 可以连接到新建的 Redshift 集群:dbt debug


数据准备


▼测试数据说明


本文中使用 Jaffle Shop Sample 数据来做演示。
Jaffle Shop 中共有 customer, order, payments 三张表,schema 如下:


▼加载测试数据到 Redshift


Jaffle Shop 的原始数据存在 sample_db/jaffle_shop/ 文件夹下,使用如下命令将 CSV 文件同步到 S3:

cd ./sample_db/jaffle_shop

aws s3 sync . s3://<YOUR-BUCKET>/jaffle_shop/ --profile <YOUR-PROFILE>


注意: 请大家替换和为自己环境中的值;数据同步到 S3 之后,大家可以选择使用自己喜欢的 IDE 或者在 Amazon Web Services 控制台中,使用如下语句创建 Table:



使用如下语句把数据从 s3 加载到 redshift:


注意:需要替换上述代码中的','参考创建 Redshift 集群时 CDK 的 Output。


到此,我们已经准备好了 DBT 的开发环境,也准备好了 Redshift 中的数据,接下来为大家演示如何使用 DBT 来做 Data Transform,Test 和 Generate Doc。


使用 DBT 做 Data Transform,Test 和 Generate Doc


▼使用 DBT 做 Data Transform


如上文所讲,在 ELT 的模式中,使用 create table as 的方法来做 Data Transform。

在 DBT 的 Project 中,先定义对应的 model,再利用 dbt run 命令可以方便的来实现。


在数据准备阶段,创建了 raw_customers, raw_orders, raw_payments 三张表,现在模拟数仓分层,生成对应的 stg 数据, 在 DBT 中操作如下:
创建对应的 model, 内容如下:


stg_customers.sql
with source as (
select * from raw_customers
),

renamed as (
select
id as customer_id,
first_name,
last_name
from source
)

select * from renamed

stg_orders.sql
with source as (
select * from raw_orders
),

renamed as (
select
id as order_id,
user_id as customer_id,
order_date,
status
from source
)

select * from renamed

stg_payments.sql
with source as (
select * from raw_payments
),

renamed as (
select
id as payment_id,
order_id,
payment_method,

-- `amount` is currently stored in cents, so we convert it to dollars
amount / 100 as amount
from source
)

select * from renamed

复制
创建完成之后,文档的目录应如下图所示:


/models/example 文件夹为 DBT 生成的示例 model,这里可忽略。
允许 dbt run 命令,执行对应的数据转换:


执行完成之后,在 Redshift 进行验证:


可以看到,对应的 stg tables 都已创建完成,操作成功。


▼使用 DBT 做 Test


在做数据准备的时候,测试是提高效率,保证数据质量,降低 Bug 的有效手段。

在上述做 stg 的时候,如果对于数据有如下要求:
  • customer_id, order_id, payment_id 要求唯一切不能为 null
  • order的status 只能为 ’placed’, ‘shipped’, ‘completed’, ‘return_pending’, ‘returned’ 之一;
  • payment method 只可以为 ‘credit_card’, ‘coupon’, ‘bank_transfer’, ‘gift_card’ 之一;


这样的条件该如何满足呢?在 DBT 中,可以利用 yml 文件定义规则,然后使用 dbt run 来进行检查。


具体操作如下:创建 schema.yml 文件,放在 models/stg 文件夹下。


version: 2

models:
- name: stg_customers
columns:
- name: customer_id
tests:
- unique
- not_null

- name: stg_orders
columns:
- name: order_id
tests:
- unique
- not_null
- name: status
tests:
- accepted_values:
values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']

- name: stg_payments
columns:
- name: payment_id
tests:
- unique
- not_null
- name: payment_method
tests:
- accepted_values:
values: ['credit_card', 'coupon', 'bank_transfer', 'gift_card']

复制
在命令行 来进行测试:

dbt test --models stg_customers, stg_orders, stg_payments



测试成功。

▼使用 DBT Generate Doc


文档维护也是数据分析项目中极其重要又极其耗时的工作。使用 DBT,可以利用 yml  对数据格式进行描述,并自动生成文档:更新 schema.yml,添加 description 字段。


version: 2

models:
- name: customers
description: One record per customer
columns:
- name: customer_id
description: Primary key
tests:
- unique
- not_null
- name: first_order_date
description: NULL when a customer has not yet placed an order.

- name: stg_customers
description: This model cleans up customer data
columns:
- name: customer_id
description: Primary key
tests:
- unique
- not_null

- name: stg_orders
description: This model cleans up order data
columns:
- name: order_id
description: Primary key
tests:
- unique
- not_null
- name: status
tests:
- accepted_values:
values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']

复制
在命令行,使用命令生成文档,查看文档

dbt docs generate

dbt docs serve



文档生成成功。




总结



本文介绍了数据准备中的 ELT 的模式和 DBT,基于这个方案可以让数据分析人员使用 SQL 来做数据转换,测试和维护文档,希望对大家有所帮助。


作者介绍

韩医徽

亚马逊云科技解决方案架构师,负责亚马逊云科技合作伙伴生态系统的云计算方案架构咨询和设计,同时致力于亚马逊云科技云服务在国内的应用和推广。


- END -






长按识别左侧二维码

关注我们>>





关于西云数据(NWCD)]

宁夏西云数据科技有限公司(简称“西云数据”)是亚马逊云科技中国(宁夏)区域云服务的运营方和服务提供方,作为西云数据的战略技术合作伙伴,亚马逊云科技向西云数据提供技术、指导和专业知识。西云数据成立于 2015 年,是一家持有互联网数据中心服务和互联网资源协作服务牌照的云服务提供商。2017 年 12 月 12 日, 西云数据正式推出亚马逊云科技中国(宁夏)区域云服务,现已开通 3 个可用区。西云数据市场销售总部设立于北京,在全国多地设有分支机构以服务全国各地的企业客户。


西云数据致力于将世界先进的 Amazon Web Services 云计算技术带给中国客户,为客户提供优质、安全、稳定、可靠的云服务,全力支持中国企业和机构的创新发展。


关于亚马逊云科技]

15 年多以来,亚马逊云科技(Amazon Web Services)一直是世界上以服务丰富、应用广泛而著称的云平台。亚马逊云科技一直不断扩展其服务组合以支持几乎云上任意工作负载,目前提供了超过 200 项全功能的服务,涵盖计算、存储、数据库、联网、分析、机器人、机器学习与人工智能、物联网、移动、安全、混合云、虚拟现实与增强现实、媒体、以及应用开发、部署与管理等方面,遍及 25 个地理区域的 80 个可用区(AZ),并已公布计划在澳大利亚、印度、印度尼西亚、西班牙、瑞士和阿拉伯联合酋长国新建 6 个区域、18 个可用区。全球数百万客户,包括发展迅速的初创公司、大型企业和领先的政府机构都信赖亚马逊云科技,通过亚马逊云科技的服务强化其基础设施,提高敏捷性,降低成本。欲了解亚马逊云科技的更多信息,请访问:http://aws.amazon.com。


点分享
点收藏
点点赞
点在看
文章转载自西云数据云计算,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论