首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用Calcite解析Sql做维关联(二)

继上一篇中使用Calcite解析Sql做维关联(一) 介绍了建表语句解析方式以及使用calcite解析解析流join维方法,这一篇将会介绍如何使用代码去实现将sql变为可执行的代码。...部分得到的流先转换为流,然后根据维配置的属性(维来源、查询方式等)选择不同的维关联策略,得到一个关联之后的流,最后将这个流注册为一张;对于insert部分就比较简单,insert部分的select...的直接更换为关联之后的流,然后执行即可。...以异步查询mysql为例分析:需要根据维定义的字段、join的关联条件解析生成一条sql语句,根据流入数据解析出sql的查询条件值,然后查询得到对应的维值,将流入数据与查询得到的维数据拼接起来输出到下游...维sql实现思路以及部分demo代码的参考,但是其远远达不到工程上的要求,在实际使用中需要要考虑更多的因素:复杂嵌套的sql、时间语义支持、自定义函数支持等。

51020
您找到你想要的搜索结果了吗?
是的
没有找到

使用Calcite解析Sql做维关联(一)

关联是离线计算或者实时计算里面常见的一种处理逻辑,常常用于字段补齐、规则过滤等,一般情况下维数据放在MySql等数据库里面,对于离线计算直接通过ETL方式加载到Hive中,然后通过sql方式关联查询即可...透过维服务系列里面讲到的维关联都是使用编码方式完成,使用Map或者AsyncIO方式完成,但是这种硬编码方式开发效率很低,特别是在实时数仓里面,我们希望能够使用跟离线一样sql方式完成维关联操作。...在Flink1.9中提供了使用sql化方式完成维关联,只需要实现LookupableTableSource接口即可,可以实现同步或者异步关联。...根据sql解析顺序先 from 部分、然后where 部分、最后select,那么对于join 方式,相当于join生成了一张临时,然后去select 这张临时,因此可以确认 sql解析流程: 1....sql解析部分已经完成,既然使用sql化方式,因此也需要定义源与维,数据源一般是kafka, 定义源需要:名称、字段名称、字段类型、数据格式、topic;维假设为mysql,需要定义:名称、

74330

SQL处理结构的基本方法整理(创建关联,复制表)

FROM 旧表 如果是 SQL SERVER 2008 复制表结构,使用如下方法: 在上面右击——编写脚本为:——Create到——新查询编辑器窗口,你也可以保存为sql文件, 新查询编辑器窗口的话在最上面一条把...SQL SERVER 2008 insert into b(a, b, c) select d,e,f from b; 说明:复制表(只复制结构,源名:a 新名:b) SQL: select* into...b from a where 11 说明:拷贝(拷贝数据,源名:a 目标名:b) SQL: insert into b(a, b, c) select d,e,f from b; 其他说明...wheretable.title=a.title) b 说明:外连接查询(名1:a 名2:b) SQL: selecta.a, a.b, a.c, b.c, b.d, b.f froma LEFT...))>5 说明:两张关联,删除主表中已经在副中没有的信息 SQL: delete from info wherenot exists ( select* from infobz where info.infid

89030

SQL处理结构的基本方法整理(创建关联,复制表)

FROM 旧表 如果是 SQL SERVER 2008 复制表结构,使用如下方法: 在上面右击——编写脚本为:——Create到——新查询编辑器窗口,你也可以保存为sql文件, 新查询编辑器窗口的话在最上面一条把...SQL SERVER 2008 insert into b(a, b, c) select d,e,f from b; 说明:复制表(只复制结构,源名:a 新名:b) SQL: select* into...b from a where 11 说明:拷贝(拷贝数据,源名:a 目标名:b) SQL: insert into b(a, b, c) select d,e,f from b; 其他说明...wheretable.title=a.title) b 说明:外连接查询(名1:a 名2:b) SQL: selecta.a, a.b, a.c, b.c, b.d, b.f froma LEFT...))>5 说明:两张关联,删除主表中已经在副中没有的信息 SQL: delete from info wherenot exists ( select* from infobz where info.infid

1.7K40

mysql 小A驱动大B在内关联时候,怎么写sql?那么左关联呢?右关联有怎么写?

一:mysql 小A驱动大B在内关联时候,怎么写sql在MySQL中,可以使用INNER JOIN语句来内关联两个。如果要将小A驱动大B进行内关联,可以将小A放在前面,大B放在后面。...和columnY是用于内关联的列。...二:mysql 小A驱动大B在右关联时候,怎么写sql?左关联怎么写?在MySQL中,通过RIGHT JOIN(右连接)可以将小A驱动大B的连接操作。...下面是示例SQL语句,演示如何使用右连接:SELECT *FROM tableB BRIGHT JOIN tableA A ON A.id = B.id;在上述例子中,tableA是小A,tableB...三:mysql执行sql顺序 是从左到右还是从右到左?在MySQL中,SQL语句的执行顺序是从上到下,从左到右的顺序。具体来说,MySQL首先会解析FROM子句,然后根据JOIN条件连接相关的

17110

SQL Tuning 基础概述06 - 关联方式

nested loops join(嵌套循环) 驱动返回几条结果集,被驱动访问多少次,有驱动顺序,无须排序,无任何限制。 驱动限制条件有索引,被驱动连接条件有索引。...hints:use_hash() 实验验证: 1.不同连接的访问次数验证 2.不同连接的驱动顺序区别 3.不同连接的排序情况分析 4.不同连接的限制场景对比 5.不同连接和索引的关系...,网上也有一个普遍流行的观点,就是小作为驱动。...正确地描述应该是:对于nested loops join和hash join来说,小的结果集先访问,大的结果集后访问(即与的大小没有关系,与具体sql返回的结果集大小有关);而对于merge sort...(虽然在两张的连接条件都建立了索引,却只能消除一张的排序操作) 注:本文为《收获,不止Oracle》连接一章的总结笔记。

37520

Mybatid关联查询

一、一对一关联  1.1、提出需求   根据班级id查询班级信息(带老师的信息) 1.2、创建和数据   创建一张教师表和班级,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系...  MyBatis中使用association标签来解决一对一的关联查询,association标签可用的属性如下: property:对象属性的名称 javaType:对象属性的类型 column:...所对应的外键字段名称 select:使用另一个查询封装的结果 二、一对多关联 2.1、提出需求   根据classId查询对应的班级信息,包括学生,老师 2.2、创建和数据   在上面的一对一关联查询演示中...Student [id=3, name=student_C]]] 41 System.out.println(clazz); 42 } 43 }  2.6、MyBatis一对多关联查询总结...  MyBatis中使用collection标签来解决一对多的关联查询,ofType属性指定集合中元素的对象类型。

3.2K70

SQL关联查询

(1)形式一 select 字段列表 from A inner join B on 关联条件 【where 其他筛选条件】 说明:如果不写关联条件,会出现一种现象:笛卡尔积 关联条件的个数 = n...select 字段列表 from A left join B on 关联条件 where 从关联字段 is null 右外连接(RIGHT OUTER JOIN) 第一种结果:B ?...select 字段列表 from A left join B on 关联条件 union select 字段列表 from A right join B on 关联条件 (3)A ∪ B - A...select 字段列表 from A left join B on 关联条件 where 从关联字段 is null union select 字段列表 from A right join B... on 关联条件 where 从关联字段 is null 自连接:当table1和table2本质上是同一张,只是用取别名的方式虚拟成两张以代表不同的意义

88420

flink维关联系列之kafka维关联:广播方式

关联系列目录: 一、维服务与Flink异步IO 二、Mysql维关联:全量加载 三、Hbase维关联:LRU策略 四、Redis维关联:实时查询 五、kafka维关联:广播方式 六、自定义异步查询...广播状态用于维关联 如果需求上存在要求低延时感知维数据的更新,而又担心实时查询对外部存储维数据的影响,那么就可以使用广播方式将维数据广播出去,既能满足实时性、又能满足不对外部存储产生影响,仍然以用户行为规则匹配为例...broadcastStateDesc).put(value.actionType,value) } }) env.execute() 以上就是简易版使用广播状态来实现维关联的实现...,由于将维数据存储在广播状态中,但是广播状态是非key的,而rocksdb类型statebackend只能存储keyed状态类型,所以广播维数据只能存储在内存中,因此在使用中需要注意维的大小以免撑爆内存

91431

flink维关联系列之Hbase维关联:LRU策略

关联系列目录: 一、维服务与Flink异步IO 二、Mysql维关联:全量加载 三、Hbase维关联:LRU策略 四、Redis维关联:实时查询 五、kafka维关联:广播方式 六、自定义异步查询...在Flink中做维关联时,如果维的数据比较大,无法一次性全部加载到内存中,而在业务上也允许一定数据的延时,那么就可以使用LRU策略加载维数据。...但是如果一条维数据一直都被缓存命中,这条数据永远都不会被淘汰,这时维的数据已经发生改变,那么将会在很长时间或者永远都无法更新这条改变,所以需要设置缓存超时时间TTL,当缓存时间超过ttl,会强制性使其失效重新从外部加载进来...接下来介绍两种比较常见的LRU使用: LinkedHashMap LinkedHashMap是双向链表+hash的结构,普通的hash访问是没有顺序的,通过加上元素之间的指向关系保证元素之间的顺序,...可配置淘汰策略 非常适用于Flink维关联LRU策略,使用方式: cache = CacheBuilder.newBuilder() .maximumSize(1000

1K21

改写的力量--SQL函数转关联优化案例一则

在对某客户一经营分析系统做优化的时候,通过检查超长时间SQL发现了它,这是一个执行时间与数据处理量不相匹配的SQLsql monitor显示如下: 查看sql,发现在返回列使用了一个函数,SQL代码简化如下...a.other_area,null,900,nvl(c.bas1_id,900)) OTHER_AREA_CODE 2、将cmdss.T_STD1_0007剔重(row_number()函数)后作为c与...a做外关联: (select * from (SELECT bas1_id,bas2_id,row_number() over (partition by bas2_id order by rowid...) as rn FROM cmdss.T_STD1_0007 where rule_id='1') where rn=1) c , a.other_area=c.bas2_id(+) 改写后的SQL...总结: SQL代码中,应尽可能使用关联而不是使用自定义的一些包含select的一些函数。这个案例的性能对比充分的证明了这一点。

24010

MyBatis 实现关联查询

一、一对一关联  1.1、提出需求   根据班级id查询班级信息(带老师的信息) 1.2、创建和数据   创建一张教师表和班级,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系...  MyBatis中使用association标签来解决一对一的关联查询,association标签可用的属性如下: property:对象属性的名称 javaType:对象属性的类型 column:...所对应的外键字段名称 select:使用另一个查询封装的结果 二、一对多关联 2.1、提出需求   根据classId查询对应的班级信息,包括学生,老师 2.2、创建和数据   在上面的一对一关联查询演示中...Student [id=3, name=student_C]]] 41 System.out.println(clazz); 42 } 43 }  2.6、MyBatis一对多关联查询总结...  MyBatis中使用collection标签来解决一对多的关联查询,ofType属性指定集合中元素的对象类型。

2.7K140
领券