暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

HIVE 的增删改查(表、字段、数据)操作

楼的日常跋涉 2021-07-02
8833
以下是HIVE数据库结构的常用HiveSQL


一、新建表:

create table [表英文名]

(

[字段1] STRING COMMENT  '[字段1]'

,[字段2] STRING COMMENT  '[字段2]' 

,[字段3] DECIMAL(18,7) COMMENT  '[字段3]'

,[字段4] INT COMMENT  '[字段4]'

,[字段5] DATE COMMENT  '[字段5]'

,[字段6] SMALLINT COMMENT  '[字段6]'

)

COMMENT  '[表中文名]'

PARTITIONED BY 

(

[分区字段] STRING COMMENT  '[分区字段]'

)

STORED AS Orc

;

 

--举例如下:

--1、分区表的建表:

create table TEST_TABLE

(

Field1 STRING COMMENT  '字段1'

,Field2 STRING COMMENT  '字段2' 

,Field3 DECIMAL(18,7) COMMENT  '字段3'

,Field4 INT COMMENT  '字段4'

,Field5 DATE COMMENT  '字段5'

,Field6 SMALLINT COMMENT  '字段6'

)

COMMENT  '测试表'

PARTITIONED BY 

(

PRT_DT STRING COMMENT  '分区日期'

)

STORED AS Orc

;

--DESC TEST_TABLE;

--2、非分区表的建表:

create table TEST_TABLE_NO

(

Field1 STRING COMMENT  '字段1'

,Field2 STRING COMMENT  '字段2' 

,Field3 DECIMAL(18,7) COMMENT  '字段3'

,Field4 INT COMMENT  '字段4'

,Field5 DATE COMMENT  '字段5'

,Field6 SMALLINT COMMENT  '字段6'

)

COMMENT  '测试表NO'

STORED AS Orc

;

--DESC TEST_TABLE_NO;


二、删除表:

--Drop table [表名]

DROP TABLE TEST_TABLE;

DROP TABLE TEST_TABLE_NO;

 

三、插入数据:

--INSERT INTO [表名] PARTITION(字段1,字段2) VALUES (100,'51N');

--1、分区表插入数据

INSERT INTO TABLE TEST_TABLE PARTITION (PRT_DT = '2021-02-18')VALUES ('1','2',3,4,'2021-02-05',6);

INSERT INTO TABLE TEST_TABLE PARTITION (PRT_DT = '2021-02-18')VALUES ('11','22',33,44,'2021-02-05',66);

INSERT INTO TABLE TEST_TABLE PARTITION (PRT_DT = '2021-02-19')VALUES ('1','2',3,4,'2021-02-05',6);

INSERT INTO TABLE TEST_TABLE PARTITION (PRT_DT = '2021-02-19')VALUES ('11','22',33,44,'2021-02-05',66);

INSERT INTO TABLE TEST_TABLE PARTITION (PRT_DT = '2021-02-19')VALUES ('\N','2',3,4,'2021-02-05',6); --HIVE表中默认将NULL存为\N

INSERT INTO TABLE TEST_TABLE PARTITION (PRT_DT = '2021-02-19')VALUES ('','2',3,4,'2021-02-05',6);

INSERT INTO TABLE TEST_TABLE PARTITION (PRT_DT = '2021-02-19')VALUES ('1','2',3.33333333,4,'2021-02-05',6);

--2、非分区表插入数据

INSERT INTO TABLE TEST_TABLE_NO VALUES ('1','2',3,4,'2021-02-05',6);

INSERT INTO TABLE TEST_TABLE_NO VALUES ('11','22',33,44,'2021-02-05',66);

INSERT INTO TABLE TEST_TABLE_NO VALUES ('1','2',3,4,'2021-02-05',6);

INSERT INTO TABLE TEST_TABLE_NO VALUES ('11','22',33,44,'2021-02-05',66);


***能插入部分(指定)字段数据吗?***

--以下是两种方式插入部分(指定)字段数据,其余字段可设置为默认值

--1、静态分区方式,从另一个表插入数据

INSERT INTO TABLE TEST_TABLE PARTITION (PRT_DT = '2021-02-20') SELECT * FROM TEST_TABLE_NO;

--2、动态分区方式,从另一个表插入数据

set hive.stats.autogather=true;

set hive.exec.dynamic.partition=true;

set hive.exec.dynamic.partition.mode=nonstrict;

INSERT INTO TABLE TEST_TABLE PARTITION (PRT_DT) 

SELECT 

Field1 

,Field2

,Field3

,Field4

,Field5

,Field6 

,'2020-02-01'

FROM TEST_TABLE_NO;

 

--SELECT * FROM TEST_TABLE;

--SELECT * FROM TEST_TABLE_NO;

 

四、删除数据:

--DELETE FROM [表名] WHERE [字段名]>100

--以上执行语句报错,提示HiveSQLException:SemanticException [Error 10294]: Attempt to do update or delete using transaction manager that does not support these operations.

***hiveupdate delete操作,有ALTER TABLE DRODINSERT OVERWRITE TABLE操作***


--1.1 分区表删除具体分区

ALTER TABLE TEST_TABLE DROP IF EXISTS PARTITION (PRT_DT = '2020-02-01');

--1.2 分区表删除具体分区的部分数据

INSERT OVERWRITE TABLE TEST_TABLE PARTITION(PRT_DT='2021-02-19') 

SELECT 

Field1 

,Field2

,Field3

,Field4

,Field5

,Field6 

FROM TEST_TABLE

WHERE Field1 is NULL--#WHERE后的条件是需要保留的数据的查询结果

--2、非分区表删除数据

INSERT OVERWRITE TABLE TEST_TABLE_NO SELECT * FROM TEST_TABLE_NO WHERE Field3 > 3--#WHERE后的条件是需要保留的数据的查询结果,即删除Field3小于及等于3的数据


五、更新数据:

--UPDATE [表名] SET [字段1] = '200',[字段2] = '5T' WHERE [字段3] = 33;

***hive无 update delete操作,有ALTER TABLEINSERT OVERWRITE TABLE操作***

虽然hive可以通过配置hive-site.xml,来增加UpdateDelete支持,但是效率不太高,以下是他人的总结:

1Hive可以通过修改参数达到修改和删除数据的效果,但是速度远远没有传统关系型数据库快。

2、通过ORC的每个task只输出单个文件和自带索引的特性,以及数据的分桶操作,可以将要修改的数据锁定在一个很小的文件块,因此可以做到相对便捷的文件修改操作。

    因此数据的分桶操作非常重要,通常一些表单信息都会根据具体的表单id进行删除与修改,因此推荐使用表单ID作为分桶字段。

3、频繁的updatedelete操作已经违背了hive的初衷。不到万不得已的情况,还是使用增量添加的方式最好。

 

六、修改字段:

--ALTER TABLE [表名] CHANGE [字段名] STRING

ALTER TABLE TEST_TABLE  CHANGE Field1 Field1111 STRING;

ALTER TABLE TEST_TABLE  CHANGE Field1111 Field1111 decimal(18,2);

DESC  TEST_TABLE; --Field1111的字段类型可以从STRING改为decimal(18,2)

SELECT * FROM TEST_TABLE; --但是解析数据库结果集会出现异常:ORC不支持STRING转换为decimal(18,2)

ALTER TABLE TEST_TABLE CHANGE Field1111 Field1 STRING;

ALTER TABLE TEST_TABLE CHANGE Field3 Field3333 DECIMAL(18,2);

ALTER TABLE TEST_TABLE CHANGE Field3333 Field3 DECIMAL(18,7);


七、新增字段:

--ALTER TABLE [表名] ADD [字段名] STRING

ALTER TABLE TEST_TABLE ADD COLUMN(field7  INT COMMENT  '字段7');

ALTER TABLE TEST_TABLE ADD COLUMNS (

field8  INT COMMENT  '字段8'

,field9  INT COMMENT  '字段9'

,field10  STRING COMMENT  '字段10'

);


八、删除字段:

--ALTER TABLE [表名] REPLACE COLUMNS ([字段名] [字段类型])

ALTER TABLE TEST_TABLE_NO REPLACE COLUMNS(Field1 STRING, Field2 STRING)--删除字段(使用新schema替换原有的)

ALTER TABLE TEST_TABLE_NO REPLACE COLUMNS(Field1 STRING, Field2 STRING, Field3 DECIMAL(18,7), Field4 INT, Field5 DATE, Field6 SMALLINT); --原有Field3~Field6数据又会补充回来

ALTER TABLE TEST_TABLE REPLACE COLUMNS(Field1 STRING, Field2 STRING, Field3 DECIMAL(18,7), Field4 INT, Field5 DATE, Field6 SMALLINT);

 

九、重命名表:

--ALTER TABLE [原表名] RENAME TO [新表名]

ALTER TABLE TEST_TABLE RENAME TO TEST_TABLE2;

 

拓展:

Hive中支持的分区类型有两种:

•静态分区(static partition

•动态分区(dynamic partition

两者的区别:

主要在于静态分区需要手动指定,而动态分区是基于查询参数的位置去推断分区的名称,从而建立分区。

总的来说就是,静态分区的列是在编译时期通过用户传递来决定的;动态分区只有在SQL执行时才能确定。


文章转载自楼的日常跋涉,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论