一 、 Hive 基本操作

1. 数据库操作(增、删、改、查)

1.1 创建数据库

create database if not exists test_001;

使用数据库
use test_001;

说明:hive 的表存放位置模式是由 hive-site.xml 当中的一个属性指定的,默认是存放在该配置文件设置的路径下,也可在创建数据库时单独指定存储路径。

hive.metastore.warehouse.dir
/user/hive/warehouse

1.2 创建数据库并指定位置

create database test_002 location ‘/user/hive/warehouse/hfc01.db’;

1.3 设置数据库属性信息

数据库有一些描述性的属性信息,可以在创建时添加:

create database test_003 with dbproperties(‘owner’=‘Candy_W’,‘date’=‘20211101’,‘env’=‘beta’)

1.4 查看数据库更多详细信息

desc database extended test_003;

1.5 查询数据库

与mysql查询语句是一样的语法

#查看所有数据库
show databases;

1.6 删除数据库

删除一个空数据库,如果数据库下面有数据表,那么就会报错

drop database test_002;

强制删除数据库,包含数据库下面的表一起删除(请谨慎操作)

drop database test_002 cascade;(级联删除;和数据一样)

2. 数据库表操作(增、删、改、查)

2.1 表创建语句格式(不区分大小写)

[]里的属性为可选属性,不是必须的,但是如果有可选属性,会使 sql 语句的易读性更好,更标准与规范。

例如:[comment ‘字段注释信息’][comment ‘表的描述信息’]等,[external]属性除外

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name(
column_name data_type [comment ‘字段注释信息’]
column_name data_type [comment ‘字段注释信息’]

[comment ‘表的描述信息’]
[PARTITIONED BY(column_name data_type, …)]
[CLUSTERED BY (column_name, column_name, …)
[SORTED BY(col_name [ASC|DESC], …)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION ‘指定表在 hdfs 中的存储路径’]
)

2.2 建表语句参数说明

  1. CREATE TABLE
    创建一个指定名字的表,如果相同名字的表已存在,则抛出异常提示:表已存在,使用时可以使用IF NOT EXISTS语句来忽略这个异常。

如果创建的表名已存在,则不会再创建,也不会抛出异常提示:表已存在。否则则自动创建该表。

  1. EXTERNAL
    顾名思义是外部的意思,此关键字在建表语句中让使用者可以创建一个外部表,如果不加该关键字,则默认创建内部表。

外部表在创建时必须同时指定一个指向实际数据的路径(LOCATION),Hive在创建内部表时,会将数据移动到数据仓库指向的路径;

若创建外部表,仅记录数据所在的路径,不对数据的位置作任何改变。

内部表在删除后,其元数据和数据都会被一起删除。
外部表在删除后,只删除其元数据,数据不会被删除。

  1. COMMENT
    用于给表的各个字段或整张表的内容作解释说明的,便于他人理解其含义。

  2. PARTITIONED BY
    区分表是否是分区表的关键字段,依据具体字段名和类型来决定表的分区字段。

  3. CLUSTERED BY
    依据column_name对表进行分桶,在 Hive 中对于每一张表或分区,Hive 可以通过分桶的方式将数据以更细粒度进行数据范围划分。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。

  4. SORTED BY
    指定表数据的排序字段和排序规则,是正序还是倒序排列。

  5. ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’
    指定表存储中列的分隔符,这里指定的是’\t’,也可以是其他分隔符。

  6. STORED AS SEQUENCEFILE|TEXTFILE|RCFILE
    指定表的存储格式,如果文件数据是纯文本格式,可以使用STORED AS TEXTFILE,如果数据需要压缩,则可以使用STORED AS SEQUENCEFILE。

  7. LOCATION
    指定 Hive 表在 hdfs 里的存储路径,一般内部表(Managed Table)不需要自定义,使用配置文件中设置的路径即可。
    如果创建的是一张外部表,则需要单独指定一个路径。

2.3 Hive创建表的三种方式

  1. 使用create table语句创建表
    例子:

create table if not exists t_student(
id int,
s_name string,
s_age int)
partitioned by(date string)
row format delimited fields terminated by ‘\t’;
以换行进行;也可以使用‘,’
2. 使用create table … as select…语句创建表
例子:

create table sub_student as select * from t_student;
使用 create table … as select …语句来创建新表sub_student,此时sub_student 表的结构及表数据与 t_student 表一模一样,相当于直接将 t_student 的表结构和表数据复制一份到 sub_student 表。

注意:
(1). select 中选取的列名(如果是 * 则表示选取所有列名)会作为新表 sub_student 的列名。

(2). 该种创建表的方式会改变表的属性以及结构,例如不能是外部表,只能是内部表,也不支持分区、分桶。

如果as select后的表是分区表,并且使用select *,则分区字段在新表里只是作为字段存在,而不是作为分区字段存在。

在使用该种方式创建时,create 与 table 之间不能加 external 关键字,即不能通过该种方式创建外部目标表,默认只支持创建内部目标表。

(3). 该种创建表的方式所创建的目标表存储格式会变成默认的格式textfile。

3.使用like语句创建表
例子:

create table sub1_student like t_student;

注意:
(1). 只是将 t_student 的表结构复制给 sub1_student 表。

(2). 并不复制 t_student 表的数据给 sub1_student 表。

(3). 目标表可以创建为外部表,即:

create external(外部的) table sub2_student like t_student;

二、脚本化运行

大量的hive查询任务,如果用交互式shell来进行输入的话,显然效率及其低下,因此,生产中更多的是使用脚本化运行机制:

该机制的核心点是:hive可以用一次性命令的方式来执行给定的hql语句

[root@hadoop06 ~]# hive -e “use db_order; select * from student;”


然后,进一步,可以将上述命令写入shell脚本中,以便于脚本化运行hive任务,并控制、调度众多hive任务,示例如下:

[root@hd2 ~] vi t_order_etl.sh

代码如下:

#!/bin/bash
hive -e “select * from db_order.t_order”
hive -e “select * from default.t_user”
hql=“create table default.t_bash as select * from db_order.t_order”
hive -e “$hql”

shell 可以直接用:

[root@hd2 ~] sh t_order_et1.sh

三、内部表和外部表

内部表(MANAGED_TABLE):表目录按照hive的规范来部署,位于hive的仓库目录/user/hive/warehouse中

1、建表语句

create table students
(
id bigint,
name string,
age int,
school string,
class string
)
#指定分隔符(下面语句表示数据以逗号分隔开)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’
#手动指定该内部表表格创建在HDFS下的/user/hive/warehouse目录内,也可以不指定,默认存放/user/hive/warehouse下


2、存储位置

内部表数据存储的位置是hive在hdfs中存在默认的存储路径,即default数据库(默认:/user/hive/warehouse)

3、管理主体

内部表的数据是Hive自身管理,创建内部表时,会将数据移动到数据仓库指向的路径

4、内部表转换为外部表

alter table table_name set tblproperties(‘EXTERNAL’=‘TRUE’);
可以通过 desc formatted 表名 来查看表的属性

5、数据删除问题

删除内部表会直接删除元数据(metadata)及存储数据,对内部表的修改会将修改直接同步给元数据

例子:

内部表:
create table stu1(id int,name string,age int,address string)
row format delimited fields terminated by ‘,’;
缺点:在删除表的时候,数据会跟着表一起被删除掉,容易造成数据的丢失

外部表(EXTERNAL_TABLE):表目录由建表用户自己指定

1、建表语句

关键词external 表示创建的hive表为外部表

create external table students
(
id bigint,
name string,
age int,
school string,
class string
)
#指定分隔符(下面语句表示数据以逗号分隔开)
ROW FORMAT DELIMITED FIELDS TE
RMINATED BY ‘,’
#手动指定该内部表表格创建在HDFS下的/user/hive/warehouse_external 目录内
LOCATION '/user/hive/warehouse_external ';

例子
create external table stu2(id int,name string,age int,address string)
row format delimited fields terminated by ‘,’
location ‘/external/stus2’;

2、存储位置

外部表数据存储的位置可以自己指定,指定除/user/hive/warehouse以外的路径。

3、管理主体

外部表数据由HDFS管理,创建外部表时,仅记录数据所在的路径,不对数据的位置做任何改变。

4、外部表转换为内部表

alter table table_name set tblproperties(‘EXTERNAL’=‘FALSE’);
可以通过 desc formatted 表名 来查看表的属性

修改即可;

5、数据删除问题

删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name)

1.加载数据到表中:
load data local inpath ‘/root/students1.txt’ into table stu2;

然后我们把这个stu3删除了;你会发现,我们一会创建一个表stu3如果字段一样;数据还在;他们共享了数据;

只要他们的外部目录不一样就不共享;

例子:

外部表:external 不会自动在内部表中创建
create external table stu2(id int,name string,age int,address string)
row format delimited fields terminated by ‘,’
location ‘/external/stus2’;

create external table stu3(id int,name string,age int,address string)
row format delimited fields terminated by ‘,’
location ‘/external/stus3’;
优点:在删除表的时候,数据不会跟着表一起被删除掉,安全性高

四、hive内部表与外部表的不同使用场景

1、场景一

因为hive内部表在删除表是同时删除表数据与元数据,而外部表删除的时候,仅仅会删除元数据,HDFS上的文件并不会被删除,所以外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。

2、场景二

如果所有的数据都由hive处理,则创建内部表;如果数据的处理由hive和其他工具一起处理,则创建外部表。

3、场景三

我们在管理表不方便和其他工作共享数据。可以创建一个外部表指向这份数据,而并不需要对其具有所有权。

我们在使用hive内部表与外部表的时候,需要根据合适的业务场景去选择!

五、分区表(以时间单位作为统计)

Hive分区表对应的是HDFS上独立的文件夹,该文件夹存放的是该分区的所有数据,其实分区就是分目录。
Hive通过分区把一个大的数据集根据业务需要分割成小的数据集,在查询时能够通过where关键词选择指定分区,从而提高查找效率。为什么这样能够提高查找效率呢?其实是因为Hive存放的数据是没有索引的,如果没有建立分区直接查询,Hive就会暴力查询,效率很低,所以通过分区能很好提高Hive的查询效率。分区还能够更加方便的管理一些特殊数据,例如一些日志数据,可以是一个天一个分区或者一个月一个分区,视数据量而定,这样就能很好地管理日志数据了。

分区表的实质是:在表目录中为数据文件创建分区子目录,以便于在查询时,MR程序可以针对分区子目录中的数据进行处理,缩减读取数据的范围。

比如,网站每天产生的浏览记录,浏览记录应该建一个表来存放,但是,有时候,我们可能只需要对某一天的浏览记录进行分析
这时,就可以将这个表建为分区表,每天的数据导入其中的一个分区;
当然,每日的分区目录,应该有一个目录名(分区字段)

1.创建带有分区的表

create table t_partition(id int,name string,age int,address string)
partitioned by (dt string) //可以放入的是日期;但是习惯上使用string也可以
row format delimited fields terminated by ‘,’;
注意:分区字段不能是表定义中的已存在字段; 独立加入即可;

2.导入数据

使用上面的导入数据方式加入导入到分区中即可:

这样我们查询的时候可以单独的使用dt 来查询;

select *from t_partition where dt=‘2022-6-10’; 查询的是6-10号的数据


这里可以使用时间戳来进行;

使用函数进行统计指定条件的: 加入了条件就是 10条;

不指定条件的查询操作:就是所有数据;

3.数据的导入和导出
1.数据导入到hive

方式1:导入数据的一种方式:
手动用hdfs命令,将文件放入表目录;

方式2:在hive的交互式shell中用hive命令来导入本地数据到表目录
hive>load data local inpath ‘/root/order.data.2’ into table t_order;

方式3:用hive命令导入hdfs中的数据文件到表目录
hive>load data inpath ‘/access.log.2017-08-06.log’ into table t_access;
注意:导本地文件和导HDFS文件的区别:
本地文件导入表:复制
hdfs文件导入表:移动

2.输入导出

1.将hive表中的数据导出到指定路径的文件(把hive分析之后的结果,给写出去)

将hive表中的数据导入HDFS的文件
insert overwrite directory ‘/root/access-data’
row format delimited fields terminated by ‘\t’
select name,age from t_partition;

或者我们想把部分数据存储到hdfs中的文件中;

测试证明,使用了overwrite参数会将你指定的这个目录下的所有内容全部覆盖掉!!!而不是只有当与你要导出的数据文件已经存在时才会覆盖。
但是尝试把overwrite参数去掉再去导出数据时,发现报错了:

FAILED: ParseException line 1:7 cannot recognize input near ‘insert’ ‘local’ ‘directory’ in insert clause
后来还是加上overwrite之后才可以执行成功,所以初步认为overwrite在导出数据时是必须要加上的参数。因此我们在导出hive的数据时,尽量找一个空目录。要注意,数据导出时列与列之间默认是不分隔的。

要解决这个问题:
首先的把这个所有的零散的文件进行合并;例如;先在有好多个文件内容;我们先把他合并在一起; 一个文件中;那就把这个文件进行导入即可;

例子:我们创建多个文件 a.txt; b.txt;c.txt; 然后合并文件内容;

把这文件进行合并在一个新文件中;一定不要使用工具打开;他打开是空白;
cat data/* >> xindata.txt 把data这个目录中的文件全部合并到xindata.txt 这个文件中;

然后把这个新数据传递给hive中;
这个操作以后,可以把一个月的数据都写到一个文件中;然后进行统计;

如果不要了;就直接删除即可;

27.大数据---Hive的数据库和表的基本操作;脚本化运行;内部表;外部表;分区表相关推荐

  1. 2021年大数据Hive(三):手把手教你如何吃透Hive数据库和表操作(学会秒变数仓大佬)

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 Hive数据库和表操作 一.数据库操作 1.创建数据库 2.创建 ...

  2. 图解大数据 | Hive搭建与应用@实操案例

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/84 本文地址:http://www.showmeai.tech/article-det ...

  3. 2021年大数据Hive(十二):Hive综合案例!!!

    全网最详细的大数据Hive文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Hive综合案例 一.需求描述 二.项目表的字段 三.进 ...

  4. 2021年大数据Hive(十一):Hive调优

    全网最详细的大数据Hive文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Hive调优 一.本地模式 1.空key处理 二.SQL ...

  5. 2021年大数据Hive(九):Hive的数据压缩

    全网最详细的大数据Hive文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Hive的数据压缩 一.MR支持的压缩编码 二.压缩配置 ...

  6. 2021年大数据Hive(八):Hive自定义函数

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 Hive自定义函数 一.概述 1.UDF(User-Define ...

  7. 2021年大数据Hive(七):Hive的开窗函数

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 Hive的开窗函数 一.窗口函数 ROW_NUMBER,RANK ...

  8. 2021年大数据Hive(五):Hive的内置函数(数学、字符串、日期、条件、转换、行转列)

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 Hive的内置函数 一.数学函数 1. 取整函数: round ...

  9. 2021年大数据Hive(四):Hive查询语法

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 hive查询语法 一.SELECT语句 1.语句结构 2.全表查 ...

最新文章

  1. EMC设计中电缆屏蔽使用方法
  2. 微信JS-SDK之图像接口开发详解
  3. HTML与CSS基础知识补遗(一)
  4. 半潜式深海平台动力定位控制技术研究
  5. 512M内存编译php出错
  6. Python 第三方模块之 numpy.linalg - 线性代数
  7. element 输入框怎么加单位_抖音上的人声配音怎么制作?
  8. 嵌入式Linux系统编程学习之十三信号概念
  9. 映射内网ftp服务器到公网报错问题解决
  10. 多线程java_40个Java多线程问题总结
  11. java 同步原语_你所不知道的有关Java 和Scala中的同步问题
  12. 取消锚(a/)点击后页面跳转的几种方法
  13. android系统的刷机步骤,安卓系统刷机教程的操作
  14. c语言制作单片机人机界面,基于51单片机自制触摸屏
  15. 通州区机器人比赛活动总结_机器人大赛总结报告
  16. 【电子学会】2019年09月图形化一级 -- 猫捉老鼠
  17. 电视电信显示服务器连接错误,中国电信宽带怎样连接老电视连接好后电视怎么显示没...
  18. BBS项目分布搭建四(点赞点踩及评论功能)
  19. 【自嗨笔记#2】微博疫情舆情分析---舆情分析部分
  20. IP地址和子网掩码详解

热门文章

  1. Spring Cloud Gateway配置详解-过滤器
  2. WPF特效-鱼游动动画3
  3. 【OpenGL ES】光影(光照与阴影)效果
  4. 软件工程管理之《系统开发方法与项目生命周期的矛盾冲突》
  5. 基于MFC的凸多面体的消隐实现
  6. 【cocos2d-x 手游研发小技巧(2)循环无限滚动的登陆背景】
  7. 020.1.1 collections集合工具类
  8. Linux-CentOS7离线安装RabbitMq
  9. 服务器配置:阿里云服务器(Windows)的配置以及安装Tomcat连接服务器的教程
  10. 图形学笔记(三)—— Harris角点检测器