hive数据库使用记录

原文链接: www.baidu.com

    很长时间没有写博客,因为确实是没有什么可写的,中间一段时间在学习springBoot,因为自己还没有学习完毕,所以,暂时先不记录springBoopt之类的文章了。

    近期几个月更多的是在为了工作而研究保险类的业务知识,比如核心承保啊、理赔的乱七八糟的玩意,没有学习什么有意思的java技术,不过在搞大数据统计分析的时候,用到了hive数据库,思前想后,还是简单的学习并记录一下,有的我就直接拿网上找的例子了。

百度百科说:hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。

    hive的语言是类sql语言,叫hql,和sql大致相同,但也有不同之处,比如不支持tab字符、子查询必须加as等等。

语法:

创建数据库的语法:

create database if not exists db_hive;

我们可以通过LOCATION关键字来指定hive数据库文件存放的位置,默认的位置是在hdfs上的目录/user/hive/warehouse下面,会以数据库的名称来在hdfs上新建目录。指定路径创建数据库的语句如下:

create database if not exists db_hive_02 location '/user/text/db_hive_02.db';

可以看到在hdfs的/user/text目录下会新建一个db_hive_02.db的目录,后续在数据库db_hive_02里面创建的表默认都会存储在该目录下。

数据库常用操作指令

下面这几个基本上就是我每天在用的命令了:

show databases; --查看数据库

show databases like ‘db_hive*’; --查看以db_hive开头的数据库

use db_hive_02; --使用数据库,切换到当前数据库下

desc database db_hive_02; --查看数据库的描述信息,看字段及注释

如果要查看数据库更详细的信息,则需要增加extended关键字:

desc database extended db_hive_02;

下面的删除就要谨慎操作了

drop database db_hive_02; --删除数据库db_hive_02

如果数据库中有表存在的话,在删除数据库的时候需要增加关键字CASCADE,表示在删除数据库的时候可以将数据库下面的所有表也进行删除。数据库删除后相应的hdfs上的目录也会被删除。

drop database db_hive_02 cascade;

另外,在删除数据库的时候为了不抛出异常,需要增加if exists关键字,这样如果数据库被别人删除的时候就不会抛出异常了:

drop database if exists db_hive_02;

安装hive数据库的话,可以直接到Apache官网下载,然后配置环境变量和设置运行路径。

hive优化(百度百科好实惠呀)

  •     join连接时的优化:当三个或多个以上的表进行join操作时,如果每个on使用相同的字段连接时只会产生一个mapreduce。
  •     join连接时的优化:当多个表进行查询时,从左到右表的大小顺序应该是从小到大。原因:hive在对每行记录操作时会把其他表先缓存起来,直到扫描最后的表进行计算
  •     在where字句中增加分区过滤器。
  •     当可以使用left semi join 语法时不要使用inner join,前者效率更高。原因:对于左表中指定的一条记录,一旦在右表中找到立即停止扫描。
  •     如果所有表中有一张表足够小,则可置于内存中,这样在和其他表进行连接的时候就能完成匹配,省略掉reduce过程。设置属性即可实现,set hive.auto.covert.join=true; 用户可以配置希望被优化的小表的大小 set hive.mapjoin.smalltable.size=2500000; 如果需要使用这两个配置可置入$HOME/.hiverc文件中。
  •     同一种数据的多种处理:从一个数据源产生的多个数据聚合,无需每次聚合都需要重新扫描一次。 例如:insert overwrite table student select * from employee; insert overwrite table person select * from employee;可以优化成:from employee insert overwrite table student select * insert overwrite table person select *
  •     limit调优:limit语句通常是执行整个语句后返回部分结果。set hive.limit.optimize.enable=true;
  •     开启并发执行。某个job任务中可能包含众多的阶段,其中某些阶段没有依赖关系可以并发执行,开启并发执行后job任务可以更快的完成。设置属性:set hive.exec.parallel=true;
  •     hive提供的严格模式,禁止3种情况下的查询模式:

    a:当表为分区表时,where字句后没有分区字段和限制时,不允许执行。

    b:当使用order by语句时,必须使用limit字段,因为order by 只会产生一个reduce任务。

    c:限制笛卡尔积的查询。

  • 合理的设置map和reduce数量。

  • jvm重用。可在hadoop的mapred-site.xml中设置jvm被重用的次数。

 

 

 待持续整理。。。

 

 

 

 

 

 

你可能感兴趣的:(hive,数据库)