cdp hive3.1表为事务表和外部表的问题

本文详细介绍了CDP中Hive3的表类型,包括内部表、外部表和事务表的创建及配置。重点讨论了`hive.create.as.acid`、`hive.create.as.insert.only`和`hive.strict.managed.tables`等参数对表行为的影响,以及如何创建CRUD支持的事务表和INSERT-only事务表。同时提到了在Impala中查询Hive事务表时遇到的问题及解决策略。

参考文章

Apache Hive 3 tablesTable type definitions and a diagram of the relationship of table types to ACID properties clarifies Hive tables. The location of a table depends on the table type. You might choose a table type based on its supported storage format.https://docs.cloudera.com/cdp-private-cloud-base/latest/using-hiveql/topics/hive_hive_3_tables.htmlCDP中的Hive3系列之Hive3使用指南-阿里云开发者社区https://developer.aliyun.com/article/786518

注意 我的cdp配置

这个外表路径我修改过 最初好像是/warehoue/tablespace/external/hive 

注意3.1的hive有如下默认参数

 <property>
    <name>hive.default.fileformat</name>
    <value>TextFile</value>
    <description>
      Expects one of [textfile, sequencefile, rcfile, orc, parquet].
      Default file format for CREATE TABLE statement. Users can explicitly override it by CREATE TABLE ... STORED AS [FORMAT]
    </description>
  </property>
  <property>
    <name>hive.default.fileformat.managed</name>
    <value>none</value>
    <description>
      Expects one of [none, textfile, sequencefile, rcfile, orc, parquet].
      Default file format for CREATE TABLE statement applied to managed tables only. External tables will be 
      created with format specified by hive.default.fileformat. Leaving this null will result in using hive.default.fileformat 
      for all tables.
    </description>
  </property>

 上面两个参数是外部表和内部表默认的存储格式。

<property>
    <name>hive.create.as.external.legacy</name>
    <value>false</value>
    <description>When this flag set to true. it will ignore hive.create.as.acid and hive.create.as.insert.only,create external purge table by default.</description>
  </property>
  <property>
    <name>hive.create.as.acid</name>
    <value>false</value>
    <description>
      Whether the eligible tables should be created as full ACID by default. Does 
      not apply to external tables, the ones using storage handlers, etc.
    </description>
  </property>
  <property>
    <name>hive.create.as.insert.only</name>
    <value>false</value>
    <description>
      Whether the eligible tables should be created as ACID insert-only by default. Does 
      not apply to external tables, the ones using storage handlers, etc.
    </description>
  </property>
 <property>
    <name>hive.strict.managed.tables</name>
    <value>false</value>
    <description>Whether strict managed tables mode is enabled. With this mode enabled, only transactional tables (both full and insert-only) are allowed to be created as managed tables</description>

注意如图 上述参数 

set hive.create.as.insert.only; --事务表只支持插入

set hive.create.as.acid; --事务表支持crud 支持delete update 默认true

-- 该参数为false 那么默认你创建的表是只支持insert。(即使存储格式为orc)

--该参数为true,默认创建的事务表为支持curd,如果指定格式非orc则只支持insert

set hive.strict.managed.tables; --是否为严格内部表模式 --默认false

-- 这个参数是真的难搞。原文翻译也不难,说的是

-- 该参数=true 只有事务表会变成内部表。

--该参数=false??解释又不说了。所有表都可以是内部表?

set hive.create.as.external.legacy;--是否采用建表默认为外表方式 默认false。

--这个参数=true 就等于set hive.create.as.acid=false + set hive.create.as.insert.only=false

1.创建crud的事务表

create table cc1(id int );

内部表+事务表crud+存储格式orc

2.创建insert-only的事务表

几种办法

1.CREATE TABLE T2(a int, b int)  STORED AS ORC  TBLPROPERTIES ('transactional'='true',
  'transactional_properties'='insert_only');--建表的时候指定事务属性

 2.CREATE TABLE T2(a int, b int) stored as textfile; --指定存储格式为非orc

3.set hive.create.as.acid=false; CREATE TABLE T2(a int, b int); --指定默认事务表为insert-only

3.创建一个外表

两种办法

1.create external table cc(a int ,b int )

这个外部表和hive1 hive2 的外部表基本一样 

2.

set hive.create.as.insert.only=false;

set hive.create.as.acid=false;

 create table cc_1(a int ,b int );

 

注意这里 创建的是外部表  存储格式为orc(这里我也没想明白。。按道理应该是text的)

注意这个参数external.table.purge='TRUE'这个的意思是drop external table的时候 也会删除外部表指向的数据。

看到这里大家可能有点懵了。

1.我就想创建一个非事务内部表可以吗?

不可以直接创建。 但是你可以create external table cc(a int ,b int );

alter table cc set TBLPROPERTIES ('EXTERNAL'='FALSE');

 无external 也无 transcational。

上面这种方式很麻烦。那么

set hive.create.as.insert.only=false;

set hive.create.as.acid=false;

然后create table cc(a int ,b int ); 这样除了他是个外部表,但是实际和我们hive2.x建的内部表功能也一样。同时这个表也能被spark访问。。

--------------------------说个在cdp 中impala查询hive表的错误---------------------------------

select * from hive_table_on_impala

SQL 错误 [500051] [HY000]: [Cloudera][ImpalaJDBCDriver](500051) ERROR processing query/statement. Error Code: 0, SQL state: TStatus(statusCode:ERROR_STATUS, sqlState:HY000, errorMessage:AnalysisException: Table dwiadata.ia_fdw_b_profile_important_related_person_it not supported. Transactional (ACID) tables are only supported when they are configured as insert_only.

报错很明显 和事务表有关 又说了只支持当配置为insert_only的时候

查看原表 'transactional'='true',

尝试将事务表改为普通表

alter table dwiadata.ia_fdw_b_profile_important_related_person_it set tblproperties ('transactional_properties'='insert_only');

报错

[08S01][40013] Error while compiling statement: FAILED: Execution Error, return code 40013 from org.apache.hadoop.hive.ql.ddl.DDLTask. Unable to alter table. TBLPROPERTIES with 'transactional_properties' cannot be altered after the table is created 

只能重建表了。

 set hive.create.as.acid=false;

create table  xxx

<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&#39;新的中文注释&#39;;```注意:在修改分区字段时,我们需要指定列名两次(这是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&#39;新的中文注释&#39;;```方法二:如果出现乱码,首先确保元数据库的字符集设置正确,然后使用方法一修改;如果已经乱码,可能需要修复元数据库并重新设置注释。注意:在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 &#39;新的中文注释&#39;; ``` **示例**: ```sql -- 假设名为 sales_data,分区字段为 region,需修改注释 ALTER TABLE sales_data CHANGE region region STRING COMMENT &#39;销售区域&#39;; ``` 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 &#39;%乱码字符%&#39;; ``` --- ### **注意事项** 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 元数据中文存储的字符集配置要求
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值