文章目录
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内才能操作。