sql语句换行_Spark随笔|关于Bucket Table与SQL语句转换
Bucket Table
Bucket Table是一种Spark常见的优化查询的建表方式。创建方式是使用distributed by语法进行创建,会根据spark.sql.shuffle.partitions的值创建若干个bucket。Spark中对于两个大表的join,采用的方式是SortMergeJoin.而如果两个表都是bucket表,而且bucket数量相同(业界有公司针对这块的优化,如果两个bucket表bucket数量是倍数关系也可以进行bucket join),那么可以跳过sort和shuffle,直接进行join, 会产生较好的性能,通常需要业务方会约定好bucket的数量。
Spark针对bucket表读取的时候,会对每一个bucket分配一个task来读取,因为如果进行bucket join就不能再对这个bucket的数据进行拆分。但是问题来了,我们并不是每次读取bucket表都是为了进行bucket join,比如说有时候我们会对这个bucket进行更新操作。如果只是单纯的对这个bucket表进行一些处理操作,例如就是一个单纯的shuffle操作。而这个bucket表的每个bucket都特别大,例如大于1个G,而在shuffle write阶段要生成3G的数据。那么这时候对每个bucket分配一个task来处理就会非常吃力。
其实Spark SQL中有一个参数spark.sql.sources.bucketing.enabled,默认是true。如果我们将这个参数设置为false,那么spark就会将一个bucket table看做一个普通的table。这意味着什么呢?Spark对于普通表,如果他的单个文件大于一个hdfs block大小(通常是128M),而且这个文件又是可拆分的(例如text文本,snappy 压缩格式的parquet文件等等),那么Spark会按照这个文件拆分,分配多个task来处理。因此,针对我们上面的场景,设置这个参数为false,可以大大的加快map阶段的执行,起到优化的效果。
解析和更改Spark SQL语句
如果你有对一个Spark SQL语句进行解析和更改部分语句的需求。
例如我需求对一条SQL中的表名进行映射修改,或者对其中的UDF(其实在Spark SQL中function和table是很类似的东西)和location信息进行修改。
可能首先想到的就是使用正则进行字符串匹配,去寻找自己需要的字段,但是这种方法十分的不靠谱,因为SQL的语法十分复杂,我们很难完全准确的抓取到自己需要的信息。
所以我们能不能根据抽象语法树去拿到我们想要的字段呢?答案当然是OK的,一条SQL语句进行解析器之后都成为一个抽象语法树,每个TreeNode都有自己的类型,我们可以根据这些类型拿到自己想要的信息,比如table name,function name,location等等信息(table根据TableIdentifier类型节点获得,function根据FunctionIdentifier, location信息从LoadDataCommand或者CreateTableCommand中获取)。如下图所以,一条SQL语句INSERT INTO TRABLE tb SELECT ta.id FROM ta JOIN tb on ta.id=tb.id会被大概转化为下面一个AST.
但是,当我们拿到我们想要的信息,之后如何转换想要的SQL呢?
我第一想法是说,直接修改这个AST,然后将这个AST转化为一条SQL语句。但是AST转SQL很麻烦的事情,需要你自己精通SQL语法,然后写一套 Plan转String的规则。这听起来就很麻烦。好在经过一番探索:
Spark使用antlr v4进行sql解析
每个SQL最开始解析为一个原始的AST(parsedPlan,未经过analyze/optimize)
这个SQL也对应一个ParserRuleContext(package org.antlr.v4.runtime)
ParserRuleContext其实也是一棵树,类似于AST,但是它的每个叶子节点会对应一段text,也就是说对应一部分原始的SQL语句(table对应TableIdentifierContext,function对应QualifiedNameContext, location对应LocationSpecContext)。
感兴趣的话可以去看这个类的源码:
https://github.com/antlr/antlr4/blob/master/runtime/Java/src/org/antlr/v4/runtime/ParserRuleContext.java。
前面我们提到的语句会被转化为下面的一棵树,我这里是将其转为String打印出来,在每个节点处进行换行。
有了这样的两棵树AST和ParserRuleContext,我们就可以根据第一棵树,拿到我们想要的信息,然后再在第二棵树上面找到其对应的偏移量。然后对对应部分进行替换,之后再把第二棵树的碎片对应的文本拼接起来就好了。
HBase 官方社区推荐必读好文
HBase 原理|HBase 内存管理之 MemStore 进化论
HBase 抗战总结|阿里巴巴 HBase 高可用8年抗战回忆录
HBase 实践|说好不哭,但 HBase 2.0 真的好用到哭
↓扫码关注 HBase 技术社区公众号↓
sql语句换行_Spark随笔|关于Bucket Table与SQL语句转换相关推荐
- 2021年大数据Flink(三十):Flink Table API SQL 介绍
目录 Table API & SQL 介绍 为什么需要Table API & SQL Table API& SQL发展历程 架构升级 查询处理器的选 ...
- python sql语句换行_python一行sql太长折成多行并且有多个参数的方法
python一行sql太长折成多行并且有多个参数 sql语句本身就支持多行, 你可以用两种方法断行 注意: 第一种会带入换行符(\n), 第二种只是一行 a='''xxxx本身也可以作为注释使用xxx ...
- navicat for mysql执行sql语句报错: [Err] 1146 - Table ‘performance_schema.session_status‘doesn‘t exist 解决办法
navicat for mysql执行sql语句报错: [Err] 1146 - Table 'performance_schema.session_status' doesn't exist 解决办 ...
- 2021年大数据Flink(三十三):Table与SQL相关概念
目录 相关概念 Dynamic Tables & Continuous Queries Table to Stream Conversion 相关概 ...
- Oracle和sql server中复制表结构和表数据的sql语句
在Oracle和sql server中,如何从一个已知的旧表,来复制新生成一个新的表,如果要复制旧表结构和表数据,对应的sql语句该如何写呢?刚好阿堂这两天用到了,就顺便把它收集汇总一下,供朋友们参考 ...
- 人大金仓数据库sql语句_人大金仓数据库总结(SQL和JDBC)
人大金仓作为一款国产数据库,使用的人数和相关资料都比较少. 最近使用人大金仓数据库,做了个简单的SQL和java jdbc的测试,希望能够供大家参考. 1.SQL语句 创建表: CREATE TABL ...
- drop sql语句_用于从表中删除数据SQL Drop View语句
drop sql语句 介绍 (Introduction) This guide covers the SQL statement for dropping (deleting) one or more ...
- duration转为时间戳_Flink Table APIamp;SQL编程指南之时间属性(3)
Flink总共有三种时间语义:Processing time(处理时间).Event time(事件时间)以及Ingestion time(摄入时间).关于这些时间语义的具体解释,可以参考另一篇文章F ...
- Flink Table和SQL的基本API
文章目录 一个示例 程序架构 创建表环境 创建表 1.连接器 2.虚拟表 表的查询 1.执行SQL查询 2.调用Table API进行查询 3.两种API的结合使用 输出表 表和流的转换 1.将表转换 ...
最新文章
- 服务器修改网卡,美国服务器CentOS 6.x修改网卡名称的方法
- html如何提交保存,html表单提交保存
- 全面理解Javascript闭包和闭包的几种写法及用途--转载自https://www.cnblogs.com/yunfeifei/p/4019504.html...
- python入门到精通需要学多久-从Python入门到精通,你只需要在马哥教育待四个月...
- Mat, vectorpoint2f,Point3d Iplimage等等常见类型转换
- 深度学习(主要是CNN)用于图片的分类和检测总结
- 【算法】SVM分类精度为0,结果很烂怎么办?
- JDK——NIO系统调用浅析
- c++ 智能指针_详解 C++ 11 中的智能指针
- Angular的Zone-Evergreen在SAP Spartacus中的应用
- python学习-列表的操作(常用函数均会介绍)
- input中autocomplete属性
- 性能测试(二)确定需求,执行测试
- 数据增强 | 现实应用思考
- 华为-----任正非
- Google's BBR拥塞控制算法模型解析
- android edittext 英文数字键盘,Adroid EditText限制输入数字与英文默认弹出数字键盘...
- 禁用Windows Defender Antivirus Service
- 软件测试文档模板 ppt,软件测试技术.ppt.pdf
- 三维尺寸链计算和公差分析软件-DTAS-功能
热门文章
- Git的pull clone fetch
- 文件服务器定时开关机,如何配置作服务器定时开关机.ppt
- php 正则报错,PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析...
- python调用高德api路径规划_Python调用高德API实现批量地址转经纬度并写入表格的功能...
- 使用Socket模拟聊天室
- xml.etree ElementTree简介
- 2018一级计算机基础,2018年计算机一级考试计算机基础及Photoshop试题及答案.pdf
- c#连接oracle11,C#连接远程oracle11g数据库
- oracle可以在liux上装_【Oracle】手把手教你做之Linux上安装Oracle11g
- 如何理解java反射_怎么理解java反射