聊聊SQL

254 阅读4分钟

单纯一提到SQL会想到什么:mysql、B+树、索引优化……

加上大数据呢?首先想到的就是hive

为什么要有一个hive出现?

  • 是因为MapReduce写起来太麻烦了吗?确实是一个原因
  • 元数据!这个概念在使用传统数据库的时候被无限的包装,让大家没感觉到元数据的存在(比如你玩mysql,他就是个单机的程序,在mysql内部他自己管理着底层文件目录等等,我起码单纯在用MySQL的时候没有感觉到元数据的存在)

但是在分布式,多技术的情况下,元数据就非常重要了。一般会有xxx on xxx 例如:spark on hive

深入理解元数据

如果你在一个公司工作了10年,你手上有很多的数据,可能会在hdfs、hbase……。如果在hdfs那么数据就是很多的目录,很多的文件。但是突然有人问我某个目录下某个文件,第xx列是什么意思,这列很有可能还全是码值(例如0:男、1:女) 我如果打开这个文件,其实我是懵逼的,我怎么知道他是啥,虽然是我上传的。我也可以在脑子里全记住,但是很辛苦,肯定记不清楚。

人工维护元数据

认识一个银行工作很多年的老大哥,在很多年前,每个项目组会把自己的表在什么库,以及这个表是干嘛用的,里面有哪些字段,字段的类型等等维护在Excel并上传svn。

当某个新需求下来时,会花很多人力精力去svn上找各个部门的excel表格,梳理出要做这个项目需要连接那些数据库,用哪些表的哪些字段等等。如果没有这些Excel就完蛋了。这其实就是元数据的重要性。人肉做的。能搞死人,不过没点儿工作量怎么挣钱呢?但是全是人工来做的,很容易弄错。

人是懒惰的,懒惰促进科技的进步。用程序完成人的一些行为,涉及到程序就是软件工程学,需要有统一的接口定义,抽象出一些层次来,约束用户的行为(因为人的行为一定有一些特征)。根据这些特征就能把文件抽象成table。接着往下看。

table

数据可以以纯文本的形式存在,如果是结构化的,其实也可以是表格的形式存在。table的话里面有schema,这其实是一部分元数据。且我们一般会用SQL进行操作

SQL

sql是作用在table这种模型下的。如果对于文件的话,操作无非就是read、write。

但是table其实是一个虚的概念,只是有个映射把结构化的文本映射成表格。我们select from一个表,其实是定位到了文件在哪。文件在哪里,这也是元数据。

MySQL内部也记录了某个表在哪个dir下(其实还存了表对应的是哪个文件),用户直接查xxoo这张表,xxoo只是个字符串,想想他怎么就能把数据查出来呢?就是靠元数据。

sql是对人友好的,但是说直接点,就是通过元数据找到需要的文件,本质是读文件然后进行相关操作。

hive

hive给人第一直观的感觉就是能把sql翻译成MapReduce。来捋一下怎么做的。

不管是spark flink还是mr。就是一个input transform sink的过程。想想用hadoop命令提交mr程序的时候,需要传入input、output这两个参数,对于sql来说,input就是from后面的表。

hive的ddl是比较复杂的,ddl的过程就是记录元数据的过程。当select xxx from ooxx的时候,会查有没有ooxx这个表。

sql最后翻译成mr,其实就是读文件了,但是程序怎么读文件呢?最核心的类就是InputFormat。这块和ddl 中的store as成什么格式也是有关系的。同样也是元数据的一部分。