博客 Hive基础知识大全

Hive基础知识大全

   数栈君   发表于 2024-11-14 15:24  412  0

1、Hive基本概念

1.1、Hive简介
Hive本质是将SQL转化为MapReduce的任务进行计算,底层由HDFS来提供数据存储。说白了hive可以理解为一个将SQL转换为MapReduce的任务的工具,甚至更进一步说hive就是MapReduce的一个客户端。

1.2、什么是Hive(面试题)
Hive是数据库建模工具之一
可以向Hive传入一条交互式SQL,在海量数据中查询分析得到结果的平台

1.3、为什么要使用Hive
如果使用Hadoop的话,人员学习成本高,MapReduce的实现复杂查询逻辑的开发难度较大。
如果使用Hive的话,可以直接操作接口采用类SQL语法,免去了写MapReduce,大大提高了开发效率,并且功能扩展很方便(比如:开窗函数)

1.4、Hive的特点
可扩展性:Hive可以自由的扩展集群的规模、一般情况下不需要重启服务
延伸性:Hive支持自定函数,用户可以根据自己的需求来实现自己的函数
容错:即使节点出现错误,SQL仍然可以完成执行

1.5、Hive的优缺点

优点
·  操作接口采用类SQL语法,提供快速开发的能力(简单,易上手)
·  避免了去写MapReduce,减少了开发人员的学习成本
·  由于Hive的延迟性比较高,因此Hive常用于数据分析,适用于对实时性要求不高的场合
·  由于Hive的执行延迟性比较高(不断的开关JVM虚拟机),Hive的优势在于处理大数据,对于小数据没有优势
·  Hive支持自定义函数,用户可以根据自己的需求来实现满足自己需求的函数
·  集群可以自由扩展并且有良好的容错性,节点出现问题SQL仍然可以完成执行

缺点
·  Hive的HiveSql表达能力有限

  迭代是算法无法表达(反复调用,mr之间独立,只有一个map一个reduce,反复开关。名词解释:

  反复调用:迭代式算法需要多次调用同一组计算,每次调用的结果会影响下一次调用的输入。

  MR之间独立:传统的MapReduce任务是独立的,每个任务之间没有状态共享。这意味着每次MapReduce任务运行时,不知道之前任务的结果。

  只有一个map和一个reduce:在描述迭代式算法时,这句话可能意味着每次迭代只有一个Map阶段和一个Reduce阶段,但每次都需要重新启动MapReduce作业。

  反复开关:每次迭代需要启动和关闭MapReduce作业,这带来了大量的开销,因为每次启动和关闭作业都需要花费时间和资源。)

·  Hive的效率比较低

  Hive自动生成的MapReduce作业,通常情况下不够智能化

  Hive调优比较困难难,粒度较粗(HiveSql根据模本转成MapReduce,不能像自己编写的MapReduce一样精细,无法控制在map处理数据还是reduce处理数据)

迭代算法:迭代式算法是指那些需要反复执行同一组计算步骤的算法,每次迭代的结果依赖于前一次迭代的结果。


1.6、hive和mysql的区别


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/bc8c511e910b8152e8aa7a8e4dc5d950..png


1.7、hive的应用场景

·  日志分析:大部分互联网公司使用hive进行日志分析,如百度、淘宝等。
·  统计一个网站一个时间段内的pv,uv,SKU,SPU,SKC
·  多维度数据分析(数据仓库)
·  海量结构化(关系型)数据离线分析
·  构建数据仓库

PV(Page View)访问量, 即页面浏览量或点击量,衡量网站用户访问的网页数量;在一定统计周期内用户每打开或刷新一个页面就记录1次,多次打开或刷新同一页面则浏览量累计。

UV(Unique Visitor)独立访客,统计1天内访问某站点的用户数(以cookie为依据);访问网站的一台电脑客户端为一个访客。可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过来访电脑的cookies实现的。如果更换了IP后但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的。如果用户不保存cookies访问、清除了cookies或者更换设备访问,计数会加1。00:00-24:00内相同的客户端多次访问只计为1个访客。


1.8、Hive架构

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/24a33ea0ded262830593fdb3fe160540..png

1.8.1、Hive Client
Hive Client 是与Hive交互的工具,用户可以通过它提交HiveQL查询、执行数据操作并获取结果。

·  Client(hive shell)
启动:可以通过运行hive命令启动Hive CLI。
功能:支持执行HiveQL查询、查看表结构、插入数据、创建表等操作。
局限性:由于CLI是基于命令行的,操作可能不如图形界面直观,且在某些情况下(如长时间运行的查询)可能不太方便。


·  JDBC/ODBC(java访问hive)
JDBC客户端:例如,Java程序可以通过Hive的JDBC驱动与HiveServer2进行连接和操作。
ODBC客户端:例如,使用ODBC接口,可以在Windows环境中使用Excel等工具连接Hive。
优势:提供与多种应用和工具的集成能力,适合构建复杂的数据处理和分析应用。


·  Beeline(Beeline是Hive的JDBC客户端,提供了一种与HiveServer2交互的方式)
启动:通过运行beeline命令启动,可以连接到本地或远程的HiveServer2实例。
优势:相比于Hive CLI,Beeline更加轻量级,并且支持更好的多用户并发访问。
使用方式:典型的连接命令是!connect jdbc:hive2://hostname:port/default,然后输入用户名和密码进行连接。
特性:支持更丰富的SQL语法、参数化查询、脚本执行等。


1.8.2、Hive Metastore(Hive的元数据存储)
在Apache Hive中,Metastore(元数据存储)扮演着非常重要的角色,它负责管理和存储Hive表的元数据信息。

元数据存储在数据库中,默认存在自带的derby数据库(单用户局限性)中,推荐使用Mysql进行存储。

·  作用:对Hive表的源数据进行存储,元数据包括:表名、表所属的数据库(默认default数据库)、表的拥有者、列名、表的分区字段、表的类型(内部表还是外部表)、表的存储格式、表的存储位置。

1.8.3、sql语句是如何转换成MapReduce任务的(重点!!!!!!!!!!!!)
·  解析器(SQL Parser):将SQL字符串转换成抽象语法树(从3.x版本后,转换成一些stage),在此阶段,Hive会检查语法错误:比如白哦是否在、字段是否存在。
·  编译器(Physical Plan):将抽象语法树(从3.x版本后,转换成一些stage)生存逻辑执行计划。
·  优化器(Query Optimizer):对逻辑执行计划进行优化。
·  执行器(Execution):将逻辑执行计划转换成可以运行的物理执行计划,也就是MapReduce任务
·  结果处理:Hive将生成的MapReduce作业提交给Hadoop集群中的YARN进行执行,在任务执行完成后,将结果返回给用户。


2、Hive的三种交互方式
(1) 第一种交互方式
shell交互Hive,用命令hive启动一个hive的shell命令行,在命令行中输入sql或者命令来和Hive交互。

服务端启动metastore服务(后台启动):nohup hive --service metastore &

进入命令:hive

退出命令行:quit;

(2) 第二种交互方式
Hive启动为一个服务器,对外提供服务,其他机器可以通过客户端通过协议连接到服务器,来完成访问操作,这是生产环境用法最多的

服务端启动hiveserver2服务:

nohup hive --service metastore &

nohup hiveserver2 &

需要稍等一下,启动服务需要时间:

beeline -u jdbc:hive2://master:10000 -n root

退出命令行:!exit

(3) 第三种交互方式

使用 –e 参数来直接执行hql的语句

bin/hive -e "show databases;"

使用 –f 参数通过指定文本文件来执行hql的语句

特点:执行完sql后,回到linux命令行。

vim hive.sql

create database bigdata30_test;

use bigdata30_test;

create table test1

 id bigint,

 name string

)

ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

show tables;


hive -f hive.sql

(4) hive cli和beeline cli的区别

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/5b9602e4e00010c0ec16e8c848985c4e..png

3、Hive元数据
Hive元数据库中一些重要的表结构及用途**,方便Impala、SparkSQL、Hive等组件访问元数据库的理解。

1、存储Hive版本的元数据表(VERSION),该表比较简单,但很重要,如果这个表出现问题,根本进不来Hive-Cli。比如该表不存在,当启动Hive-Cli的时候,就会报错“Table ‘hive.version’ doesn’t exist”

2、Hive数据库相关的元数据表(DBS、DATABASE_PARAMS)

DBS:该表存储Hive中所有数据库的基本信息。

DATABASE_PARAMS:该表存储数据库的相关参数。

3、Hive表和视图相关的元数据表

主要有TBLS、TABLE_PARAMS、TBL_PRIVS,这三张表通过TBL_ID关联。
TBLS:该表中存储Hive表,视图,索引表的基本信息。
TABLE_PARAMS:该表存储表/视图的属性信息。
TBL_PRIVS:该表存储表/视图的授权信息。
4、Hive文件存储信息相关的元数据表

主要涉及SDS、SD_PARAMS、SERDES、SERDE_PARAMS,由于HDFS支持的文件格式很多,而建Hive表时候也可以指定各种文件格式,Hive在将HQL解析成MapReduce时候,需要知道去哪里,使用哪种格式去读写HDFS文件,而这些信息就保存在这几张表中。
SDS:该表保存文件存储的基本信息,如INPUT_FORMAT、OUTPUT_FORMAT、是否压缩等。TBLS表中的SD_ID与该表关联,可以获取Hive表的存储信息。
SD_PARAMS: 该表存储Hive存储的属性信息。
SERDES:该表存储序列化使用的类信息。
SERDE_PARAMS:该表存储序列化的一些属性、格式信息,比如:行、列分隔符。
5、Hive表字段相关的元数据表

主要涉及COLUMNS_V2:该表存储表对应的字段信息。

4、Hive的基本操作

4.1 Hive库操作
4.1.1 创建数据库

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

create database testdb;

2)避免要创建的数据库已经存在错误,增加if not exists判断。(标准写法)

create database [if not exists] testdb; 


create database if not exists bigdata30_test2;

4.1.2 创建数据库和位置
create database if not exists bigdata30_test3 location '/bigdata30/liliangdb';

4.1.3 修改数据库
数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。(重点关注哪些不能改,以及为什么!!)

alter database dept set dbproperties('createtime'='20220531');


4.1.4 数据库详细信息
1)显示数据库(show)

show databases;

2)可以通过like进行过滤

show databases like 't*';

3)查看详情(desc)

desc database testdb;

4)切换数据库(use)

use testdb;

4.1.5 删除数据库(将删除的目录移动到回收站中)
1)最简写法

drop database testdb;

2)如果删除的数据库不存在,最好使用if exists判断数据库是否存在。否则会报错:FAILED: SemanticException [Error 10072]: Database does not exist: db_hive

drop database if exists testdb;

3)如果数据库不为空,使用cascade命令进行强制删除。报错信息如下FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException(message:Database db_hive is not empty. One or more tables exist.)

drop database if exists testdb cascade;

4.2、Hive数据类型

4.2.1、基础数据类型

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/2cf5cc0cf81b75789ea72685423c2315..png

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/37e40f8ee360c3b47f5f2aec1122f19b..png

4.2.2、复杂数据类型

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/8e4c3a65f3eebb7ca377f3d7298cfb8a..png

Hive有三种复杂数据类型ARRAY、MAP 和 STRUCT。ARRAY和MAP与Java中的Array和Map类似,而STRUCT与C语言中的Struct类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。还有一个uniontype< 所有类型,所有类型… > 。

数组:array< 所有类型 >;
Map < 基本数据类型,所有数据类型 >;
struct < 名:所有类型[注释] >;
uniontype< 所有类型,所有类型… >

4.3、Hive表操作

Hive的存储格式:

Hive没有专门的数据文件格式,常见的有以下几种:

 TEXTFILE
SEQUENCEFILE
AVRO
 RCFILE
 ORCFILE
 PARQUET

TextFile: 

 TEXTFILE 即正常的文本格式,是Hive默认文件存储格式,因为大多数情况下源数据文件都是以text文件格式保存(便于查看验数和防止乱码)。此种格式的表文件在HDFS上是明文,可用hadoop fs -cat命令查看,从HDFS上get下来后也可以直接读取。 

 TEXTFILE 存储文件默认每一行就是一条记录,可以指定任意的分隔符进行字段间的分割。但这个格式无压缩,需要的存储空间很大。虽然可结合Gzip、Bzip2、Snappy等使用,使用这种方式,Hive不会对数据进行切分,从而无法对数据进行并行操作。

一般只有与其他系统由数据交互的接口表采用TEXTFILE 格式,其他事实表和维度表都不建议使用。

RCFile:

Record Columnar的缩写。是Hadoop中第一个列文件格式。能够很好的压缩和快速的查询性能。通常写操作比较慢,比非列形式的文件格式需要更多的内存空间和计算量。 RCFile是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据`列式存储`,有利于数据压缩和快速的列存取。

ORCFile:

Hive从0.11版本开始提供了ORC的文件格式,ORC文件不仅仅是一种列式文件存储格式,最重要的是有着很高的压缩比,并且对于MapReduce来说是可切分(Split)的。因此,在Hive中使用ORC作为表的文件存储格式,不仅可以很大程度的节省HDFS存储资源,而且对数据的查询和处理性能有着非常大的提升,因为ORC较其他文件格式压缩比高,查询任务的输入数据量减少,使用的Task也就减少了。ORC能很大程度的节省存储和计算资源,但它在读写时候需要消耗额外的CPU资源来压缩和解压缩,当然这部分的CPU消耗是非常少的。

Parquet:

通常我们使用关系数据库存储结构化数据,而关系数据库中使用数据模型都是扁平式的,遇到诸如数组、Map和自定义Struct的时候就需要用户在应用层解析。但是在大数据环境下,通常数据的来源是服务端的埋点数据,很可能需要把程序中的某些对象内容作为输出的一部分,而每一个对象都可能是嵌套的,所以如果能够原生的支持这种数据,这样在查询的时候就不需要额外的解析便能获得想要的结果。Parquet的灵感来自于2010年Google发表的Dremel论文,文中介绍了一种支持嵌套结构的存储格式,并且使用了列式存储的方式提升查询性能。Parquet仅仅是一种存储格式,它是语言、平台无关的,并且不需要和任何一种数据处理框架绑定。这也是parquet相较于orc的仅有优势:支持嵌套结构。Parquet 没有太多其他可圈可点的地方,比如他不支持update操作(数据写成后不可修改),不支持ACID等.

SEQUENCEFILE:

SequenceFile是Hadoop API 提供的一种二进制文件,它将数据以的形式序列化到文件中。这种二进制文件内部使用Hadoop 的标准的Writable 接口实现序列化和反序列化。它与Hadoop API中的MapFile 是互相兼容的。Hive 中的SequenceFile 继承自Hadoop API 的SequenceFile,不过它的key为空,使用value 存放实际的值, 这样是为了避免MR 在运行map 阶段的排序过程。SequenceFile支持三种压缩选择:NONE, RECORD, BLOCK。 Record压缩率低,一般建议使用BLOCK压缩。 SequenceFile最重要的优点就是Hadoop原生支持较好,有API,但除此之外平平无奇,实际生产中不会使用。,value>

AVRO:

Avro是一种用于支持数据密集型的二进制文件格式。它的文件格式更为紧凑,若要读取大量数据时,Avro能够提供更好的序列化和反序列化性能。并且Avro数据文件天生是带Schema定义的,所以它不需要开发者在API 级别实现自己的Writable对象。Avro提供的机制使动态语言可以方便地处理Avro数据。最近多个Hadoop 子项目都支持Avro 数据格式,如Pig 、Hive、Flume、Sqoop和Hcatalog。

Hive的四大常用存储格式存储效率及执行速度对比

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/de376bf82bf97ae839b4ca9255761816..png

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/92be516604c2993510493b17349fc233..jpg

结论:ORCFILE存储文件读操作效率最高

耗时比较:ORC

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/545b06803285ef4f3a13a9817fc99c33..png

结论:ORCFILE存储文件占用空间少,压缩效率高

占用空间:ORC

4.3.1、创建表

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 

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

[COMMENT table_comment]

 [PARTITIONED BY (col_name data_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]


字段解释说明:

- CREATE TABLE 

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

- EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION) 创建内部表时,会将数据移动到数据仓库指向的路径(默认位置);

 创建外部表时,仅记录数据所在的路径,不对数据的位置做任何改变。 在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。

- COMMENT: 为表和列添加注释。

- PARTITIONED BY 创建分区表- CLUSTERED BY 创建分桶表- SORTED BY 不常用

- 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, ...)]

用户在建表的时候可以自定义SerDe或者使用自带的SerDe。

 如果没有指定ROW FORMAT 或者ROW FORMAT DELIMITED,将会使用自带的SerDe。

 在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列的数据。

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

- STORED AS指定存储文件类型 常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)

 如果文件数据是纯文本,可以使用STORED AS TEXTFILE。

如果数据需要压缩,使用 STORED AS SEQUENCEFILE。- LOCATION : 指定表在HDFS上的存储位置。

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

建表1:创建内部表(全部使用默认建表方式)
当创建好表的时候,HDFS会在当前表所属的库中创建一个文件夹

当设置表路径的时候,如果直接指向一个已有的路径,可以直接去使用文件夹中的数据

当load数据的时候,就会将数据文件移动到到表对应的文件夹中

而且数据一旦被load,就不能被修改

我们查询数据也是查询文件中的文件,这些数据最终都会存放到HDFS

当我们删除表的时候,表对应的文件夹会被删除,同时数据也会被删除

默认建表的类型就是内部表

#默认情况下使用的是default数据库#可以在切换到其它数据库:use bigdata30 该数据库在hdfs的具体位置/user/hive/warehouse/bigdata30.db

#通过下面的语句创建students表后会在hdfs上生成一个students文件夹,文件夹里面是用来存储将来插入该表的students.txt数据(也可以是其他类型的文件)

create table students

 id bigint,

 name string, 

 age int, gender string,

 clazz string

)

ROW FORMAT DELIMITED FIELDS TERMINATED BY '_'; // 必选,指定列分隔符 

//使用load加载数据:

load data inpath '/data/students.txt' into table students;

加载数据的作用就是将hdfs上的/data/students.txt的数据移动到/user/hive/warehouse/bigdata30.db/students文件夹下

//使用上传文件的方式加载数据hadoop fs -put students.txt /user/hive/warehouse/bigdata30.db/students#在Hive中创建表时指定列分隔符是为了解析数据文件中的列。

当Hive读取数据文件时,它会使用指定的列分隔符来识别和分隔每一列的数据。

表的路径为: /user/hive/warehouse/bigdata30.db/students 

删除文件后数据和文件夹同时删除

建表2:创建外部表

 外部表因为是指定其他的hdfs路径的数据加载到表中来,所以hive会认为自己不完全独占这份数据

 删除hive表的时候,数据仍然保存在hdfs中,不会删除。

// 外部表(一般情况下,建一个与表名相同的文件夹,然后再将数据上传到该文件夹下,在创建表的时候指定location的路径为数据的存储路径即可)create external table students( id bigint, name string, age int, gender string, clazz string)ROW FORMAT DELIMITED FIELDS TERMINATED BY ','location '/data';//当指定的路径下有数据时,直接将数据加载到表中表的存储路径hdfs://master:9000/data//当指定的路径下没有数据时,通过hadoop命令将数据上传到location指定的文件夹,数据自动加载到表中hadoop fs -put students.txt /data//也可以使用hive命令行中通过命令将本地文件导入到hdfs上hive> dfs -put /usr/local/soft/data/students.txt /data;

建表3:指定存储格式

create table IF NOT EXISTS students( id bigint, name string, age int, gender string, clazz string)ROW FORMAT DELIMITED FIELDS TERMINATED BY ','STORED AS ORC// 指定储存格式为orcfile,inputFormat:RCFileInputFormat,outputFormat:RCFileOutputFormat,如果不指定,默认为textfile,注意:除textfile以外,其他的存储格式的数据都不能直接加载,需要使用从表插入数据的方式。load data inpath '/data/students.txt' into table students;(不可用)insert into table students_test1 select * from students limit 10;(可用)

建表4:使用查询语句建表 (这种方式比较常用)

create table students1 as select * from students;

建表5:只想建表,不需要加载数据

create table students5 like students;

简单用户信息表创建:

create table students6(

id int,

uname string,

pwd string,

gender string,

age int

)

row format delimited fields terminated by ','

lines terminated by '\n';

在Hive中,建表语句中的lines terminated by '\n'是可选的,并不是必须的。这个语句用于指定在加载数据时每行数据的结束符号,默认情况下,Hive会将每行数据以换行符 \n 作为结束标志。如果你的数据文件每行以换行符结束,你可以不用显式地指定这个参数,Hive会自动识别。但如果你的数据文件行结尾使用了其他分隔符,你就需要使用这个参数来告诉Hive如何正确地解析每行数据。


admin,123456,nan,18

zhangsan,abc123,nan,23

lisi,654321,nv,16

复杂人员信息表创建:

create table IF NOT EXISTS t_person(

name string,

friends array,children map,address struct),int>

row format delimited fields terminated by ',' -- 列与列之间的分隔符,int>

collection items terminated by '_' -- 集合数据类型元素与元素之间分隔符,int>

map keys terminated by ':' -- Map数据类型键与值之间的分隔符,int>

lines terminated by '\n'; -- 行与行之间的换行符,int>


songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,beng bu_anhui

yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,he fei_anhui

4.3.2、加载数据

1、使用hdfs dfs -put '本地数据' 'hive表对应的HDFS目录下'

hadoop fs -put /uer/local/soft/bigdata30/students.txt /data/students

2、使用 load data

注意:默认情况下加载的新数据会被追加到已有表的末尾,而不会覆盖或者清空已存在的数据

load data inpath '/data/students.txt' into table students;// 清空表truncate table students;// 加上 local 关键字 可以将Linux本地目录下的文件 上传到 hive表对应HDFS 目录下 原文件不会被删除load data local inpath '/usr/local/soft/data/students.txt' into table students;// overwrite 覆盖加载load data local inpath '/usr/local/soft/data/students.txt' overwrite into table students;

3、create table xxx as SQL语句
4、insert into table xxxx SQL语句 (没有as)

// 将 students表的数据插入到students2 这是复制 不是移动 students表中的表中的数据不会丢失insert into table students1 select * from students;// 覆盖插入 把into 换成 overwriteinsert overwrite table students1 select * from students;

4.3.3、对表进行修改

显示表

//显示当前数据库下的所有表show tables;//显示当前数据库下以u开头的所有表show tables like 'u*';//查看表的结构(表的字段和字段类型)desc t_person;//查看表的详细结构,包括表的存储位置,表的存储类型,和表的一些其他的属性desc formatted students; 

添加列

alter table students2 add columns (education string);

更新列

alter table stduents2 change education educationnew string;这条语句将会更改 students2 表中名为 education 的列的数据类型为 STRING,同时将其列名更改为 educationnew。

4.3.4、工作案例
一般在公司中,使用外部表多一点,因为数据可以需要被多个程序使用,避免误删,通常外部表会结合location一起使用

外部表还可以将其他数据源中的数据 映射到 hive中,比如说:hbase,ElasticSearch…

设计外部表的初衷就是 让 表的元数据 与 数据 解耦

第一步:在hdfs上创建表数据存储的文件夹

hdfs dfs -mkdir -p /bigdata30/depthdfs dfs -mkdir -p /bigdata30/emphdfs dfs -mkdir -p /bigdata30/salgrade

第二步:将数据上传到hdfs上

hadoop fs -put /uer/local/soft/bigdata30/dept.txt /bigadta30/depthadoop fs -put /uer/local/soft/bigdata30/dept.txt /bigadta30/emphadoop fs -put /uer/local/soft/bigdata30/dept.txt /bigadta30/salgrade

第三步:创建表

创建dept表

CREATE EXTERNAL TABLE IF NOT EXISTS dept ( DEPTNO int, DNAME varchar(255), LOC varchar(255)) row format delimited fields terminated by ','location '/bigdata30/dept';10,ACCOUNTING,NEW YORK20,RESEARCH,DALLAS30,SALES,CHICAGO40,OPERATIONS,BOSTON

创建emp表

CREATE EXTERNAL TABLE IF NOT EXISTS emp (

 EMPNO int,

 ENAME varchar(255), 

 JOB varchar(255), 

 MGR int, 

 HIREDATE date, SAL decimal(10,0), COMM decimal(10,0), DEPTNO int

) row format delimited fields terminated by ',' 

location '/bigdata30/emp'; 


7369,SMITH,CLERK,7902,1980-12-17,800,null,207499,ALLEN,SALESMAN,

7698,1981-02-20,1600,300,307521,WARD,SALESMAN,7698,1981-02-22,1250,500,307566,JONES,MANAGER,7839,1981-04-02,2975,null,207654,MARTIN,SALESMAN,7698,1981-09-28,1250,1400,307698,BLAKE,MANAGER,7839,1981-05-01,2850,null,307782,CLARK,MANAGER,7839,1981-06-09,2450,null,107788,SCOTT,ANALYST,7566,1987-07-13,3000,null,207839,KING,PRESIDENT,null,1981-11-17,5000,null,107844,TURNER,SALESMAN,7698,1981-09-08,1500,0,307876,ADAMS,CLERK,7788,1987-07-13,1100,null,207900,JAMES,CLERK,7698,1981-12-03,950,null,307902,FORD,ANALYST,7566,1981-12-03,3000,null,207934,MILLER,CLERK,7782,1982-01-23,1300,null,10

创建salgrade表

CREATE EXTERNAL TABLE IF NOT EXISTS salgrade ( GRADE int, LOSAL int, HISAL int) row format delimited fields terminated by ','location '/bigdata30/salgrade';1,700,12002,1201,14003,1401,20004,2001,30005,3001,9999

4.3.5、Hive导出数据

将表中的数据备份

将查询结果放到本地

//创建存放数据的目录

mkdir -p /usr/local/soft/shujia

//导出查询结果的数据(导出到Node01上)

insert overwrite local directory '/usr/local/soft/shujia' select * from t_person;


·按照指定的方式将数据输出到本地

-- 创建存放数据的目录mkdir -p /usr/local/soft/shujia-- 导出查询结果的数据insert overwrite local directory '/usr/local/soft/shujia'ROW FORMAT DELIMITED fields terminated by ',' collection items terminated by '-' map keys terminated by ':' lines terminated by '\n' select * from t_person;


 · 将查询结果输出到HDFS

-- 导出查询结果的数据insert overwrite local directory '/usr/local/soft/shujia'ROW FORMAT DELIMITED fields terminated by ',' collection items terminated by '-' map keys terminated by ':' lines terminated by '\n' select * from t_person;-- 创建存放数据的目录hdfs dfs -mkdir -p /shujia/bigdata30/copy

-- 导出查询结果的数据insert overwrite directory '/data/' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' select clazz,count(1) from students group by clazz

直接使用HDFS命令保存表对应的文件夹

// 创建存放数据的目录

hdfs dfs -mkdir -p /bigdata30/data

// 使用HDFS命令拷贝文件到其他目录

hdfs dfs -cp /hive/warehouse/t_person/* /bigdata30/data


·将表结构和数据同时备份

将数据导出到HDFS

//创建存放数据的目录

hdfs dfs -mkdir -p /bigdata30/copy

//导出查询结果的数据

export table t_person to '/bigdata30/copy';

删除表结构

drop table t_person;

恢复表结构和数据

// 加上 local 关键字 可以将Linux本地目录下的文件 上传到 hive表对应HDFS 目录下 原文件不会被删除

load data local inpath '/usr/local/soft/data/students.txt' into table students;

// overwrite 覆盖加载

load data local inpath '/usr/local/soft/data/students.txt' overwrite into table students;

注意:时间不同步,会导致导入导出失败

本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!

《数据资产管理白皮书》下载地址:

《行业指标体系白皮书》下载地址:

《数据治理行业实践白皮书》下载地址:

《数栈V6.0产品白皮书》下载地址:

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:

同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:

0条评论
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群