自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(284)
  • 资源 (1)
  • 收藏
  • 关注

原创 WeTune优化规则学习

WeTune挖掘的优化规则并不是100%能加速查询。因为输入数据的不一致,一个规则可能产生正向的优化、也可能产生负向的优化。

2024-03-10 16:13:21 345 1

原创 基于cglib动态代理实现metod的latency自动计算

众所周知,spring-aspects允许自定义注意来实现latency的通用逻辑注入。但笔者在维护的项目中,包管理非常混乱,不敢引入太多的新依赖。因此便学习如何自己编写“框架”代码,来实现这套逻辑。本文只是在MethodInterceptorImpl中注入了latency,实际上还可以实现更多其他的功能。

2023-05-27 17:55:56 161

原创 为Hive-1.2新增thrift接口的步骤

在hive_metastore.thrift定义接口、自定义bean类型和自定义异常

2022-12-04 16:39:19 838 1

原创 使用Mac编写Thirft的HelloWorld项目

最近在hive新增Thirft接口,于是学习了一下Thirft的使用根据thrift文件生成java基类在resource下创建一个hello.thrift文件进入resource,会在当前路径创建出一个gen-java.service.demo的文件夹。文件夹下面有Hello.java文件,将其移动到main目录的service.demo包中构建服务端并启动启动后,开源看到日志输出3. 创建客户端并访问服务端运行后成功拿到结果负责连接调度、服务的生命周期,定义接口是TServ

2022-12-04 16:38:07 454

原创 基于SqlNode的血缘解析

调试后,很快就能在测试专用方法assertFieldOrigin找到SqlValidatorTest$getFieldOrigins这个血缘入口方法。具体的实现如下:通过sqlSelect获得scope,每个scope再取出对应selectItem的SqlQualified。注意这里的selectItem是擦除了别名的,上面代码有个stripAs方法;getFieldOrigin是处理每个Field的方法,但是看代码只支持select语句,不支持insert语句。至此,可以获得列对应的表信息。

2022-11-27 14:28:28 862

原创 SparkSql Cache Table类语法编译原理

最近需要在自研的引擎实现SparkSQL的Cache Table逻辑,于是调研了一下相关语法的原理。

2022-10-12 19:50:34 1714

原创 Calcite中SQL血缘解析的实现原理

Calcite中血缘解析的使用和实现介绍

2022-09-04 10:24:29 1891

原创 浅谈Calcite的Calc优化

Calcite的Calc优化到底怎么用?

2022-07-18 10:17:18 381

原创 Flink计算列实现原理

文章目录CreateParseValidateConvertExecuteSelectParseValidateConvertCreateParse直接使用CalciteParser将String的Sql解析为SqlNode,虚拟列对应的SqlNode的SqlComputedColumn在Flink的设计文档中,虚拟列也被称为计算列。其实应该是刻意与Calcite原生的虚拟列区分开,因为Flink的计算列在Calcite的虚拟列上进行了一些封装。ValidateFlink不对DDL做val

2022-04-03 14:22:44 1891

原创 Calcite的CTE解析转换流程

前言从社区的jira发现了一个CTE相关的问题,着手修复前先看了看Calcite是如何处理CTE的。流程ParseParse完之后将CTE分成SqlWith了两部分withList(CTE定义可能有多个)和body两部分, body就是写在最后一段的查询(有可能不会用到所有定义的CTE)ValidateValidateWith的时候会对withList的的每一项进行验证ConvertconvertWith的时候先从body开始因为from的表可能是CTE中定义的,所以是在conver

2022-04-03 14:14:20 222

原创 Calcite的VolcanoPlanner调用流程简介

文章目录前言VolcanoPlannerchangeTraitssetRootfindBestExp总结前言之前分析过HepPlanner的调用以及Graph的变化,这次再来看看VolcanoPlanner的的调用和RelSet的变化VolcanoPlanner从VolcanoPlannerTest的单测不难发现,提供给用户直接调用的接口主要是changeTraits、setRoot、findBestExp三个实际上更这三个方法都被封装在了Programs中,用户一般直接使用Programs#r

2022-03-12 18:09:38 733

原创 从Flink1.8看看Calcite的优化规则怎么用

文章目录前言优化优化方式runHepPlannerrunVolcanoPlanner入口总结前言在Flink1.9之前只使用Calcite进行优化,之后因为Blink的合入才带来了Flink自己的优化策略。本文以Flink1.8为例子,看看Calcite的优化规则应该怎么使用。优化优化方式Calcite有两种优化方式,Flink所有的优化规则也都是用的这两种runHepPlannerFlink在使用HepPlanner的时候拆成了三层,最底层的负责创建Calcite的HepPlanner并执行

2022-03-06 16:31:24 1978

原创 Calcite HepPlanner的Graph

文章目录前言GraphaddRelToGraphLogicalTableScanLogicalProjectLogicalUnionLogicalIntersectapplyRulesapplyRule总结前言读到了篇有用的博客,介绍了Hepplaner的调用流程,总结起来就是setRoot()将RelNode注册到Graph中(Graph的顶点叫HepRelVertex是对RelNode封装),再进入findBest()按照program一组组的执行优化规则,从Graph中取出符合的点来应用规则。G

2022-03-04 19:43:05 461

原创 Calcite的RelFieldTrimmer简介

文章目录介绍调试起承转合总结介绍列裁剪是一种常见的SQL优化手段,Calcite当中通过RelFieldTrimmer来实现。代码基于calcite-1.29.0大概看一下这个类,它持有两个对象,relBuilder用来构建plan、trimFieldsDispatcher通过反射调用获得结果;它的方法可以分为三类,流程类、裁剪类和辅助类,下文会提到。调试我们可以通过debug单测来学习RelFieldTrimmer的处理逻辑,RelFieldTrimmerTest会通过RelBuilde

2022-02-26 17:00:00 313

原创 从Kylin看看Calcite的使用方式

文章目录前言文件概览ParseValidateconvertoptimize单测分析ParseValidateConvertOptimize前言之前分析了Flink中如何使用Calcite的,这次再来看看Kylin。与Flink直接使用Calcite的社区版本不同,Kylin单独维护了一个自己版本的Calcite这种方式优点是遇到能够更深入的开发一些社区不具备的功能,缺点是和社区同步升级成本较高(Calcite的社区版本已经到1.30.0了,Kylin还是在1.16.0的基础上发版)文件概览先粗

2022-02-05 15:59:54 1215

原创 从Flink看看Calcite的使用方式

文章目录前言分析parseplanner前言已经有过一些博客介绍了Calcite的源码,但还没有介绍过如何使用Calcite的。Flink解析和优化用的都是Calcite,加上Flink的代码质量,应该是最适合参考的项目之一了。分析Flink一直致力于流批一体的处理,重构了不少代码,但是SQL的解析优化都在table模块中1.14.3的flink依赖的calcite版本是1.26.0parseFlink有很多自己的语法,所以在flink-sql-parse中自定义了很多语法。Flink沿用了

2022-02-03 17:01:41 1704

原创 Calcite的PullUp规则

文章目录背景规则UnionPullUpConstantsRule做了什么?怎么做的?AggregateProjectPullUpConstantsRule做了什么?怎么做的?背景之前设计的tranform存在一个bug,可以通过将limit上提来解决,所以学习一下Calcite上提的规则。顺便也为之后的公共表达式消除打下基础。规则UnionPullUpConstantsRule做了什么?从名字不难看出是将union的常量上提,例如下面的SQL有两个常量2select 2, deptno, jo

2022-01-31 13:19:05 930

原创 从JdbcTest看看Calcite的View展开的流程

Calcite展开View的流程

2022-01-16 17:42:32 444

原创 简单三步为Calcite的SqlParser增加配置

前言Calcite使用JavaCC进行Parse,有着自己独特的parse语法。如果想对其进行修改,而又不影响原生的语法,通常会加一个配置参数——参数关闭的时候保持Calcite原生的Parse逻辑,开启后用自己写的逻辑。下面总结了增加配置的几个步骤步骤定义接口方法实现接口方法使用接口方法总结...

2021-12-11 16:00:59 1202

原创 使用Avro的JavaAPI读取Parquet

之前学习过一些Scala中不用Spark直接读取Parquet的API,又学习了一下JavaAPI的,在这分享出来。依赖用上了之前分享的mini clusters,这样就不用准备外部的HDFS了<dependency> <groupId>org.apache.parquet</groupId> <artifactId>parquet-avro</artifactId> <version>1.10.0</versio

2021-11-27 16:07:10 1040

原创 简单两步在单元测试中使用HDFS和Hive

INSERT VALUES Unit TestValidated SqlNode在这里插入代码片before fixINSERT INTO `CATALOG`.`SALES`.`T3`VALUES ROW('a', CAST(1.0 AS INTEGER), CAST(1 AS SMALLINT)),ROW('b', 2, CAST(2 AS SMALLINT)),ROW('c', 3.0, CAST(3 AS SMALLINT)),ROW('d', 4.0, 4),ROW('e', 5

2021-11-27 14:21:09 686

原创 后悔没能早知道的IDEA调试功能之变量操作

文章目录Part ANew Class Level Watch????InspectMark Object????Part BEvaluate Expression????Add to watchesShow Referring ObjectsShow ... ObjectPartCJump To SourceJump To Type SourcePart DView/Edit TextView as ...Show TypesMute RenderersCustomize Data Views????程

2021-11-07 14:08:09 3914

原创 后悔没能早知道的IDEA调试功能之调试会话器和工具窗口

文章目录调试会话开始重启停止配置调试工具FramesVariablesThreadsMemoryOverhead调试会话听????起来陌生,但看????起来熟悉,每次debug都会生成一个调试会话。我们可以在不同的调试会话☎️之间切换,下面就是调试会话列表,记录????着调试过的一些方法(对于我这种“健忘症”????患者太有用了) 调试会话列表可能为????️时,只要找到自己想debug的方法,????️右键debug就行。当然也可以参考官网上的做法,找到运行的按钮????,选择debug开始

2021-11-07 14:07:59 1132 1

原创 后悔没能早知道的IDEA调试功能之断点

文章目录断点类型行➡️断点方法????断点字段观察????点异常⚠️断点管理断点移除????断点静音????断点启用⏺️/停用⏹️断点移动/复制⏏️断点断点属性共有独有断点状态断点是debug中最基础、最常用的功能了。掌握下面的技巧,可以帮助你的老板更早换上新车 你更高效地完成✅工作。断点类型其实我也是读到官网的内容才知道断点也分为四种????…行➡️断点在到达设置断点的代码行时暂停程序(是它是它就是它~好像就只用它过这一种????)方法????断点进入或者退出方法时暂停(在方法第一行和最后一

2021-11-07 14:07:47 1543

原创 这些IDEA功能要是早点知道就好了~

前言今年6月毕业,正式入职一家节奏非常快的公司后,明显感觉自己的debug能力跟不上。于是决心抽点时间,系统性的学习一下Idea的各种功能。本系列基于idea2021.2版本调试首先关注的是调试功能,毕竟每次发现问题总是要花很久才能定位到。从官网能够找到十二个不同的调试功能和教程。在阅读的时候我流下了太多悔恨的泪水????,真后悔没能早点知道这些功能。于是整理出了下面的内容,希望能帮助更多的????‍????校招生们。后悔没能早知道的Idea调试功能之断点...

2021-11-07 14:07:31 252

原创 Calcite执行计划的四种展示格式

文章目录前言格式Text/StringXMLJSONDOT属性级别前言我们知道Calcite会将SQL为RelNode构成的执行计划,为了分析执行计划,经常会使用RelOptUtil.toString()将其转为字符串。其实,除了这种字符串之外还有更多的格式,可以展示执行计划:XML、JSON、DOT。格式在SqlExplainFormat中可以看到这四种格式,其中TEXT其实和String一样在RelOptUtilTest.java中构建一个单测,利用已有的relBuilder可以快速构建一个

2021-10-30 17:03:47 832

原创 使用Scala读取Parquet文件(Parquet4s的初次使用)

文章目录前言Local File专用通用HDFS File前言之前介绍过的Eel可以读取Hive表,也能读取Parquet文件,但是Eel的ParquetySource并不支持读Parquet目录。下面要介绍的这个项目Parquet4s支持读取Parquet目录,还能和Akka进行集成。Eel适合读Csv、Orc多种格式的场景,单论Parquet还是Parquet4s更专业libraryDependencies += “com.github.mjakubowski84” %% “parquet4

2021-10-23 16:30:17 1245

原创 使用Scala编写Akka的HelloWrold示例

进程内通信先使用一个进程来看一下Akka的基本使用import akka.actor.{Actor, ActorRef, ActorSystem, Props}object HelloWorld extends App { // 创建一个Actor系统 val system = ActorSystem("HelloWorld") // 根据class,创建一个Actor val outputActor = system.actorOf(Props[OutputActor], name

2021-10-10 17:39:46 128

原创 Java使用零拷贝上传文件

文章目录前言zero copyServerClienttraditionalServerClient前言我们知道Kafka和Netty这些框架都使用了零拷贝来提升性能,那自己的项目如何能像他们一样使用零拷贝呢?下面给出简演示的代码zero copyServer服务端准备接受文件package org.nefu.copy.zero;import java.io.IOException;import java.net.InetSocketAddress;import java.net.Ser

2021-10-07 11:58:30 540

原创 Apache Calcite的进化史

几个月前Calcite举办了一次线上的讨论会,讨论了开源的发展,也分享了Calcite这些年的演变。个人认为Calcite的发展史有助于学习Calcite,于是单独截取出来分享了一下。LucidDB这是一个数据库项目,包括了JDBC构成的前端和C++编写的后端。插件化C++编写的后端放在LucidDB中比较重,于是将其剥离,抽象为Adapter。不仅减轻了SQL解析优化的压力,还便于不同的引擎实现不同的后端逻辑。同时,这个阶段也将cataglog、rbo和cbo都改为可插拔的。3. Ca

2021-10-06 17:29:01 293

原创 Boss 2021上的Calcite教程

最近Calcite的PMC进行了一次分享,演示了如何使用Calcite,视频在Youtube对应的源码在GitHub,不过源码的LuceneQueryProcessor只是一个模版,我将实现的代码贴在下面/** * Plans and executes an SQL query in the file specified */ public static void main(String[] args) throws Exception { if (args.length !=

2021-10-05 18:17:38 596

原创 Calcite优化SQL的几个关键位置

文章目录前言HepPlanerfindBestExpexecuteProgramapplyRulesVolcanPlannerfindBestExpdrive前言在debug优化规则的时候总是容易走偏,找不到重点,于是刻意总结了一下优化规则中比较重要的代码位置。首先,Calcite的优化分为HepPlaner(RBO)和VolcanoPlanner(CBO),所以调用的主要代码都在他们当中HepPlanerHepPlaner会通过findBestExp去找到最优的planfindBestExp

2021-10-03 17:15:19 531

原创 Eel初次使用示例(使用Scala读取Hive表)

文章目录前言示例LocalCSV FileHiveParquetORC前言最近项目需要用Scala读取Hive的Table,但是Spark和Hive的API比较重量级,性能不够。于是调研,发现了一个更加底层的框架Eel:示例为了便于理解,先从读取简单的CSV开始LocalCSV File我自己新建了一个CSV文件school_number,student_name1,Bernoulli2,Newton3,Leibnizsbt导入依赖libraryDependencies += "

2021-10-03 17:12:18 658

原创 Idea配置Java项目的代码规范

不同的项目有不同的代码规范,在开发多个项目的时候经常需要切换代码规范,本文提供了每个项目只需要配置一次的方案安装CheckStyle-IDEA添加为check标准一般在maven项目的target中可以找到checkstyle-checker.xml文件配置为reformat标准...

2021-10-03 17:11:54 337

原创 直接使用Hive的Driver运行Fetch任务

前言大家都知道Hive的Fetch是常用的优化手段,但都是通过HiveCli或者HiveServer2执行的Fetch任务。这种方式足够一般的使用,但不利于集成到自己的项目。下面通过学习HiveFetch的单元测试来直接使用Driver运行Fetch任务。单测在 org.apache.hadoop.hive.ql.exec的TestOperators中有FetchOperator的单元测试@Test public void testFetchOperatorContext() throws Ex

2021-09-19 18:04:02 278

原创 Calcite中的常用工具类介绍

文章目录前言ParseSqlParserUtilValidateSqlValidatorUtilSqlTypeUtilOptimizeRelOptUtilRelMdUtilRelToSqlRelToSqlConverterUtil其他UtilConversionUtil前言工欲善其事,必先利其器,借助已有的一些工具类可以提高使用Calcite进行开发的效率。我们知道Calcite将SQL转换可以分为下面几个阶段:Parse->Validate->Optimize当进行SQL翻译的时候,还

2021-09-19 18:03:48 491

原创 Calcite优化规则之ProjectAggregateMergeRule

文章目录前言分析命中条件单元测试testProjectAggregateMergeNoOptestProjectAggregateMergeSum0testProjectAggregateMerge前言Calcite专注于SQL优化,有着大量的优化规则。本文以Calcite的1.27.0版本为例,介绍它的各种优化规则。分析命中条件这是触发ProjectAggregateMergeRule最典型的特征:Project的输入有一个Aggregate单元测试在RelOptRulesTest.jav

2021-08-29 17:44:03 373

原创 Calcite新增SQL语法步骤总结

在Parser.jj(扫描器)、SqlParserTest.java、reference.md中新增关键字在Parser.jj描述解析器(需要遵循JavaCC的规范),这个类主要有三个功能作为解析使用的SQL statement描述关键字的使用返回Java的SqlNode编写Java实现对应的SqlNode,这个类也有三个功能:记录Operand(如果有的话)和OPERATOR实现转SQL的unparse实现validate(通常会将具体逻辑写在SqlValidatorTest.

2021-08-29 17:42:46 452

原创 Presto新增SQL语法步骤总结

Presto使用ANTLR4解析SQL,ANTLR4新增语法一般为下三步:spark也使用ANTLR4解析SQL,这三步都一样在SqlBase,g4添加文法重新生成SqlBaseLexer、SqlBaseParser、SqlBaseVisitor和SqlBaseBaseVisitor在AstBuilder重写相应的方法接下来就是Presto所需要的步骤创建相应的Node可以直接继承Presto已经实现了的node,比如statement实现AstVisitor相应的visit

2021-08-29 17:37:44 740

原创 使用Coral将HiveView转为PrestoSQL

文章目录前言环境准备使用Coral总结前言随着技术的发展,Hive的计算逐渐被新生的引擎Spark、Presto这些取代。但是数据仓库元数据的管理依旧是交给HiveMetaStore,一些留存的View可能也需要使用新的引擎执行。Spark对Hive的语法兼容较好,不用担心ViewSQL的转换问题;Presto则严格地遵循ANSI标准,对Hive的兼容较差。于是有了一些项目将Hive的SQL转为其他引擎的SQL,Coral就是其中之一。环境准备已经有hive环境的可以直接使用自己的Hive环境

2021-08-21 16:28:19 1032 6

callLog项目数据生产工具

在linux当中每隔10S生成一行callLog的数据,用'java -cp calllogs-0.0.1-SNAPSHOT.jar product.AutoDataGen ./nam_num.csv ./calllog.csv'运行,其中nam_num.csv为姓名手机号映射的文件

2019-07-13

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除