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语句转换相关推荐

  1. 2021年大数据Flink(三十):Flink ​​​​​​​Table API  SQL 介绍

    目录 ​​​​​​​Table API & SQL 介绍 为什么需要Table API & SQL ​​​​​​​Table API& SQL发展历程 架构升级 查询处理器的选 ...

  2. python sql语句换行_python一行sql太长折成多行并且有多个参数的方法

    python一行sql太长折成多行并且有多个参数 sql语句本身就支持多行, 你可以用两种方法断行 注意: 第一种会带入换行符(\n), 第二种只是一行 a='''xxxx本身也可以作为注释使用xxx ...

  3. 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 解决办 ...

  4. 2021年大数据Flink(三十三):​​​​​​​Table与SQL相关概念

    目录 相关概念 Dynamic Tables & Continuous Queries ​​​​​​​Table to Stream Conversion ​​​​​​​ ​​​​​​​相关概 ...

  5. Oracle和sql server中复制表结构和表数据的sql语句

    在Oracle和sql server中,如何从一个已知的旧表,来复制新生成一个新的表,如果要复制旧表结构和表数据,对应的sql语句该如何写呢?刚好阿堂这两天用到了,就顺便把它收集汇总一下,供朋友们参考 ...

  6. 人大金仓数据库sql语句_人大金仓数据库总结(SQL和JDBC)

    人大金仓作为一款国产数据库,使用的人数和相关资料都比较少. 最近使用人大金仓数据库,做了个简单的SQL和java jdbc的测试,希望能够供大家参考. 1.SQL语句 创建表: CREATE TABL ...

  7. drop sql语句_用于从表中删除数据SQL Drop View语句

    drop sql语句 介绍 (Introduction) This guide covers the SQL statement for dropping (deleting) one or more ...

  8. duration转为时间戳_Flink Table APIamp;SQL编程指南之时间属性(3)

    Flink总共有三种时间语义:Processing time(处理时间).Event time(事件时间)以及Ingestion time(摄入时间).关于这些时间语义的具体解释,可以参考另一篇文章F ...

  9. Flink Table和SQL的基本API

    文章目录 一个示例 程序架构 创建表环境 创建表 1.连接器 2.虚拟表 表的查询 1.执行SQL查询 2.调用Table API进行查询 3.两种API的结合使用 输出表 表和流的转换 1.将表转换 ...

最新文章

  1. 服务器修改网卡,美国服务器CentOS 6.x修改网卡名称的方法
  2. html如何提交保存,html表单提交保存
  3. 全面理解Javascript闭包和闭包的几种写法及用途--转载自https://www.cnblogs.com/yunfeifei/p/4019504.html...
  4. python入门到精通需要学多久-从Python入门到精通,你只需要在马哥教育待四个月...
  5. Mat, vectorpoint2f,Point3d Iplimage等等常见类型转换
  6. 深度学习(主要是CNN)用于图片的分类和检测总结
  7. 【算法】SVM分类精度为0,结果很烂怎么办?
  8. JDK——NIO系统调用浅析
  9. c++ 智能指针_详解 C++ 11 中的智能指针
  10. Angular的Zone-Evergreen在SAP Spartacus中的应用
  11. python学习-列表的操作(常用函数均会介绍)
  12. input中autocomplete属性
  13. 性能测试(二)确定需求,执行测试
  14. 数据增强 | 现实应用思考
  15. 华为-----任正非
  16. Google's BBR拥塞控制算法模型解析
  17. android edittext 英文数字键盘,Adroid EditText限制输入数字与英文默认弹出数字键盘...
  18. 禁用Windows Defender Antivirus Service
  19. 软件测试文档模板 ppt,软件测试技术.ppt.pdf
  20. 三维尺寸链计算和公差分析软件-DTAS-功能

热门文章

  1. Git的pull clone fetch
  2. 文件服务器定时开关机,如何配置作服务器定时开关机.ppt
  3. php 正则报错,PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析...
  4. python调用高德api路径规划_Python调用高德API实现批量地址转经纬度并写入表格的功能...
  5. 使用Socket模拟聊天室
  6. xml.etree ElementTree简介
  7. 2018一级计算机基础,2018年计算机一级考试计算机基础及Photoshop试题及答案.pdf
  8. c#连接oracle11,C#连接远程oracle11g数据库
  9. oracle可以在liux上装_【Oracle】手把手教你做之Linux上安装Oracle11g
  10. 如何理解java反射_怎么理解java反射