大数据hadoop生态体系之Hive的基本操作(15)

Hive数据仓库基于shell命令行基本操作(DDL/DML):

首先启动hive数据库仓库的shell脚本模式:

命令:/opt/mysoft/hive/bin/hive

1> 查看当前Hive中有哪些数据库

     hive初始化后,会生成一个默认的default数据库;往往根据项目不同,会建立不同业务的hive数据库;

     命令:show databases;

2> 创建数据库

     命令:create database test;     

3> 打开/使用数据库

     命令:use test;

4> 查看数据库中的所有表

     命令:show tables;

5> 基于打开的数据库建表

     命令:create table stu (id int,name string)  row format delimited fields terminated by ',';

     查看创建成功后的表结构:

     命令:desc stu;

6> 加载数据到表中

     本地文件方式:

     命令:load data local inpath '/opt/mysoft/stu.txt' into table stu;  

     HDFS远程服务器方式:

     命令:load data inpath 'hdfs://hadoop:9000/output/*' into table stu;

语法命令:

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name

   [(col_name data_type[COMMENT col_comment], ...)]

   [COMMENT table_comment]

   [PARTITIONED BY (col_namedata_type [COMMENT col_comment], ...)]

   [CLUSTERED BY (col_name,col_name, ...)

   [SORTED BY (col_name[ASC|DESC], ...)] INTO num_buckets BUCKETS]

   [ROW FORMAT row_format]

   [STORED AS file_format]

   [LOCATION hdfs_path]

1、 CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。

2、 EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION)。

Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。

3、 LIKE 允许用户复制现有的表结构,但是不复制数据。

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name LIKE existing_table;

4、 ROW FORMAT DELIMITED

[FIELDS TERMINATED BY char]

        [COLLECTION ITEMS TERMINATED BY char]

        [MAP KEYS TERMINATED BY char]

  [LINES TERMINATED BY char] | SERDE serde_name

  [WITH SERDEPROPERTIES

(property_name=property_value, property_name=property_value,...)]

hive建表的时候默认的分割符是'\001',若在建表的时候没有指明分隔符,load文件的时候文件的分隔符需要是'\001';若文件分隔符不是'001',程序不会报错,但表查询的结果会全部为'null';

用vi编辑器Ctrl+v然后Ctrl+a即可输入'\001' ----------->  ^A

SerDe是Serialize/Deserilize的简称,目的是用于序列化和反序列化。

Hive读取文件机制:首先调用InputFormat(默认TextInputFormat),返回一条一条记录(默认是一行对应一条记录)。然后调用SerDe(默认LazySimpleSerDe)的Deserializer,将一条记录切分为各个字段(默认'\001')。

Hive写文件机制:将Row写入文件时,主要调用OutputFormat、SerDe的Seriliazer,顺序与读取相反。

可通过desc formatted 表名;进行相关信息查看。

当我们的数据格式比较特殊的时候,可以自定义SerDe。

5、 PARTITIONED BY

在hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition分区概念。

分区表指的是在创建表时指定的partition的分区空间。一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。表和列名不区分大小写。分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示。

6、 STORED AS SEQUENCEFILE|TEXTFILE|RCFILE

如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。

TEXTFILE是默认的文件格式,使用DELIMITED子句来读取分隔的文件。

6、CLUSTERED BY INTO num_buckets BUCKETS

对于每一个表(table)或者分,Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。

把表(或者分区)组织成桶(Bucket)有两个理由:

(1)获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。

(2)使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

hive cli中显示列名: 进入hive cli后 set hive.cli.print.header=true;

案例:

1> 创建普通表,字段以逗号进行分割,默认分隔符是'\001', vi 编辑器的:ctrl + v 和 ctrl+a

create table tb_stu(id int, name string) row format delimited fields terminated by ','; 

2> 创建分区表,有时候数据量太大,我们只需要查询一部分,可以使用字段分区,分区字段不能和已有的字段重复

create table tb_stu2(id int,name string) partitioned by (age int) row format delimited fields terminated by ',';

加载数据:load data local inpath '/opt/mysoft/hivedata/student.txt' INTO TABLE tb_stu2 PARTITION(age=20);

加载数据时如果添加local加载的是本地数据,如果没有local加载的是hdfs服务器上的数据。

3> 创建双分区表 使用partition(year string,hour int)

create table tb_stu3(id int,name string) partitioned by (dt string,hour string) row format delimited fields terminated by ',';

加载数据:load data local inpath '/opt/mysoft/hivedata/student.txt' into table tb_stu3 partition(dt = '20200404',hour='23');

4> 分桶表 (cluster by into num bucked )

    指定开启分桶:set hive.enforce.bucketing = true;

                              set mapreduce.job.reduces = 4;

    创建分桶表:

    create table tb_stu4(id int,name string) clustered by (id) sorted by(id desc) into 4 buckets row format delimited fields terminated by ',';

    导入数据(需要前创建一个同样字段的临时表,然后导入数据,再从临时表中查询数据导入到分桶表):

    insert overwrite table tb_stu4 select * from tb_stu cluster by (id)

    分桶表需要使用mr程序进行计算之后再装载导入到分桶表中,根据分桶字段的hash值计算分桶

5> 内部表和外部表(EXTERNAL), 主要区别在于看有没有加 external关键字,内部表在hive的默认路径下,外部表可以指定目录,特别是有比较大的数据的时候,不用上传到hive,直接在hdfs上的文件目录建立关联。

创建表: create external table tb_stu5(id int,name string) row format delimited fields terminated by ',' location '/input';

外部表当元数据表删除的时候,外部表对象应的数据文件不会被删除,内部表则元数据和表文件一块被删除。

6> like 语句: 复制一个表的表结构,但不会复制数据。

    create table stu_like like tb_stu;

7> 修改分区表:

alter table tb_stu2 partition(age = 20) rename to partition(age=50);

8> hive表的join查询:

select * from tb_stu t1 join tb_stu2 t2 on t1.id = t2.id where t1.id = 5;

9> 导出数据:

    导出到本地目录:

    insert overwrite local directory '/opt/data' select * from tb_stu;

    导出到hdfs目录:

    insert overwrite directory '/input' select * from tb_stu;

10> hive 中创建dual表

     create table dual(id string);

    在opt/mysoft/hivedata目录中创建 dual.txt 文件,文件中只保存一个空格。

    加载数据到dual表: load data local inpath '/opt/mysoft/hivedata/dual.txt' into table dual;

    测试:select substr('hello world',2,3) from dual;

11> 自定义UDF开发函数:

      hive 可以使用自定义UDF函数。

    定义步骤:使用maven创建一个java工程

    1. 导入需要的依赖jar包

        hive-exec-1.2.1.jar和hadoop-common-2.7.4.jar依赖

    2.创建一个类,继承org.apache.hadoop.hive.ql.exec.UDF类,重载evaluate()方法,实现自己的定义方法的业务逻辑

    3.打成jar包上传到服务器

    4.将jar包添加到hive的classpath

        hive>addJAR /home/hadoop/udf.jar;

    5. 创建临时函数与开发好的java class关联

        create temporary function tolowercase as 'com.hive.test.udffunc';

     6.使用自定义函数:select tolowercase('ABCDEF'); 输出结果:abcdef

        

你可能感兴趣的:(大数据hadoop生态体系之Hive的基本操作(15))