hive是构建在hadoop上的数据仓库框架
hive中存的是表,是和hdfs的映射关系,hive是逻辑上的数据仓库。
hive与mysql
metastore是hive元数据的集中存放地
metastore默认使用内嵌的derby数据库作为存储引擎
Derby引擎的缺点:一次只能打开一个会话
使用Mysql作为外置存储引擎,多用户同时访问
hive的元数据
- 除了真实存储的数据外都是元数据。
- 元数据包块表的名字,表的列和分区及其属性,表的数据所在目录。
hive与传统数据库
- 传统数据库是数据写入数据库时检查数据(写时模式),查询效率高
hive在查询时对数据检查(读时模式),数据加载迅速。 - hive的插入、更新、删除操作引起的变化,保存在较小的增量文件中,有metastore在后台运行的mr定期将其合并到基表中。
hive中的表
- 托管表和外部表
托管表(内部表)。(默认):存储时:存在hdfs目录。删除表时,数据也删除。
外部表:存储时:不存在hdfs目录。删除表时,只删除表结构,数据不删。 - 分区表和桶表
- 分区表是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹。
- 分桶是相对分区进行更细粒度的划分。分桶将整个数据内容安装某列属性值得hash值进行区分。
分桶数和reduce任务数一致
hive动态分区
动态分区模式:
strict-严格模式,插入时至少指定一个静态分区,
nonstrict-非严格模式,可以不指定静态分区。
hive事务处理
在>0.13.0之后支持行级事务。
1.所有事务自动提交。
2.只支持orc格式。
3.使用bucket表。
4.配置hive参数,使其支持事务。
hive调优
- 使用explain查看查询计划
- 设置limit优化,避免全部查询
- 本地模式(如果大于参数中设置的值,仍然用集群模式)
- 并行执行
- 严格模式
- 设置MR的数量
- JVM重用,适用大量小文件
- 设置开启mapjoin
UDF(用户自定义函数)
- udf
条件:继承udf类
重写evaluate()方法 - udaf(类似聚合函数)