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. 【机器学习】无监督学习
  2. 线程:suspend与resume方法
  3. Windows服务器上Mqtt服务器EMQX的安装使用
  4. [UML]UML系列——状态机图statechart diagram
  5. 使用ADO.NET查询和操作数据
  6. jQuery事件整合
  7. .net开发笔记(十三) Winform常用开发模式第一篇
  8. Math: Fibonacci
  9. 3D建模设计软件Rhino 7 for Mac
  10. Parse Server(含Dashboard)部署于Centos7.6 64位
  11. 第四章 实验三IBM MQ测试高可用,使用连接工厂(多地址连接方式)
  12. WGS-84坐标系转GCJ02坐标系
  13. 实习日记(4-28)
  14. oracle数据库自动修复,【案例】Oracle数据库由于存在坏块导致无法启动的恢复过程...
  15. 《小岛经济学》读书笔记
  16. Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 10
  17. swoole:mac下的测试工具
  18. 第四届蓝桥杯JavaA组省赛真题
  19. 判断两个String类型的是s1,s2是否相等?
  20. 什么专业可以免考计算机二级,计算机二级证书可以免考自考哪些科目?

热门文章

  1. Linux安装screen时的问题
  2. scum开服务器延迟高怎么办,人渣SCUM卡顿优化方法 人渣SCUM卡顿怎么办
  3. 操作api_币安多币种自动化策略API操作指南
  4. oracle 11g 清除 trc后缀文件,请教一个跟踪文件的问题。11g 很多trc文件。。
  5. 本机显示服务器文本信息,打开文档显示云服务器
  6. GitHub 的前世今生
  7. java plat停止_击按钮就停止运行,大牛帮我看看
  8. java 重用性_Java开发重用性必备的三大核心知识点
  9. mysql 视图触发器,MySql视图触发器存储过程详解
  10. jquery选择器:与、或逻辑