HIVE
HiveQL
一般是大小写无关的(除了字符串比较以外)
hive 新建表:
![](https://i-blog.csdnimg.cn/blog_migrate/df64aff98e62474bcf68dcfc4cc7393a.png)
ROWFORMAT
子句是 HiveQL所特有的。这个子句所声明的是数据文件的每一行是由制表符分隔的文本。 Hive 按照: 每行三个字段,分别对应于表中的三列,
字段间以制表符分隔 每行以换行符分隔,这一格式读取数据。
![](https://i-blog.csdnimg.cn/blog_migrate/a7682591c2f2f1cda38f9c8c7f1126ea.png)
LOADDATA
语句中的
OVERWRITE
关键字告诉
Hive 删除表所对应目录中已有的所有文件。
如果省去这一关键字, Hive 就简单地把新的文件加入目录(除非目录下正好有同名的文件,否则将替换掉原有的同名文件)。
配置Hive
hive的配置文件为hivesite.xml , 可以通过传递 -config 选项参数给 hive 命令以重新定义 Hive 查找 hive-site.xml, Hive 还允许你向 hive 命令传递 -hiveconf 选项来为单个会话(session)设置属性。从(1)-(6)优先级依次降低:
![](https://i-blog.csdnimg.cn/blog_migrate/7c956b05e17ac22e917299d9bec92618.png)
(1)Thrift Clients
Hive的Server是基于Apache Thrift的,所以支持thrift客户端的查询请求
(2)JDBC Client
允许使用Java通过JDBC driver连接Hive,JDBC driver使用Thrift与Hive进行通信的
(3)ODBC Client
Hive的ODBC driver允许使用基于ODBC协议的应用来连接Hive,与JDBC driver类似,ODBC driver也是通过Thrift与Hive server进行通信的
- Hive Driver
Hive Driver接收来自客户端提交的HQL语句,创建session handles,并将查询发送到Compiler(编译器)。
- Hive Compiler
Hive的Compiler解析查询语句,编译器会借助Hive的metastore存储的元数据信息,对不同的查询块和查询表达式执行语义分析和类型检查,然后生成执行计划。
编译器生成的执行计划就是DAG,每个Stage可能代表一个MR作业。
- Optimizer(优化器)
比如列裁剪、谓词下推等优化,提升查询效率
Metastore
metastore是 Hive 元数据的集中存放地。 metastore 包括两部分:服务和后台数据的存储,默认情况下, metastore 服务和 Hive 服务运行在同一个 JVM 中,它包含一
个内嵌的以本地磁盘作为存储的
Derby
数据库实例。
使用内嵌
metastore
Hive
入门最简单的方法。但是,
只使用一个内嵌 Derby 数据库每次只能访问一个磁盘上的数据库文件
,这也就意味着你一次只能为每个metastore
打开一个
Hive
会话。
更进一步,还有一种
metastore
配置称为"远程
metastore" 。在这种配置下
,一个或多个 metastore 服务器和 Hive 服务运行在不同的进程内
。
因为这样一来, 数据库层可以完全置于防火墙后,客户端则不需要数据库凭证(用户名和密码) , 从而提供更好的可管理性和安全。 可以通过把 hive.metastore.local 设为false ,hive.metastore.uris 设为
metastore 服务器 URI( 如果有多个服务器,各个 URI 之间用逗号分隔),来把 Hive 服务设为使用远程 metastore。
metastore
服务器
URI
的形式为
thr
ift://host:port。
端口号对应于启动
metastore
服务器时所设定的
METASTORE_PORT
值。
hive和传统数据库的区别:
在传统数据库里,表的模式是在数据加载时强制确定的。
如果在加载时发现数据不
符合模式,则拒绝加载数据。
因为数据是在写入数据库时
对照模式进行检查,
因此
这一设计有时被称为"
写时模式
"。
Hive
对数据的验证并不在加载数据时进行,而在查询时进行。这称
为"
读时模式
"。
更新、事务和索引都是传统数据库最重要的特性。但是,直到最近hive 也还没有考虑支持这些特性。因为 Hive 被设计为用 MapReduce 操作 HDFS 数据。在这样的环境下,
"全表扫描" (full-table scan)是常态操作,而表更新则是通过把数据变换后放入新表实现的。目前hive索引分为两类:紧凑索引和位图索引。
紧凑索引存储每个值的HDFS块号,不会占用太多的磁盘空间。位图索引使用压缩的位集合来存储具有某个特殊值的行,这种索引适合取值可能性较少的字段,如性别。
HiveQL
![](https://i-blog.csdnimg.cn/blog_migrate/4fc662c77f9ecbb52bce1a4b67762543.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0b68ceb3de1a5636ccbf5bc217fa18a1.png)
数据类型
![](https://i-blog.csdnimg.cn/blog_migrate/7e9f4f6678b2c512c67b61c47687da23.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e8a50472552e71d8807210aacb4de101.png)
Describe function length;了解某个特定函数的使用帮助,hive不会反向转化类型,除非使用cast,强制转化失败会返回NULL
内部表和外部表:内部表Hive管理数据,hive会把数据移动到仓库目录下(warehouse directory),外部表是hive到仓库目录以外的位置访问数据,两者之间的区别的drop的时候,
内部表会把元数据和数据一起删除,外部表只会删除元数据,
分区并不包含在hive的表的数据中,可以把分区当做一个目录,在写数据的时候创建目录,并把数据写进去
桶:把表(或分区)组织成桶 (bucket) 有两个理由。第一个理由是获得更高的查询处理效
率,把表划分成桶的第二个理由是使"取样"
(sampling)
更高效。
下列语句把表划分为桶(指定划分为桶的列和桶的个数):
CREATE TABlE bucketed_user (id
INT
,
name STRING)
ClUSTERED BY (id) INTO 4 BUCKETS
Hive 并不检查数据文件中的桶是否和表定义中的桶一致(无论是对于桶的数量或用于划分桶的列)。如果两者不匹配,在查询时可能会碰到错误或未定义的结果。要向分桶表中填充成员,
需要将 hive.enforce.bucketing 属性设置为 true 。这样, Hive 就知道用表定义中声明的数量来创建桶。
存储格式
"行格式"
(row
format) 和"文件格式" (file
format)
。行格式指行和一行中的字段如何存储。按照
Hive 的术语,行格式的定义由
SerDe
定义。
SerDe
是"序列化和反序列化工具" (Serializer-Deserializer) 合成词。
默认的行内分隔符不是制表符,而是
ASCII
控制码集合中的 Control-A,"集合"
(co
Il
ection)
元素的默认分隔符为字符
Control-B
在
Hive
中,
可以在 CREATE TABLE 语句中通过 声明 STORED AS SEQUENCEFILE 来使用顺序文件。
使用
序列文件一个主要的优点是它们支持可分割 (splittable) 的压缩。
Hive
提供了另一种二进制存储格式,称为
RCFile ,表示按列记录文件。
面向列的存储布局 (colunm-driented layout) 方式可以使一个查询跳过那些不必访问的列。
![](https://i-blog.csdnimg.cn/blog_migrate/abbcd0a1d3ea80bcf0e42a51b2eb0b35.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4d826f17978ede3573b1b369b185966e.png)
Hive 不允许 INSERT INTO...VAL USES...形式的语句。多表插入,同时可以插入多个表数据,提高效率,源表一个,目标表多个
![](https://i-blog.csdnimg.cn/blog_migrate/8dc1fd06e8a4b9c7d0335e4221547dfc.png)
HIVE 一定不能在数据中间插入字段,因为更改表只是更改元数据,并不会更改目录下的数据
![](https://i-blog.csdnimg.cn/blog_migrate/6337cc7c69f0bb1effa7c6b514027e95.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fd418bbf6826e64608b5fda5ce7cb147.png)
order by 是全排序, sort by 每个reducer进行排序,局部排序
![](https://i-blog.csdnimg.cn/blog_migrate/982071c32bf7a4dd6e8802e26476e97f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ee5272ccd8cfbae643f61064b20c1a9f.png)
视图只是可读的,无法插入数据
![](https://i-blog.csdnimg.cn/blog_migrate/4392df99b70e2ca3537b33e7f43aebfd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6be8f64ace521e9daabc98da18f6da0a.png)