DDL数据定义

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相关的可以不同管。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Distantfbc

你的鼓励是我最大的动力,谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值