hive中修改表、分区、列

本文介绍了Hive中表和分区的各种管理操作,包括重命名、修改属性、更改文件格式等,以及如何进行分区的增删改查。

修改表的语句允许改变现有表的结构,通过该语句可以增加列/分区,修改SerDe,增加表和SerDe的属性或者重命名表。与之类似,修改分区的语句可以改变指定分区的属性。

重命名表

重命名表的语句如下:

 

ALTER TABLE table_name RENAME TO new_table_name

 

修改表属性

修改表属性的语句如下:

 

ALTER TABLE table_name SET TBLPROPERTIES (property_name = property_value, property_name = property_value,... )

 

使用该语句可以增加表的元数据,last_modified_by, last_modified_time属性自动被添加和管理,可以使用DESCRIBE EXTENDED table_name查询新增的表属性。

修改表注释

要修改表的注释,只需要使用上面介绍的修改表属性语句,将property_name指定为'comment' 属性即可:

 

ALTER TABLE table_name SET TBLPROPERTIES('comment' = new_comment);

 

增加SerDe属性

增加SerDe属性的语句如下:

ALTER TABLE table_name SET SERDE serde_class_name [WITH SERDEPROPERTIES serde_properties]
ALTER TABLE table_name SET SERDEPROPERTIES
(property_name = property_value,property_name = property_value, ... )

该语句允许向SerDe对象增加自定义的元数据。SerDe属性在SerDe被Hive初始化时传递给表的SerDe。

修改表的存储属性

 

ALTER TABLE table_name CLUSTEREDBY (col_name, col_name, ...) [SORTED BY (col_name, ...)] INTO num_buckets BUCKETS

 

该语句改变表的物理存储属性。

需要注意的时,上述修改表的语句仅修改表的Hive的元数据,不会重新组织或者重新格式化现存数据,用户需要确定实际的数据布局符合元数据的定义。

新增分区

新增分区的语句为:

ALTER TABLEtable_name ADD [IF NOT EXISTS] PARTITION partition_spec[LOCATION 'location1'] partition_spec [LOCATION 'location2'] ...
 
partition_spec:
  :(partition_col = partition_col_value, partition_col = partiton_col_value, ...)

特别地,下面的例子将失败且不会报错,无论指定哪个分区,所有的查询都将在分区dt='2008-08-08'上执行:

ALTER TABLE page_view ADD PARTITION (dt='2008-08-08', country='us')
location '/path/to/us/part080808' PARTITION (dt='2008-08-09',country='us') location '/path/to/us/part080809';

假设表不能存在分区而执行新增分区的操作将会提示错误信息:

hive> alter tabletable_properties add partition (address='china');
FAILED:SemanticException table is not partitioned but partition spec exists:{address=china}

这是由于在新建表的时候,并没有创建分区列address,所以只有在存在分区列的表上执行增加分区的操作,才会成功。

重命名分区

重命名分区的语句如下:

ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;
partition_spec:
  :(partition_col = partition_col_value, partition_col = partiton_col_value, ...)

示例代码如下:

hive> showpartitions people;
OK
department=1/sex=0/howold=23
Time taken:0.349 seconds, Fetched: 1 row(s)
hive> altertable people partition(department='1',sex='0',howold=23) rename to partition(department='2',sex='1',howold=24);         
OK
Time taken:2.005 seconds
hive> showpartitions people;
OK
department=2/sex=1/howold=24
Time taken:0.271 seconds, Fetched: 1 row(s)

 

交换分区

交换分区的语句如下:

 

ALTER TABLEtable_name_1 EXCHANGE PARTITION (partition_spec) WITH TABLE table_name_2;

 

该语句允许将一个分区中的数据移动另一个拥有相同schema但没有那个分区的表中。

恢复分区(MSCKREPAIR TABLE)

Hive在元存储中为每个表存储了一个分区列表,然而如果新分区直接添加到HDFS中(使用hadoop fs –put),Hive不会知道这些分区,除非在每个新添加的分区上执行ALTER TABLEtable_name ADD PARTITION命令。为了避免重复执行上述命令,可以使用如下的命令:

 

MSCK REPAIR TABLE table_name;

 

该语句将把存在于HDFS上但不在元存储上的分区添加到元存储中,示例如下:

hive> dfs -mkdir /user/hive/warehouse/learning.db/people/department=1/sex=0/howold=23;
hive> show partitions people;
OK
department=2/sex=1/howold=24
Time taken:0.192 seconds, Fetched: 1 row(s)
hive> msck repair table people;
OK
Partitions notin metastore:     people:department=1/sex=0/howold=23
Repair: Addedpartition to metastore people:department=1/sex=0/howold=23
Time taken:0.943 seconds, Fetched: 2 row(s)
hive> show partitions people;
OK
department=1/sex=0/howold=23
department=2/sex=1/howold=24
Time taken:0.397 seconds, Fetched: 2 row(s)

 

删除分区

删除分区的语句为:

 

ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec,PARTITION partition_spec,...

 

可以使用上述语句删除表的分区,该语句将会删除指定分区的数据和元数据。对于受NO DROP CASCADE的表,可以使用IGNORE PROTECTION删除指定的分区或一组分区,该语句如下:

 

ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec IGNORE PROTECTION;

 

删除分区的例子如下,从该例子可以发现,当删除并不存在的分区时不会提示错误信息。

hive> show partitions people;
OK
department=1/sex=0/howold=23
department=2/sex=1/howold=24
Time taken:0.397 seconds, Fetched: 2 row(s)
hive> alter table people drop partition (department='2',sex='2',howold=24);
OK
Time taken:1.596 seconds
hive> show partitions people;
OK
department=1/sex=0/howold=23
department=2/sex=1/howold=24
Time taken:0.227 seconds, Fetched: 2 row(s)
hive> alter table people drop partition (department='2',sex='1',howold=24);
Dropped the partition department=2/sex=1/howold=24
OK
Time taken:2.267 seconds
hive> show partitions people;                                              
OK
department=1/sex=0/howold=23
Time taken:0.191 seconds, Fetched: 1 row(s)

 

解档/归档分区

ALTER TABLE table_name ARCHIVE PARTITION partition_spec;
ALTER TABLE table_name UNARCHIVE PARTITION partition_spec;

Hive中的归档移动分区中的文件到Hadoop归档中(HAR),该语句只会减少文件的数量,但不提供压缩。

修改表/分区的文件格式

 

ALTER TABLE table_name [PARTITION partitionSpec] SET FILEFORMAT file_format

 

可以使用上述语句修改表或者分区的文件格式,Hive支持的文件格式有:SEQUENCEFILE、TEXTFILE、RCFILE 、ORC和INPUTFORMAT input_format_classnameOUTPUTFORMAT output_format_classname,默认的文件格式为TEXTFILE,由配置参数hive.default.fileformat指定。TEXTFILE指以纯文本文件存储数据,在数据需要压缩时使用SEQUENCEFILE,使用INPUTFORMAT和OUTPUTFORMAT指定输入格式和输出格式的类名,比如'org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextInputFormat'。

修改表/分区的文件位置

 

ALTER TABLE table_name [PARTITIONpartitionSpec] SET LOCATION "newlocation"

 

修改表/分区的Touch

TOUCH读元数据,然后写回。这能够触发前置或者后者hook的执行,假设是存在一个记录表或者分区修改的hook和直接修改HDFS上文件的外部脚本。由于外部脚本在Hive之外修改文件,修改不会被hook所记录,这是外部脚本可以调用TOUCH以触发hook,然后标记上述表或者分区为已修改的。修改表或者分区的TOUCH语句如下:

 

ALTER TABLE table_name TOUCH [PARTITION partitionSpec];

 

修改表/分区的保护

可以在表级或者分区级设置数据保护。启用NO_DROP将保护表或者分区被删除,启用OFFLINE将阻止表或者分区中的数据被查询,但元数据依然可以被访问。如果表中的任何分区启用了NO_DROP,该表也不能被删除。修改表或者分区保护的语句如下:

LTER TABLE table_name [PARTITION partition_spec] ENABLE|DISABLE NO_DROP;
ALTER TABLE table_name [PARTITION partition_spec] ENABLE|DISABLE OFFLINE;

 

演示代码及结果如下:

hive> alter table iis enable no_drop;
OK
Time taken: 0.792seconds
hive> drop tableiis;
FAILED: ExecutionError, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Table iis isprotected from being dropped
hive> alter tableiis enable offline;
OK
Time taken: 0.439seconds
hive> select *from iis;
FAILED:SemanticException [Error 10113]: Query against an offline table or partitionTable iis
hive> alter tablepeople partition (department='1', sex='0', howold=23) enable no_drop;
OK
Time taken: 1.23 seconds
hive> drop table people;
FAILED: ExecutionError, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Table peoplePartitiondepartment=1/sex=0/howold=23 is protected from being dropped

 

修改列名/类型/位置/注释

下面的语句允许修改列名称、列类型、列注释、列位置。该语句仅修改Hive元数据,不会触动表中的数据,用户需要确定实际的数据布局符合元数据的定义。

 

ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENTcol_comment] [FIRST|(AFTER column_name)]

 

示例代码及结果如下:

hive> alter table people change telephone mobile string comment 'change column name' first;
OK
Time taken: 0.66seconds
hive>describe people;                                                                    
OK
mobile                string                   changecolumn name 
name                string                                       
age                   int                                         
birthday                date                                       
address                string                                       
department             string                                       
sex                   string                                       
howold              int                                         
# PartitionInformation          
# col_name                  data_type               comment            
            department              string                                       
sex                   string                                       
howold              int 

 

 增加/替换列

增加或者替换列的语句如下,其中ADD COLUMNS在现有列之后但在分区列之前增加新列,REPLACE COLUMNS先删除现存列,然后再增加新列。替换列只能在表使用自带SerDe(DynamicSerDe,MetadataTypedColumnsetSerDe, LazySimpleSerDe and ColumnarSerDe)时使用。

 

ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type[COMMENT col_comment], ...)

 

REPLACE COLUMNS也可以用于删除列,例如:

hive> alter table test add columns (e int comment 'Add new column e');
OK
Time taken: 0.395seconds
hive> describetest;
OK
a                   int                                         
b                   int                                         
c                   int                                         
e                   int                     Add new column e   
d                   int                                         
             
# PartitionInformation          
# col_name                  data_type               comment            
             
d                   int                                         
Time taken: 0.209seconds, Fetched: 10 row(s)
hive> alter table test replace columns (a1 string, b1 string, c1 string);
OK
Time taken: 0.994seconds
hive> describe test;
OK
a1                  string                                       
b1                  string                                       
c1                  string                                       
d                   int                                         
             
# PartitionInformation          
# col_name                  data_type               comment            
             
d                   int                                         
Time taken: 0.232seconds, Fetched: 9 row(s)

 

需要注意的是该删除仅修改表的schema,但不删除数据。

<think>我们正在处理一个具体的技术问题:如何在CDPHive修改分区分区字段的中文注释。根据引用[2],我们知道在Hive中处理中文乱码是一个常见问题,这通常涉及到修改元数据和配置。而修改注释也可能涉及到类似的问题。注意:Hive的注释信息存储在元数据库(通常是MySQL或PostgreSQL)中,所以修改注释需要操作元数据库。但直接修改元数据库是高风险操作,通常不推荐,因为可能导致元数据不一致。因此,我们应该优先使用Hive的DDL语句来修改注释。在Hive中,可以使用`ALTERTABLE...CHANGECOLUMN...COMMENT`语句来修改的注释。对于分区字段,实际上分区字段也是结构中的,所以理论上可以使用相同的语句。但是,需要注意的是,分区字段在Hive中通常作为虚拟存在,但是它们也被定义在结构的中(在分区键中指定的)。因此,我们可以尝试使用相同的ALTER语句来修改分区字段的注释。然而,我们也要考虑到CDP(ClouderaDataPlatform)的环境,特别是使用了HiveWarehouseConnector(HWC)和Kerberos认证(引用[1]提到需要kerberos登录和存储权限)。因此,在操作时,确保已经通过kerberos认证并具有适当的权限。具体步骤建议:1.使用kerberos登录到有Hive客户端的节点。2.运行kinit获取kerberos票据。3.使用beeline或hive命令行连接HiveServer2。4.执行ALTERTABLE语句修改分区字段的注释。语法示例:```sqlALTERTABLEtable_nameCHANGE[COLUMN]column_namecolumn_namecolumn_typeCOMMENT'新的中文注释';```注意:在修改分区字段时,我们需要指定名两次(这是Hive的语法要求),并且要指定正确的类型(与原来相同),因为Hive允许同时修改名和类型,但我们这里只改注释。但是,这里有一个重要问题:修改分区字段的注释是否会影响到历史分区的元数据?实际上,注释是元数据的一部分,修改后对于新分区会使用新的注释,而历史分区的注释可能不会改变(因为历史分区的元数据已经存储)。不过,分区字段是级别的,所以修改后,整个分区字段注释都会更新。历史分区的元数据中并不会单独存储分区字段的注释(因为分区字段是定义的一部分,分区只是根据字段的值来划分的)。所以修改结构中的分区字段注释,应该是全局生效。另外,如果遇到中文乱码问题,需要确保:-Hive元数据库的字符集配置正确(如MySQL的字符集为utf8或utf8mb4)。引用[2]中提到了设置`sql_mode`,但更重要的是字符集。如果元数据库字符集不支持中文,那么即使通过Hive命令修改,中文注释也会变成乱码。-在连接元数据库的配置中指定字符集(例如在Hive的配置文件hive-site.xml中配置连接URL,增加`?useUnicode=true&characterEncoding=UTF-8`等)。因此,在修改注释之前,请确保元数据库和Hive的字符集设置正确,避免出现乱码。如果修改后注释仍然是乱码,则可能需要修复元数据库的字符集配置,并重新设置注释。另外,引用[2]中提到了解决乱码的方法,包括修改元数据库的字符集,以及修复已存在的乱码(通过更新元数据中的)。但是,我们不建议直接修改元数据库,除非你非常清楚自己在做什么。如果必须直接修改,可以按照以下步骤(以MySQL为例):-备份元数据库。-更新元数据(如COLUMNS_V2)的COMMENT字段,将其修改为正确的utf8编码的中文。由于直接操作元数据库有风险,这里不展开。优先使用Hive的DDL语句。总结方法:方法一(推荐):使用HiveDDL语句修改注释```sql--假设名为my_table,分区字段为pt,原来的类型为string,现在只想修改注释ALTERTABLEmy_tableCHANGECOLUMNptptSTRINGCOMMENT'新的中文注释';```方法二:如果出现乱码,首先确保元数据库的字符集设置正确,然后使用方法一修改;如果已经乱码,可能需要修复元数据库并重新设置注释。注意:在CDP环境中,使用HWC时可能需要配置HWC读取选项(引用[1]),但修改元数据通常不需要这些选项,因为DDL语句是通过HiveServer2执行的,而不是通过HWC(HWC主要用于Spark读写Hive)。因此,对于用户的问题,我们给出使用HiveDDL语句修改分区字段注释的方法,并提醒注意字符集设置。相关问题:1.如何在CDPHive修改的字符集配置?2.如何修改Hive元数据库的字符集?3.如何避免Hive中的中文乱码问题?4.如果使用HiveDDL修改注释后,在Spark中查看注释没有变化,可能是什么原因?</think> 在 CDP Hive修改分区分区字段的中文注释,需通过元数据操作实现。以下是具体步骤和注意事项: --- ### **步骤说明** 1. **修改分区字段注释语法** 使用 `ALTER TABLE` 修改虚拟分区字段)的注释: ```sql ALTER TABLE 名 CHANGE [COLUMN] 分区字段名 分区字段名 数据类型 COMMENT '新的中文注释'; ``` **示例**: ```sql -- 假设名为 sales_data,分区字段为 region,需修改注释 ALTER TABLE sales_data CHANGE region region STRING COMMENT '销售区域'; ``` 2. **修复中文乱码问题(重要)** 如果出现乱码(参考引用[2]),需确保: - **元数据库(如 MySQL)字符集为 UTF-8** 检查并修改 Hive 元数据库的字符集配置: ```sql ALTER DATABASE metastore CHARACTER SET utf8 COLLATE utf8_general_ci; ``` - **更新已存在的乱码注释** 通过修改元数据 `COLUMNS_V2` 修复历史数据: ```sql UPDATE COLUMNS_V2 SET COMMENT = CONVERT(CONVERT(COMMENT USING latin1) USING utf8) WHERE COMMENT LIKE '%乱码字符%'; ``` --- ### **注意事项** 1. **权限与认证** - Kerberos 认证必须激活(引用[1]),且用户需有 `ALTER TABLE` 权限及目标存储路径的写权限。 - CDP 环境中需通过 `kinit` 获取票据后操作。 2. **元数据兼容性** - 在 CDP Hive 3 中,分区字段作为虚拟(`VIRTUAL_COLUMNS`)存储在元数据库,需确保元存储配置正确[^1]。 3. **字符集统一** - 所有涉及组件(Hive CLI、beeline、元数据库)需统一为 UTF-8,否则注释可能显示异常[^2]。 --- ### **验证方法** ```sql DESCRIBE EXTENDED 名 PARTITION (分区字段=值); ``` 检查输出中的 `partition_comment` 或虚拟注释是否更新为正确中文。 --- **相关问题** 1. 如何检测和修复 CDP Hive 中的元数据乱码问题? 2. 使用 Kerberos 时如何授权用户修改 Hive 结构? 3. CDP Hive 3 的虚拟管理与传统分区字段有何区别? 4. 修改分区注释后如何同步到 Impala 引擎? [^1]: CDP Hive Metastore 的虚拟管理机制 [^2]: Hive 元数据中文存储的字符集配置要求
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值