从 0 开始学大数据
李智慧
同程艺龙交通首席架构师,前 Intel 大数据架构师,《大型网站技术架构》作者
71151 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
智慧写给你的寄语 (1讲)
从 0 开始学大数据
15
15
1.0x
00:00/00:00
登录|注册

18 | 如何自己开发一个大数据SQL引擎?

从数据库引擎的工作机制解释PrepareStatement和MyBatis的防注入攻击的原理
ORM框架(如MyBatis)防注入攻击原理
JDBC的PrepareStatement防注入攻击原理
Panthera和Facebook手工Hive QL对比测试结果
将抽象语法树AST转换成Hive格式的抽象语法树
组合模式对抽象语法树AST进行遍历
装饰模式的语法等价转换类的构造
使用经典的设计模式
复杂的嵌套子查询消除
SQL的理论基础是关系代数
标准SQL和Hive QL的差别
保留Hive语义分析器,替换Hive语法解析器
将MapReduce执行计划和Hive执行函数代码提交到Hadoop上执行
将Hive抽象语法树转换成MapReduce执行计划
将输入的Hive QL转换成Hive抽象语法树
编译器
操作系统
开发数据库
思考题
SQL注入攻击和防御
对标准SQL的支持
Panthera的程序设计
Panthera的设计思路
Hive的主要处理过程
程序员的三大梦想
大数据开发需要关注的问题和解决方案
大数据开发者的视角
构建自己的技术知识体系
从开发者的视角看技术
大数据开发实践过程中的门道
如何自己开发一个大数据SQL引擎?

该思维导图由 AI 生成,仅供参考

从今天开始我们就进入了专栏的第三个模块,一起来看看大数据开发实践过程中的门道。学习一样技术,如果只是作为学习者,被动接受总是困难的。但如果从开发者的视角看,很多东西就豁然开朗了,明白了原理,有时甚至不需要学习,顺着原理就可以推导出各种实现细节
各种知识从表象上看,总是杂乱无章的,如果只是学习这些繁杂的知识点,固然自己的知识面是有限的,并且遇到问题的应变能力也很难提高。所以有些高手看起来似乎无所不知,不论谈论起什么技术,都能头头是道,其实并不是他们学习、掌握了所有技术,而是他们是在谈到这个问题的时候,才开始进行推导,并迅速得出结论。
我在 Intel 的时候,面试过一个交大的实习生,她大概只学过一点 MapReduce 的基本知识,我问她如何用 MapReduce 实现数据库的 join 操作,可以明显看出她没学习过这部分知识。她说:我想一下,然后盯着桌子看了两三秒的时间,就开始回答,基本跟 Hive 的实现机制一样。从她的回答就能看出这个女生就是一个高手,高手不一定要很资深、经验丰富,把握住了技术的核心本质,掌握了快速分析推导的能力,能够迅速将自己的知识技能推进到陌生的领域,就是高手。
这也是我这个专栏的目的,讲述大数据技术的核心原理,分享一些高效的思考和思维方式,帮助你构建起自己的技术知识体系。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了开发支持标准SQL语法的大数据SQL引擎的过程。作者首先回顾了Hive的成功和存在的问题,指出其使用自定义的Hive QL语法对传统数据仓库的分析师造成上手难度。随后,作者介绍了Panthera项目的开发思路,即保留Hive语义分析器不动,替换Hive语法解析器,使其能够处理标准SQL语句。文章还详细讨论了标准SQL和Hive QL的差别,以及如何处理复杂的嵌套子查询。作者还分享了Panthera项目组合使用的几种经典的设计模式,以及在程序设计上如何实现复杂的语法转换。整体而言,本文通过实际案例向读者展示了如何开发一个支持标准SQL语法的大数据仓库引擎,为读者提供了深入了解大数据SQL引擎开发过程的技术视角。文章还探讨了中国在底层技术开发和研究方面的不足,以及对未来发展的展望。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《从 0 开始学大数据》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(22)

  • 最新
  • 精选
  • 纯洁的憎恶
    基于SQL的大数据仓库引擎panthera的核心任务是把SQL语义与Hive AST对应起来。难点是SQL的语义远比Hive AST丰富,而幸运的事SQL丰富的表意逻辑主要源于它的嵌套子语句,这在Hive AST中是不存在的。但是SQL的嵌套子语句可以等价于若干jion操作。 为了在工程上降低实现难度,特意为每个语法点设计一个对象(类),这就将复杂问题分解为无数个小步骤,可以持续交付,不用长期等待,从而将不可能有条件的变为可能。而且每个类的代码十分简洁,遇到问题也便于各个击破。

    作者回复: 清晰👍🏻

    2018-12-17
    35
  • 李二木
    Oracle会有走向衰落吗?

    作者回复: 会,正在走向

    2018-12-09
    30
  • 反应慢
    之前有一段时间在学习函数式编程,和sql一样属于命令式编程,所以感觉以函数去解析sql是水到渠成的事情。不过至今没有动手去实现一下,比较遗憾

    作者回复: 赞,spark也往这个方向走。

    2018-12-14
    5
  • 都市夜归人
    private static SqlASTTransformer tf = new RedundantSelectGroupItemTransformer( new DistinctTransformer( new GroupElementNormalizeTransformer( new PrepareQueryInfoTransformer( new OrderByTransformer( new OrderByFunctionTransformer( new MinusIntersectTransformer( new PrepareQueryInfoTransformer( new UnionTransformer( new Leftsemi2LeftJoinTransformer( new CountAsteriskPositionTransformer( new FilterInwardTransformer( //use leftJoin method to handle not exists for correlated new CrossJoinTransformer( new PrepareQueryInfoTransformer( new SubQUnnestTransformer( new PrepareFilterBlockTransformer( new PrepareQueryInfoTransformer( new TopLevelUnionTransformer( new FilterBlockAdjustTransformer( new PrepareFilterBlockTransformer( new ExpandAsteriskTransformer( new PrepareQueryInfoTransformer( new CrossJoinTransformer( new PrepareQueryInfoTransformer( new ConditionStructTransformer( new MultipleTableSelectTransformer( new WhereConditionOptimizationTransformer( new PrepareQueryInfoTransformer( new InTransformer( new TopLevelUnionTransformer( new MinusIntersectTransformer( new NaturalJoinTransformer( new OrderByNotInSelectListTransformer( new RowNumTransformer( new BetweenTransformer( new UsingTransformer( new SchemaDotTableTransformer( new NothingTransformer()))))))))))))))))))))))))))))))))))))); 这个类在使用的时候该有多麻烦啊?

    作者回复: 事实上是非常简单~~ 将非常复杂的SQL语法转换解耦合,有兴趣建议看看更详细的代码

    2019-05-12
    3
    1
  • galen
    因为SQL语句在程序运行前已经进行了预编译,在程序运行时第一次操作数据库之前,SQL语句已经被数据库分析,编译和优化,对应的执行计划也会缓存下来并允许数据库已参数化的形式进行查询,当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or '1=1'也数据库会作为一个参数一个字段的属性值来处理而不会作为一个SQL指令,如此,就起到了SQL注入的作用了
    2018-12-08
    1
    27
  • 欧嘉权Felix
    如果用statement jdbc会简单拼接字符串然后作为sql执行 preparedstatement就会进行预编译 对其中的换行符等字符做转义 对注入的sql会起到混淆的作用 mybatis这些orm框架也是基于preparedstatement mybatis尽量使用#占位符
    2018-12-08
    15
  • Well_Ksun
    老师能简单聊聊presto吗?也是faceboook开源出来的。据说AWS 的 Athena 就是基于 Presto 的产品。
    2018-12-17
    9
  • 杰之7
    从这篇文章开始,大数据技术的体系架构知识就告一段落,但并不意味着已经完全掌握,我需要不断的回顾体系架构原理,这样才会有可能沿着这个思路有自己的一点拓展。回到本篇内容,如何自己开发SQL引擎,由于Hive语法元素少于标准SQL,且不支持复杂的嵌套子查询,所以开发的难点就是如何将复杂嵌套消除转化成标准SQL。在老师讲述的过程中,主要通过装饰模式等价转化类的构造,对于每一种新的语法通过开发新的Transformer类,然后通过组合模式将抽象语法树AST进行遍历,最后转化成Hive格式的抽象语法树。通过这样的整个过程,就完成的对Hive语法解析器的替换,保留了Hive语义分析器。通过本节的学习,我相信老师说的这套思路,那些技术厉害的人不是掌握了每一种技术,而是掌握了技术背后的体系和原理,当有新的技术出现时,同样先去思考技术背后的原理是什么,这样就算没有参与其中的技术,也会新的技术有一个好的认识。
    2018-12-09
    8
  • sql预编译,应该是将原始sql先解析成语法树,入参不能影响语法树的变化
    2020-01-14
    6
  • GeekGay
    https://github.com/lealone 来看看我们桂林的大才子zhh-4096,一个人开发6年的列锁极数据库,之前也去淘宝做个一两年数据库产品的。
    2019-11-08
    4
收起评论
显示
设置
留言
22
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部