SQL、DML和DDL

举报
xcc-2022 发表于 2022/07/04 20:27:58 2022/07/04
【摘要】 文章目录系列文章目录DDL和DMLDDL:Stream:源表:datahub,kafka,sls,tt,continuous odpsDatahubKafka作为源表SlsTT结果表:hologres,kafka,sls,odps,rds,datahub,metaq,printHologressRdsMetaq维表:odps维表,rds维表视图viewDMLInsert intoDDL和DM...

文章目录
系列文章目录
DDL和DML
DDL:
Stream:
源表:datahub,kafka,sls,tt,continuous odps
Datahub
Kafka作为源表
Sls
TT
结果表:hologres,kafka,sls,odps,rds,datahub,metaq,print
Hologress
Rds
Metaq
维表:odps维表,rds维表
视图view
DML
Insert into
DDL和DML
DDL和DML语句有很多,这里只写在有了sql基础之后,比较特别的部分,如果工作需要其他函数的话可以直接查阅blink文档,这里不赘述了。

DDL:
Data Definition Language 数据定义语言,这部分主要分为stream ,batch,view,函数。
其实很好理解,建议不要直接啃语法,因为本身就没啥难度,看完语法反而有点晕。看一遍下面的步骤就很好理解了:创建原表,然后创建结果表,创建视图进行数据的一些操作,然后将视图中的数据插入结果表中,这就是一个最简单的代码结构了。

我们先从实例出发,一般的操作步骤如下:创建数据总线(DataHub)源表系统订单是实时产生的,源表语句如下。
系统订单是实时产生的,源表语句如下
CREATE TABLE online_retailers (
id VARCHAR, – 商品ID
buyer_id VARCHAR, – 买家ID
site VARCHAR, – 商品类别
pay_time VARCHAR, – 订单支付时间
buy_amount DOUBLE, – 订单金额
wap VARCHAR – 购买方式
) WITH (
type = ‘datahub’,
endPoint = ‘xxx’,
roleArn=‘xxx’,
project = ‘xxx’,
topic = ‘xxx’,
batchReadSize=‘500’
);
2.创建RDS结果表
RDS结果表语句如下。

CREATE TABLE ads_site_block_trd_pay_ri (
id VARCHAR,
buyer_id VARCHAR,
site VARCHAR,
pay_time VARCHAR,
buy_amount DOUBLE,
wap VARCHAR,
PRIMARY KEY (id,buyer_id,site)
) WITH (
type= ‘rds’,
url = ‘xxx’,
userName = ‘xxx’,
password = ‘xxx’,
tableName = ‘xxx’
);
3.创建一个View视图
如下根据商品ID、买家ID、商品类别、订单支付时间、订单金额和购买方式做分组操作。

CREATE VIEW tmp_ads_site_block_trd_pay_ri AS
SELECT
id,
buyer_id,
site,
date_format(pay_time,‘MMdd-yyyy’,‘yyyyMMdd’) as pay_time,
SUM(buy_amount) as buy_amount,
wap
FROM
online_retailers
GROUP BY id,buyer_id,site,pay_time,buy_amount,wap;

4.数据聚合后插入RDS结果表
把分组好的数据聚合后插入RDS结果表中,语句如下。

INSERT INTO ads_site_block_trd_pay_ri
SELECT
id,
buyer_id,
site,
pay_time,
buy_amount,
wap
FROM
tmp_ads_site_block_trd_pay_ri
GROUP BY id,buyer_id,site,pay_time,buy_amount,wap;
然后需要知道的就是流和批的概念,stream有创建源表,结果表,维表的语法;batch只有源表和结果表,文档就是这样的,我也不知道为啥。

Stream:
这里介绍的是stream中经常使用的源表,结果表,维表类型,具体的语法很简单,只是更改了with中的参数内容,具体可以参考官方文档:
https://help.aliyun.com/document_detail/62515.html?spm=a2c4g.11186623.6.748.2e2812edqxLSN1
https://yuque.antfin-inc.com/rtcompute/doc/sql-ddl-stream-source

源表:datahub,kafka,sls,tt,continuous odps
Datahub
阿里云流数据处理平台DataHub是流式数据(Streaming Data)的处理平台,提供对流式数据的发布 (Publish),订阅 (Subscribe)和分发功能,让您可以轻松构建基于流式数据的分析和应用。
在这里插入图片描述

Kafka作为源表
日志收集系统和消息系统。
从Kakfa读入的数据,都是序列化后VARBINARY(二进制)格式,对读入的每条数据,需要用户编写UDTF将其解析成序列化前的数据结构,Kafka源表数据解析流程一般为:Kafka Source Table -> UDTF -> Blink -> SINK。此外,blink SQL中也支持通过cast函数将varbinary解析为varchar类型

Sls
阿里云自主研发的针对日志数据的实时、大规模集中式管理服务SLS(Simple Log Service,简单日志服务),能够提供一个从日志采集、过滤、处理、聚合到在线查询的完整的海量日志处理平台,满足各种类型的日志处理分析需求,减轻广大开发者的负担。

TT
功能

实时数据总线
即Publish/Subscribe数据分发能力,支持数据单份写入,多份读出。
目前TT数据默认保存3天
数据同步
即将TT的数据同步到其他云产品中,弹内主要以ODPS为主。
结果表:hologres,kafka,sls,odps,rds,datahub,metaq,print
Hologress
一款全面兼容PostgreSQL协议并与大数据生态无缝打通的实时交互式分析产品,支持对万亿级数据进行高并发低延时多维分析透视和业务探索,可让您轻松而经济的使用现有BI工具分析所有数据

Rds
Relational database service 关系型数据库

Metaq
MetaQ是什么
meatq是阿里团队的消息中间件。是支撑双11最为核心的系统之一。
MetaQ的使用目的
解耦收发双方,使得系统异步化,同时利用消息中间件堆积消息的功能,可以使得下游系统在可以慢慢消费消息,增强系统的缓冲能力,达到“削峰填谷”的目的
在这里插入图片描述

维表:odps维表,rds维表
这里要首先介绍一下维表,以及为什么要进行维表join:
维表作为 SQL 任务中一种常见表的类型,其本质就是关联表数据的额外数据属性,通常在 Join 语句中进行使用。比如源数据有人的身份证号,人名,你现在想要得到人的家庭地址,那么可以通过身份证号去关联人的身份证信息,就可以得到更全的数据。
一般来说,还可以先join维表然后再进行补数据。
在这里插入图片描述
Blink SQL中没有专门为维表设计的DDL语法,使用标准的CREATE TABLE语法即可,但是需要额外增加一行PERIOD FOR SYSTEM_TIME的声明,这行声明定义了维表的变化周期,即表明该表是一张会变化的表。
声明一个维表的时候,必须要指名唯一键,维表JOIN的时候,ON的条件必须包含所有唯一键的等值条件。

CREATE TABLE white_list (
id varchar,
name varchar,
age int,
PRIMARY KEY (id), – 用做维表的话,必须有声明的主键
PERIOD FOR SYSTEM_TIME – 定义了维表的变化周期
) with (
type = ‘xxx’,

)
目前只支持源表 INNER/LEFT JOIN 维表

内置的维表提供三种缓存策略,分别是 None, LRU, ALL。不同类型的维表根据存储介质的特征支持其中一种或者多种缓存策略。
• None: 无缓存
• LRU: 最近使用策略缓存,需要配置相关参数:缓存大小(cacheSize)和 缓存超时时间(cacheTTLMs)
• ALL: 全量缓存策略。即在 Job 运行前会将远程表中所有数据 load 到内存中,之后所有的维表查询都会走 cache,cache 命中不到则不存在,并在缓存过期后重新加载一遍全量缓存。

Batch的源表和结果表省略

视图view
视图仅仅用于辅助计算逻辑的描述,不会产生数据的物理存储。视图是一种方便的方法,可以通过提供这些片段名称将SQL转换成可管理的视图块。因此,视图并不占用系统空间。
所以视图相当好用啊,很多代码都会用一堆view。

函数就不多说了

DML
Data Manipulation Language数据操纵语言,这个可说的不多,我认为重要的就一个insert,知道这个代码也都可以看懂了。

语法格式:

INSERT INTO tableName
[ (columnName[ , columnName]*) ]
queryStatement;
举例:

INSERT INTO LargeOrders
SELECT * FROM Orders WHERE units > 1000;
INSERT INTO Orders(z, v)
SELECT c,d FROM OO;
Insert into
流计算不支持单独的select 查询,必须有CREATE VIEW 或者是在 INSERT INTO内才能操作。
在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。