设为首页 加入收藏

TOP

hadoop12
2018-11-13 14:55:56 】 浏览:78
Tags:hadoop12
版权声明:本文为博主原创文章,转载请标明出处。https://blog.csdn.net/kXYOnA63Ag9zqtXx0/article/details/82954503 https://blog.csdn.net/forever428/article/details/83865434

hive

hive的基本概念

Hive 作为一个数据仓库的工具,特点,操作简单 上手容易,由于其底层封装的是MR ,实际上hive不保存数据,数据都是保存在HDFS只上,所以说hive是基于hadoop之上的

hive的基本操作

数据库的操作

  • 创建数据库 create database 数据库名称
  • 查看数据库 show databases
  • 删除数据库 drop database 数据库的名称, 只能删除空的数据库 如果要删除非空的数据库则需要加上关键字 cascade

数据表的操作

  • 创建表: create table 表名称 (属性 数据类型)
  • 可以指定存储数据的分隔符
 create table student(id int,name string) 
 row format delimited fields terminated by '\t';

管理表与外部表的区别

管理表因为对表存在管理权,所以在删除该表的时候,元数据以及表中的存储在hdfs上的数据同时都会被删除,而外部表由于对表没有管理权,所以在删除的时候只会删除元数据,真正的数据不会被删除

hive常用交互命令

usage: hive
 -d,--define <key=value>          Variable subsitution to apply to hive
                                  commands. e.g. -d A=B or --define A=B
    --database <databasename>     Specify the database to use
 -e <quoted-query-string>         SQL from command line
 -f <filename>                    SQL from files
 -H,--help                        Print help information
    --hiveconf <property=value>   Use value for given property
    --hivevar <key=value>         Variable subsitution to apply to hive
                                  commands. e.g. --hivevar A=B
 -i <filename>                    Initialization SQL file
 -S,--silent                      Silent mode in interactive shell
 -v,--verbose                     Verbose mode (echo executed SQL to the
                                  console)

  1. -e 不进入到hive的交互窗口执行SQL语句
bin/hive -e "select name from student";

通过以上的方式,可以在不进入到hive中就可以执行sql语句进行查询
2. -f 执行的sql语句来自文件,其实可以理解为执行一个脚本命令
(1)首先在/data/目录下创建hivesql.sql文件,在该文件下编写sql语句

vi test.sql
-----------------
Select * from student;

(2)在hive 的命令行中使用 -f参数执行该创建好的脚本文件,具体操作如下

bin/hive -f /data/hiveql.sql

(3)在-f 之后给定脚本的绝对路径,之后就可以执行咱们的脚本命令 输出的结果如下

1       zhangsan
2       lisi
3       banzhang
4       xuewei
  1. 在hive中也可以直接运行hdfs的命令,在进入hive的命令行模式下,可以直接操作hdfs文件系统,并且由于hive会一直连接hdfs 所以操作的时候会比平时不在hive中操作更快速一些操作的命令如下
hive> dfs -mkdir /test;

hive常见属性配置

数据仓库的位置配置 defualt数据库默认的位置在hdfs上的/user/hive/warehouse的路径下,没有对默认数据库创建目录
修改默认数据库的原始位置: 肯定在配置文件中进行修改。
打开hive中conf目录下发现直存在hive-default.xml.template,该配置文件为hive中默认的属性配置文件,在conf目录下需要配置自定义的配置文件hive-site.xml配置文件,可以参考默认的配置文件进行创建

创建自定义配置文件的步骤

  1. 复制出来一份默认的配置文件
cp hive-default.xml.template hive-site.xml
  1. 修改自定义的配置文件里面的内容,把该属性清空,只保留头信息,可以通过4000 dd删除里面的内容通过vi的方式
    3 通过参考默认配置文件查找需要配置的属性内容 例如修改默认的数据库位置则配置信息如下
<property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
    <description>location of default database for the warehouse</description>
  </property>

修改之后,还需要为其增加用户组的权限

chmod g+w  /user/hive/warehouse

配置查询信息的显示(头信息)

  1. 在hive-site.xml 配置文件中增加如下信息,可以配置数据显示的名称.
<property>
    <name>hive.cli.print.current.db</name>
    <value>true</value>
    <description>Whether to include the current database in the Hive prompt.</description>
  </property>

改成true之后观察hive中显示的变化
通过观察发现在配置了该属性之后,数据的当前名称可以显示出来
hive (default)> use test;

  1. 配置列的头信息显示
    在hive-site.xml配置文件中增加如下配置,可以显示头信息
<property>
    <name>hive.cli.print.header</name>
    <value>true</value>
    <description>Whether to print the names of the columns in query output.</description>
  </property>

输出的内容显示如下

student.id      student.name
1       zhangsan
2       lisi
3       banzhang
4       xuewei

配置hive的日志信息

Hive运行日志,默认保存在/tmp/hadoop(用户名)/hive.log 由于保存在/tmp目录下,该目录是一个临时目录,所以日志需要经常查看,所以需要修改默认的路径
修改步骤:

  1. 在hive的目录下创建一个目录命名为log mkdir log
/opt/app/apache-hive-1.2.1-bin/log
  1. 接下来要把默认的日志路径修改为自己创建的路径
    (1)进入到hive 的conf目录下,该目录下存在一个配置文件为hive-log4j.properties.template,需要修改该文件,去掉template。应为加上template hive不识别所以需要去掉template后缀
    (2)重命名
mv hive-log4j.properties.template  hive-log4j.properties

打开该文件 修改如下属性

hive.log.dir=${java.io.tmpdir}/${user.name}

修改为自定义的目录路径

hive.log.dir=/opt/app/apache-hive-1.2.1-bin/log

该属性指定了hive的日志保存路径
配置完该属性之后,重新进入一下hive ,在hive中进行一些命令操作,观察新配置的目录是否存在hive.log 日志

参数的配置方式

  1. 配置文件的方式
    默认的配置文件:hive-default.xml 该文件下存在所有默认属性配置信息
    用户自定义的配置文件:hive-site.xml 优先级高于默认的配置文件
  2. 命令行的参数配置
    在启动hive的时候可以通过命令行的方式进行配置 --hiveconf parm=value 来进行设定
    例如:bin/hive --hiveconf hive.cli.print.header=false;
    以上的配置,仅对本次启动的hive有效
  3. 查看参数设置:
    set hive.cli.print.current.db; 可以根据set命令查看已经设置的属性具体的参数内容
    得到的结果为:hive.cli.print.current.db=true
  4. 通过参数进行属性的设置
    范例:set hive.cli.print.current.db=false;
    在参数中设置了属性的内容,接下来可以通过set 方式查看属性的内容结果为false
    以上的方式也是临时对本次hive的启动有效,退出之后在进入hive 就失效了

注意:以上三种方式的优先级 参数方式>命令行方式>自定义配置文件。对于参数方式以及命令方式设置参数内容都是临时的,自定义配置文件设置的参数,在hive启动的时候进行读取

hive数据类型

  1. 基本数据类型 ,与mysql中的数据类型非常类似。由于hive是java编写的所以说和mysql 有不一样的地方
hive的数据类型 Java 数据类型
TINYINT byte
SMALINT short
INT int
BIGINT long
BOOLEAN boolean
FLOAT float
DOUBLE double
String String
TIMESTAMP 时间类型
BINARY 字节数组

对于以上的数据类型,存在数据类型转换的关系

  1. 类型的转换
    Hive的数据类型类似于java中的数据类型转换,例如咱们使用的是INT数据类型,那INTYINT 会自动转换为INT类型,但是hive不会像java一样进行反向转换

  2. CAST 转换操作:
    Cast 可以进行显示的数据类型的转换,例如 有一个 “1” 现在需要把字符串类型的1 转换为int类型的 1 可以通过cast进行操作
    例如: cast(“1” as INT) 就可以把字符串1 转换为整数1

DDL数据定义

1. 创建数据库,创建的数据库存储在 HDFS 上的默认路径是/user/hive/warehouse/*.db

例如: create database mytest;
在创建数据库的时候,为了避免创建出错,可以使用IF NOT EXISTS 先判断要创建的数据库是否存在
例如:create database if not exists test2;

2. 删除数据库 以下官网提供的语法

DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
CASCADE:删除一个非空的数据库

3. 表的DDL 定义 (create ,drop ,truncate)

在创建表的时候,可以分为管理表,和外部表,管理表对数据存在管理权,删除的时候会删除到元数据,以及保存在HDFS上的数据,而外部表由于没有管理权不会删除掉HDFS上保存的数据,但是会删除该表的元数据
EXTERNAL 创建外部表,在建表的同时指定一个路径通过location关键字指定该表要去加载的路径在HDFS上的位置

create EXTERNAL table student4(id int,name string) 
 row format delimited fields terminated by '\t'
 stored as textfile 
 location '/user/hive/warehouse/student';

对于管理表来说,默认创建的表就为管理表

分区表:

使用关键字PARTITIONED BY 定义的分区表,分区表实际上就是在HDFS上创建一个个的独立的文件夹,该文件夹下保存的就是为分区之后的数据文件 ,一般来说进行条件查询的都是使用where语句 ,那就可以通过where语句查询分区之后的数据

  • 分区表的创建语法:
create table dept_partion(deptno int,dname string) PARTITIONED BY (month string)
 row format delimited fields terminated by '\t';
  • 接下来加载数据到分区表中,需要把dept 数据文件上传到linux 文件系统 /data/ 目录下
load data local inpath '/data/dept.txt' into table dept_partion partition(month='201811');
查询分区表中的数据:
  • 单分区查询:只查询一个分区
select * from dept_partion where month='201811';
  • 多分区查询
 union
 select * from dept_partion where month='201812';
  • 增加分区:
alter table dept_partion add partition(month='201810');
  • 删除分区:
alter table dept_partion drop partition(month='201810');
  • 查看分区:
show partitions dept_partion;
  • 查看表结构 desc 进行查看,但是不是详细的信息,如果要查看表中详细的信息则可以使用
desc formatted dept_partion;
  • 创建两个分区:
create table dept_partion2(deptno int,dname string) PARTITIONED BY (month string,day string)
 row format delimited fields terminated by '\t';
  • 加载数据到两个分区字段的分区表中:
load data local inpath '/data/dept.txt' into table dept_partion2 partition(month='201810',day='18');
分表表加载数据的方式二: 先上传数据到HDFS上之后在和分区表进行关联
  1. 创建要上传数据的目录
dfs -mkdir -p /user/hive/warehouse/dept_partion2/month=201809/day=1;
  1. 上传数据到该目录下
dfs -put /data/dept.txt /user/hive/warehouse/dept_partion2/month=201809/day=1;

查询该表表 发现没有查询到该表下的数据
3. 执行关联元数据的命令

msck repair table dept_partion2;
  1. 查询分区表中的数据
select * from  dept_partion2 where month=201809 and day=1;
上传数据之后增加分区:
  1. 先创建分区目录
dfs -mkdir -p /user/hive/warehouse/dept_partion2/month=201809/day=2;
  1. 上传数据到分区目录
dfs -put /data/dept.txt /user/hive/warehouse/dept_partion2/month=201809/day=2;
  1. 增加分区
alter table dept_partion2 add partition(month='201809',day='2');
  1. 查询数据
select * from  dept_partion2 where month=201809 and day=2;

修改表:

  1. 修改表名称
alter table dept_partion rename to dept_partion3;
  1. 修改列
alter table dept_partion3 change column  dname dnames string ;
  1. 增加列
alter table dept_partion3 add columns (depts string);
  1. 替换列
alter table dept_partion3 replace columns(deptno int ,dname string);
  1. 删除表 drop table 表名称 表的结构也会被删除掉
  2. 清空表中的数据
Truncate 只清空表中的数据,表的结构不删除
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Hive与传统数据库对比 下一篇MapReduce模拟实现好友推荐系统

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目