目录

hive建表

内部分区表

外部分区表

表结构复制:

hive表删除

hive表重命名

表修改操作

增加分区

修改分区

删除分区

新增表字段 


hive建表

IF NOT EXISTS : 表不存在才会创建

 分隔符:field.delim是表的两个列字段之间的文件中的字段分隔符.

               serialization.format是文件序列化时表中两个列字段之间的文件中的字段分隔符.

分区partition:创建表时可指定分区字段,多个分区字段之间可用“,”分割。

如:PARTITIONED BY ( 
  `hp_settle_dt` string,trans_label string)

内部分区表

CREATE TABLE IF NOT EXISTS `tbl_usr_bind_card_count`(
  `usr_id` string, 
  `trans_flow` string, 
  `trans_time` string, 
  `phone` string, 
  `cert_id` string, 
  `card_no` string)
PARTITIONED BY ( 
  `hp_settle_dt` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
WITH SERDEPROPERTIES ( 
  'field.delim'='\;', 
  'serialization.format'='\;') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  '/user/bdhysfas/data/tmp/tbl_usr_bind_card_count';

路径:创建内部表时可指定路径,若路径不存在建表时会自动创该路径。不指定路径时会存放默认路径。
 

外部分区表

CREATE EXTERNAL TABLE IF NOT EXISTS `tbl_usr_bind_card_count`(
  `usr_id` string, 
  `trans_flow` string, 
  `trans_time` string, 
  `phone` string, 
  `cert_id` string, 
  `card_no` string)
PARTITIONED BY ( 
  `hp_settle_dt` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
WITH SERDEPROPERTIES ( 
  'field.delim'='\;', 
  'serialization.format'='\;') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  '/user/bdhysfas/data/tmp/tbl_usr_bind_card_count';

关键字EXTENAL告诉hive这张表是外部的。

路径:创建外部表时可指定路径,表创建时不会自动生成指定路径,所以要先创建路径再创建表。不指定路径时会存放默认路径。

因为表是外部的,所以hive并非认为完全拥有这份数据。因此删除表并不会删除掉这份数据,但是描述表的元数据信息会被删掉。

表结构复制:

CREATE EXTERNAL TABLE IF NOT EXISTS tbl_usr_bind_card_count1 
LIKE tbl_usr_bind_card_count
LOCATION '/user/bdhysfas/data/tmp/tbl_usr_bind_card_count1';

注:如果省略掉关键字EXTERNAL而且源表是外部表的话,那么生成的新表也将是外部表,如果源表是内部表,那么生成的表将是内部表。如果语句中包含EXTERNAL,即便源表是内部表,新创建的表也会是外部表。

hive表删除

DROP TABLE tbl_usr_bind_card_count;

hive表重命名

-- 将表tbl_usr_bind_card_count重命名为tbl_usr_bind_card_count2

ALTER TABLE tbl_usr_bind_card_count RENAME TO tbl_usr_bind_card_count2;

表修改操作

增加分区

-- 添加分区

ALTER TABLE tbl_usr_bind_card_count ADD IF NOT EXISTS

PARTITION(hp_settle_dt = 20220301);

-- 添加分区并指定路径

ALTER TABLE tbl_usr_bind_card_count ADD IF NOT EXISTS

PARTITION(hp_settle_dt = 20220301) LOCATION  '/user/bdhysfas/data/tmp/tbl_usr_bind_card_count/hp_settle_dt=20220301';

修改分区

ALTER TABLE tbl_usr_bind_card_count PARTITION(hp_settle_dt=20220301) 

SET LOCALTION  '/user/bdhysfas/data/tbl_usr_bind_card_count/hp_settle_dt=20220301';

删除分区

ALTER TABLE tbl_usr_bind_card_count  DROP PARTITION(hp_settle_dt=20220301);

新增表字段 

方案1:

ALTER TABLE tbl_oper_in_flow add columns(less_recovery double,remark1 string,remark2 string,remark3 string); 

对于旧的分区的可正常查询,新加的字段值为空。但是旧的分区的数据无法插入或更新,新的分区可正产插入和查询。

方案2:

ALTER TABLE  tbl_oper_in_flow add columns(less_recovery double,remark1 string,remark2 string,remark3 string CASCADE) ; 

可加工旧的分区的历史数据,使所以分区的数据可正常查询和插入,但可能加载时间过长。

方案3:

此方案只适用于外部分区表

删除原表,重新创建新表,执行原表数据路径。但分区信息需重新加载。

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐