1、DDL数据定义
Hive语句也是似曾相识。因为它也是SQL标准的,很多与MySQL很接近,当然也有一点不一样。
下面的代码使用hiveserver2来实现。
在一个终端启动hiveserver2服务
[root@hadoop101 hive]# bin/hiveserver2 |
在另一个终端输入beeline
[root@hadoop101 hive]# bin/beeline |
beeline> !connect jdbc:hive2://hadoop101:10000(回车) Connecting to jdbc:hive2://hadoop101:10000 Enter username for jdbc:hive2://hadoop101:10000: root(回车) Enter password for jdbc:hive2://hadoop101:10000: (直接回车) Connected to: Apache Hive (version 3.1.0) Driver: Hive JDBC (version 3.1.0) Transaction isolation: TRANSACTION_REPEATABLE_READ 0: jdbc:hive2://hadoop101:10000> show databases; +----------------+--+ | database_name | +----------------+--+ | default | +----------------+--+ |
2、创建数据库
CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES (property_name=property_value, ...)]; |
注意其中的LOCATION hdfs_path。Hive底层用的是HDFS,可以通过LOCATION关键字单独指明数据库要保存在什么地方。
1)创建一个数据库,数据库在HDFS上的默认存储路径是/user/hive/warehouse/*.db。(可以在网页上打开 http://192.168.91.101:50070/explorer.html#/ 查看)
0: jdbc:hive2://hadoop101:10000> create database db_hive; |
2)避免要创建的数据库已经存在错误,增加if not exists判断。(标准写法)
0: jdbc:hive2://hadoop101:10000> create database db_hive; |
0: jdbc:hive2://hadoop101:10000> create database if not exists db_hive; |
3)创建一个数据库,指定数据库在HDFS上存放的位置
0: jdbc:hive2://hadoop101:10000> create database if not exists db_hive2 location '/db_hive2.db'; |
3、查询数据库
1. 显示数据库
(1).显示数据库
0: jdbc:hive2://hadoop101:10000> show databases; |
(2).过滤显示查询的数据库
0: jdbc:hive2://hadoop101:10000> show databases like 'db_hive*'; |
注意Hive中的通配符匹配是*符号,MySQL中的通配符匹配是%符号。
2. 查看数据库详情
(1).显示数据库信息
0: jdbc:hive2://hadoop101:10000> desc database db_hive; |
(2).显示数据库详细信息,extended
0: jdbc:hive2://hadoop101:10000> desc database extended db_hive; |
目前和前面是一样的,后面才会看出差别。
3. 切换当前数据库
0: jdbc:hive2://hadoop101:10000> use db_hive |
4、修改数据库
用户可以使用ALTER DATABASE命令为某个数据库的DBPROPERTIES设置键-值对属性值,来描述这个数据库的属性信息。数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。
0: jdbc:hive2://hadoop101:10000> alter database db_hive set dbproperties('createtime'='20210602'); |
在hive中查看修改结果
0: jdbc:hive2://hadoop101:10000> desc database extended db_hive; |
这里如果不使用dbproperties则没有parameters了。
就是说,通过extended查询就可以看到参数信息。
5、删除数据库
1.删除空数据库
0: jdbc:hive2://hadoop101:10000> drop database db_hive2; |
2.如果删除的数据库不存在,会报告如下错误。最好采用 if exists判断数据库是否存在
0: jdbc:hive2://hadoop101:10000> drop database db_hive; FAILED: SemanticException [Error 10072]: Database does not exist: db_hive 0: jdbc:hive2://hadoop101:10000> drop database if exists db_hive2; |
3.如果数据库不为空,可以采用cascade命令,强制删除
0: jdbc:hive2://hadoop101:10000> drop database db_hive; 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.) 0: jdbc:hive2://hadoop101:10000> drop database db_hive cascade; |
假如数据库中有表存在,直接输入drop database db_hive提示删除失败。
只有输入drop database db_hive cascade才能删除成功。
6、创建表
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] [TBLPROPERTIES (property_name=property_value, ...)] [AS select_statement] |
2).字段解释说明
(1)CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。
(2)EXTERNAL关键字可以让用户创建一个外部表,在建表的同时可以指定一个指向实际数据的路径(LOCATION),在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
(3)COMMENT:为表和列添加注释。
(4)PARTITIONED BY创建分区表
(5)CLUSTERED BY创建分桶表
(6)SORTED BY不常用,对桶中的一个或多个列另外排序
(7)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的简称, hive使用Serde进行行对象的序列化与反序列化。
(8)STORED AS指定存储文件类型
常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)
如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。
(9)LOCATION :指定表在HDFS上的存储位置。
(10)AS:后跟查询语句,根据查询结果创建表。
(11)LIKE允许用户复制现有的表结构,但是不复制数据。
1. 管理表
1).理论
默认创建的表都是所谓的管理表,有时也被称为内部表。因为这种表,Hive会(或多或少地)控制着数据的生命周期。Hive默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定义的目录的子目录下。 当我们删除一个管理表时,Hive也会删除这个表中数据。管理表不适合和其他工具共享数据。
2).案例实操
在db_hive数据库中进行。
0: jdbc:hive2://hadoop101:10000> use db_hive; |
(1)普通创建表
0: jdbc:hive2://hadoop101:10000> create table if not exists student2( id int, name string ) row format delimited fields terminated by '\t' stored as textfile location '/user/hive/warehouse/student2'; |
注意:创建的/user/hive/warehouse/student2是个目录。
这里row format指定属性之间使用'\t'隔开;然后存储为textfile(文本文件);存储的路径在HDFS上的/user/hive/warehouse/student2。
(2)根据查询结果创建表(查询的结果会添加到新创建的表中)
注:student表在7.2.6的(6)中创建,(7)中导入。
0: jdbc:hive2://hadoop101:10000> create table if not exists student3 as (); |
其中,( )中的内容实际上是子查询的结果,子查询是:
0: jdbc:hive2://hadoop101:10000> select id, name from student; |
子查询的代码代入到( )中,得到最终的查询为:
0: jdbc:hive2://hadoop101:10000> create table if not exists student3 as (select id, name from student); |
注意:这里运行时间较长,需要耐心等待。
注意这里不是简单的复制,而是做了map reduce的运算。(如果只是select其中的某项比如id,则可以有明显的差距)
留意student3在hdfs中的表现
(3)根据已经存在的表结构创建表
0: jdbc:hive2://hadoop101:10000> create table if not exists student4 like student; |
这就是创建跟已知表结构完全一样的表(但是只是创建表结构,表里面没有内容)。(创建表的时候有row format之类的东西,如果下次创建的时候不想重新输入一遍,则可以使用like)
(4)查询表的类型
0: jdbc:hive2://hadoop101:10000> desc formatted student2; |
留意运行的结果中,Table Type为MANAGED_TABLE。
MANAGED_TABLE称为管理表或内部表。
有个需要注意的,在location路径上
这个location路径的目录在hdfs上是存在的,不是新目录。现在拿到的数据本身不是一张表。但是希望以表的形式来处理,就可以原地建立新目录。
如果上传一个文件到location路径/user/hive/warehouse/student2。
0: jdbc:hive2://hadoop101:10000> dfs -mkdir /student; |
0: jdbc:hive2://hadoop101:10000> dfs -put /export/servers/datas/student.txt /user/hive/warehouse/student2; |
注意在stu_external创建后马上查询,按照MySQL的原理没有INSERT应该是没有数据的。但是Hive中有。
0: jdbc:hive2://hadoop101:10000> select * from student2; |
所以Hive只是改变了HDFS数据的呈现形式。这里以(id int, name string)呈现出来。
但实际上风险也在这里。这个数据不是Hive自己的,可能还关系到别的。
如果后面drop掉
0: jdbc:hive2://hadoop101:10000> drop table student2; |
此时留意HDFS中的文件也删除。
所有的管理表Hive都认为:这份数据是我的,可以随便搞,我有权利删除。
如果不希望这样,可以考虑使用外部表。
2. 外部表
1).理论
因为表是外部表,所以Hive并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。
2).管理表和外部表的使用场景
每天将收集到的网站日志定期流入HDFS文本文件。在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过SELECT+INSERT进入内部表。
日志一般会放到外部表,注意日志一般不是Hive自己用。想要用日志的时候,把日志重新导一份到Hive表中,每天都导的话会浪费空间。此时就建立一张外部表,重新诠释这个数据,然后在这个表中通过SELECT加上数据清洗功能,导进并收藏。
3).案例实操
分别创建部门和员工外部表,并向表中导入数据。
(1)上传数据到HDFS
0: jdbc:hive2://hadoop101:10000> dfs -mkdir /student; 0: jdbc:hive2://hadoop101:10000> dfs -put /export/servers/datas/student.txt /student; |
同hdfs操作的结果。
注意:现在hdfs中的/student.txt文件与hive没有关系。
(2)建表语句
创建外部表
hive (default)> create external table stu_external( id int, name string) row format delimited fields terminated by '\t' location '/student'; |
貌似这句在beeline中执行会出现AlreadyExistsException错误,原因暂时不明。在hive终端执行即可。
(3)查看创建的表
0: jdbc:hive2://hadoop101:10000> select * from stu_external; |
(4)查看表格式化数据
0: jdbc:hive2://hadoop101:10000> desc formatted stu_external; |
留意运行的结果中,Table Type为EXTERNAL_TABLE。
(5)删除外部表
0: jdbc:hive2://hadoop101:10000> drop table stu_external; |
外部表删除后,hdfs中的数据还在,但是metadata中stu_external的元数据已被删除。可以与管理表(内部表)进行比较。
3. 管理表与外部表的互相转换
假如手滑的时候建立错了,想删除了重新建立,可是删了数据就没有了。此时可以进行相互转换。
(1)查询表的类型
(student2表的创建在7.4.5比较靠前的位置)
0: jdbc:hive2://hadoop101:10000> desc formatted student2; |
留意运行的结果中,Table Type为MANAGED_TABLE。
(2)修改内部表student2为外部表
0: jdbc:hive2://hadoop101:10000> alter table student2 set tblproperties('EXTERNAL'='TRUE'); |
(3)查询表的类型
0: jdbc:hive2://hadoop101:10000> desc formatted student2; |
留意运行的结果中,Table Type为EXTERNAL_TABLE。
(4)修改外部表student2为内部表
0: jdbc:hive2://hadoop101:10000> alter table student2 set tblproperties('EXTERNAL'='FALSE'); |
(5)查询表的类型
0: jdbc:hive2://hadoop101:10000> desc formatted student2; |
留意运行的结果中,Table Type为MANAGED_TABLE。
注意:('EXTERNAL'='TRUE')和('EXTERNAL'='FALSE')为固定写法,区分大小写!
7、分区表
分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。
1. 分区表基本操作
(1).引入分区表(需要根据日期对日志进行管理)
/user/hive/warehouse/log_partition/2021/202107/20210702.log /user/hive/warehouse/log_partition/2021/202107/20210703.log /user/hive/warehouse/log_partition/2021/202107/20210704.log |
(2).创建分区表语法
0: jdbc:hive2://hadoop101:10000> create table dept_partition( deptno int, dname string, loc string ) partitioned by (month string) row format delimited fields terminated by '\t'; |
(loc表示location位置)
注意:分区字段不能是表中已经存在的数据,可以将分区字段看作表的伪列。
留意hdfs中在/user/hive/warehouse目录下生成了 db_hive.db/dept_partition目录。
(3).加载数据到分区表中
首先在 /export/servers/datas 目录下创建 dept.txt文件,内容如下:
10 ACCOUNTING 1700 20 RESEARCH 1800 30 SALES 1900 40 OPERATIONS 1700 |
然后执行:
hive (default)> load data local inpath '/export/servers/datas/dept.txt' into table db_hive.dept_partition partition(month='202109'); hive (default)> load data local inpath '/export/servers/datas/dept.txt' into table db_hive.dept_partition partition(month='202108'); hive (default)> load data local inpath '/export/servers/datas/dept.txt' into table db_hive.dept_partition partition(month='202107'); |
注意local inpath就是本地的文件系统(不是hdfs上的)。
注意:分区表加载数据时,必须指定分区 (partition(month='202109')),这里指按month分类。
(4).查询分区表中数据
先查看一下dept_partition表中所有的数据。
hive (default)> select * from dept_partition; |
注意多了一列(字段)month。
留意在hdfs中的表现,之前的是数字,现在则是:
多了一层目录(month=202107),这个有什么用?
Hive最大的问题在于,它是没有索引的。相比MySQL是有索引的,一般主键就是索引。但Hive没有主键这东西。将来做大数据全表扫描的时候,就很慢。如果解决这个事?就通过分区。分区表的这个分区,在某种程度上,就是起到了索引的作用(但它并不是索引)。有了分区,就可以避免全表扫描了。
单分区查询
hive (default)> select * from dept_partition where month='202109'; |
注意假设现在输入两句话:
hive (default)> select * from dept_partition where month='202109'; |
hive (default)> select * from dept_partition where deptno=10; |
这两句扫描的数据量是完全不同的。
hive (default)> select * from dept_partition where month='202109'; |
这句扫描的数据量就4行。
hive (default)> select * from dept_partition where month='202109'; |
这句表中有多少行就扫多少行。现在的表中是12行文件。
这是个很常用的知识点。后面会演示一些hive优化。但是数据量太少了,不太管用。将来在公网上就有区别了。
多分区联合查询
hive (default)> select * from dept_partition where month='202109' union select * from dept_partition where month='202108' union select * from dept_partition where month='202107'; |
注意这里又要启动mapreduce,执行时间很长。
注意与select * from dept_partition的区别。
注意现在表的形式改变了,原来是10、20、30、40、10、20、30、40、10、20、30、40这样的,现在变成了10、10、10、10、20、20、20、20、30、30、30、30。因为形式改变了,所以肯定得mapreduce。
(5).增加分区
创建单个分区
hive (default)> alter table dept_partition add partition(month='202106'); |
注意此时数据没有变化(只是增加了分区,没有加载数据)。
同时创建多个分区
hive (default)> alter table dept_partition add partition(month='202105') partition(month='202104'); |
(6).删除分区
删除单个分区
hive (default)> alter table dept_partition drop partition (month='202104'); |
同时删除多个分区
hive (default)> alter table dept_partition drop partition (month='202105'), partition (month='202106'); |
(7).查看分区表有多少分区
hive> show partitions dept_partition; |
(8).查看分区表结构
hive> desc formatted dept_partition; |
注意month字段。
2. 分区表注意事项
1).创建二级分区表
hive (default)> create table dept_partition2( deptno int, dname string, loc string ) partitioned by (month string, day string) row format delimited fields terminated by '\t'; |
2).正常的加载数据
(1)加载数据到二级分区表中
hive (default)> load data local inpath '/export/servers/datas/dept.txt' into table db_hive.dept_partition2 partition(month='202109', day='13'); |
(2)查询分区数据
先查看所有数据
hive (default)> select * from dept_partition2; |
查询分区数据。
hive (default)> select * from dept_partition2 where month='202109' and day='13'; |
留意hdfs上
所谓的二级分区表,实际上就是多了一层目录。它实际上就可以把数据管理的更加细致。
将来面临的数据量很大,有可能每天甚至每小时都滚(每小时一个文件夹)。Hive可以以"年/月/日/小时"这种方式建立表。见下面的二级分区。
将来如果要找2020年7月11日的数据,不需要进行全表扫描。而是去固定的文件夹找到相应的数据。所以分区表某种程度上起到了索引的作用。可以快速定位一部分数据,并加速你的查询速度。
以后处理公司的数据表的时候,如果不指定扫描哪些分区,甚至都不会让你执行。为了防止你新人手滑,一个回车下去就全表扫描开始了。
3).把数据直接上传到分区目录上,让分区表和数据产生关联的三种方式
(1)方式一:上传数据后修复
上传数据
hive (default)> dfs -mkdir -p /user/hive/warehouse/db_hive.db/dept_partition2/month=202109/day=12; hive (default)> dfs -put /export/servers/datas/dept.txt /user/hive/warehouse/db_hive.db/dept_partition2/month=202109/day=12; |
查询数据(查询不到刚上传的数据)
hive (default)> select * from dept_partition2 where month='202109' and day='12'; |
结果为空。
执行修复命令
hive> msck repair table dept_partition2; |
再次查询数据
hive (default)> select * from dept_partition2 where month='202109' and day='12'; |
(2)方式二:上传数据后添加分区
上传数据
hive (default)> dfs -mkdir -p /user/hive/warehouse/db_hive.db/dept_partition2/month=202109/day=11; hive (default)> dfs -put /export/servers/datas/dept.txt /user/hive/warehouse/db_hive.db/dept_partition2/month=202109/day=11; |
查询数据(查询不到刚上传的数据)
hive (default)> select * from dept_partition2 where month='202109' and day='11'; |
结果为空。
执行添加分区
hive (default)> alter table dept_partition2 add partition(month='202109', day='11'); |
查询数据
hive (default)> select * from dept_partition2 where month='202109' and day='11'; |
(3)方式三:创建文件夹后load数据到分区
创建目录
hive (default)> dfs -mkdir -p /user/hive/warehouse/db_hive.db/dept_partition2/month=202109/day=10; |
上传数据
hive (default)> load data local inpath '/export/servers/datas/dept.txt' into table dept_partition2 partition(month='202109',day='10'); |
查询数据
hive (default)> select * from dept_partition2 where month='202109' and day='10'; |
注意:将来日志生成是滚动生成的。外部建立目录不会通知Hive,Hive的表上反映不到。就是外部采集的数据在Hive中看不到。此时,就需要用到上面几种修复方式了。
Hive本质上,是把HDFS的数据以另外的一种方式呈现。一张表的内容怎么呈现处理,首先要有数据,其次要有描述这个数据呈现方式的元数据。前面之所以没有呈现这张表,是因为没有元数据。上面的命令repair、add partition本质上干的是同一件事,就是添加元数据。
当然还有load上去的方式。但是将来最常见的场景是:数据是外部程序采集的。所以每次都需要修复一下元数据,然后再查询。
分区表就是分文件夹管理数据。给Hive提供了更细粒度管理数据的方式。
分区表体现在Hive上是多了两个字段,在HDFS上是文件夹分级。
分区表可以避免全表扫描,加快查询速度。
分区表非常重要。
8、修改表
1. 重命名表
1).语法
ALTER TABLE table_name RENAME TO new_table_name |
2).实操案例
hive (default)> alter table dept_partition2 rename to dept_partition3; |
2. 增加、修改和删除表分区
详见7.4.6分区表基本操作。
3. 增加/修改/替换列信息
1).语法
更新列
ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name] |
增加和替换列
ALTER TABLE table_name ADD | REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...) |
注:ADD是代表新增一字段,字段位置在所有列后面(partition列前),REPLACE则是表示替换表中所有字段。
2).实操案例
(1)查询表结构
hive> desc formatted dept_partition; |
(2)添加列
hive (default)> alter table dept_partition add columns(deptdesc string); |
(3)添加后,查询表结构
hive> desc dept_partition; |
(4)更新列
hive (default)> alter table dept_partition change column deptdesc desc int; |
注意:可能会报告错误(不同版本不同结果)
Error: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Unable to alter table. The following columns have types incompatible with the existing columns in their respective positions : desc (state=08S01,code=1) |
原因是列中已存储的数据类型与转换的目标数据类型不兼容。
查看一下
hive (default)> select * from dept_partition; |
由于前面add columns时默认设置新增加列的值为NULL,不可以转为int类型。
PS. 貌似新版本的hive放弃对columns的强转。只能先替换移除后,再添加。
hive (default)> alter table dept_partition replace columns(deptno int, dname string, loc string); hive (default)> alter table dept_partition add columns(desc int); |
(5)查询表结构
hive> desc formatted dept_partition; |
(6)替换列
hive (default)> alter table dept_partition replace columns(deptno string, dname string, loc string); |
注意:替换只能替换所有列,不能替换指定的列。所以原来的4列(deptno int, dname string, loc string, desc int)替换后只剩下3列(deptno string, dname string, loc string)。desc被删除了。
(7)查询表结构
hive> desc formatted dept_partition; |
替换列信息的操作不太常用,了解有这个功能就可以了。
9、删除表
hive (default)> drop table dept_partition; |
10、补充:Hive数据呈现方式
首先确保hdfs上有/student目录,下面有student.txt文件。如果没有,执行下面两句:
0: jdbc:hive2://hadoop101:10000> dfs -mkdir /student; 0: jdbc:hive2://hadoop101:10000> dfs -put /export/servers/datas/student.txt /student; |
创建表
hive (default)> create external table stu (id int) row format delimited fields terminated by '\t' location '/student'; |
现在表里有什么?
可以看到,只有id。
Hive是改变HDFS数据呈现方式。原来的数据是:
现在拿到这个数据后,使用\t把数据拆开,并把id拿出来。当然,现在/student目录下的文件只有一个,如果有两个就显示两次。
拷贝dept.txt到hdfs的/student目录下。
[root@hadoop101 ~]# hadoop fs -put /export/servers/datas/dept.txt /student; |
然后重新创建表
hive (default)> drop table stu; hive (default)> create external table stu (id int, name string) row format delimited fields terminated by '\t' location '/student'; |
注意dept.txt中的内容和student.txt的内容混搭了。
现在表里有什么?
再来重新创建表:
hive (default)> drop table stu; hive (default)> create external table stu (id int, name string, nnn string) row format delimited fields terminated by '\t' location '/student'; |
现在表里有什么?
所以还是那句话:Hive只是改变了hdfs呈现数据的方式。现在stu表是以另外一种形式来描述/student文件夹下的数据(三列id、name、nnn)。dept.txt文件中三列都有,student.txt文件中只有两列,最后一列则自动补NULL。
11、错误解决
initSchema如果出现如下错误。
可以先在MySQL中删除hive数据库。
mysql> drop database hive; |
再重新执行initSchema。
DROP TABLE如果出现如下错误。
参考:hive 未初始化元数据库报错 - 记忆残留 - 博客园
第一个启动hive需要执行初始化命令:
[root@hadoop101 hive]# bin/schematool -dbType mysql -initSchema |
查看初始化后的信息
[root@hadoop101 hive]# bin/schematool -dbType mysql -info |
如果不确定如何修复错误。可以卸载hive再重新搭建。卸载步骤如下:
删除hive目录
[root@hadoop101 hive]# cd /export/servers/ [root@hadoop101 servers]# rm -fr hive/ |
在MySQL中删除hive目录
[root@hadoop101 servers]# mysql –uroot –p123456 |
mysql> drop database hive; |
在hdfs上删除tmp和/user/hive/warehouse目录。
[root@hadoop101 hadoop-3.1.2]# bin/hadoop fs -rm -f -r /tmp [root@hadoop101 hadoop-3.1.2]# bin/hadoop fs –rm –f -r /user/hive/ |
配置文件中与hive相关的可以不同管。