hive创建表时COMMENT带中文报错问题处理

本文解决了Hive在创建表时遇到的中文注释导致的错误问题,通过调整MySQL字符集配置实现支持。
环境:CDH 5.5.1

hive创建表时带有中文就报错,如下:
CREATE TABLE IF NOT EXISTS test(pid bigint COMMENT '测试id',fid int COMMENT 'luntanid')COMMT 'zhuti' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:javax.jdo.JDODataStoreException: Transaction failed to commit
        at org.datanucleus.api.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:451)
        at org.datanucleus.api.jdo.JDOTransaction.rollback(JDOTransaction.java:186)
        at org.apache.hadoop.hive.metastore.ObjectStore.rollbackTransaction(ObjectStore.java:539)
        at org.apache.hadoop.hive.metastore.ObjectStore.createTable(ObjectStore.java:893)
        at sun.reflect.GeneratedMethodAccessor12.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.hadoop.hive.metastore.RawStoreProxy.invoke(RawStoreProxy.java:98)
        at com.sun.proxy.$Proxy10.createTable(Unknown Source)
        at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.create_table_core(HiveMetaStore.java:1411)
        at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.create_table_with_environment_context(HiveMetaStore.java:1444)
        at sun.reflect.GeneratedMethodAccessor11.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.hadoop.hive.metastore.RetryingHMSHandler.invokeInternal(RetryingHMSHandler.java:133)
        at org.apache.hadoop.hive.metastore.RetryingHMSHandler.invoke(RetryingHMSHandler.java:99)
        at com.sun.proxy.$Proxy12.create_table_with_environment_context(Unknown Source)
        at org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$Processor$create_table_with_environment_context.getResult(ThriftHiveMetastore.java:9136)
        at org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$Processor$create_table_with_environment_context.getResult(ThriftHiveMetastore.java:9120)
        at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:39)
        at org.apache.hadoop.hive.metastore.TUGIBasedProcessor$1.run(TUGIBasedProcessor.java:110)
        at org.apache.hadoop.hive.metastore.TUGIBasedProcessor$1.run(TUGIBasedProcessor.java:106)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:415)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1671)
        at org.apache.hadoop.hive.metastore.TUGIBasedProcessor.process(TUGIBasedProcessor.java:118)
        at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:285)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
NestedThrowablesStackTrace:
Exception thrown flushing changes to datastore
org.datanucleus.exceptions.NucleusDataStoreException: Exception thrown flushing changes to datastore

搜索了一圈,都说是将字符集设置为utf8,
mysql
mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

hive-site
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://hadoop01.test:3306/hive?useUnicode=true&amp;characterEncoding=UTF-8</value>
  </property>

都没有问题啊


后来在网上无意中看到以下内容:
"""
默认情况下我们需要将数据库的编码设置为lanin1.
alter database hive character set latin1;

但为了以下是为了支持hive建表时插入中文注释 需要在mysql中做如下设置:

use hive;

//修改字段注释字符集
alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
//修改表注释字符集
alter table TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
//修改分区注释字符集
alter table PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
"""

尝试执行以上4条命令,执行这个命令后就正常了。


mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

数据库字符集变latin1

当时我创建hive库的时候使用如下命令:
create database hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

不知道为什么会这样,但是目前解决的建表中文问题,先这样处理了。

<think>好的,我现在需要回答用户关于在Hive SQL中创建如何为字段或设置中文别名的问题。首先,我得回忆一下Hive的基本语法,尤其是创建定义列别名的方式。 用户提到的是“中文别名”,所以需要确认Hive是否支持中文字段名或别名。通常,Hive中的列名和名可以使用中文,但可能需要特定的配置或者引号来处理。可能需要使用反引号或双引号来包裹中文别名,以避免语法错误。 接下来,我应该参考用户提供的引用内容。引用[3]和[4]讨论了临创建和使用,但并没有直接涉及中文别名。不过,引用[1]中提到了复制结构,其中可能涉及字段名的处理。例如,在创建,字段名如果包含特殊字符或中文,可能需要使用反引号。引用[2]中的例子使用了英文别名,但可以推断出别名定义的方法,比如在SELECT语句中使用AS关键字。 然后,我需要考虑Hive的语法规则。在Hive中,创建定义列名通常不需要特殊处理,但如果列名包含特殊字符或空格,需要使用反引号。对于中文列名,同样适用这个规则。例如,创建可以写成`列名` STRING。或者在SELECT语句中,使用AS后接中文别名,可能需要使用反引号或双引号。 另外,用户可能混淆了字段别名和别名。别名通常在FROM子句中定义,比如SELECT a.name FROM table AS a。而字段别名是在SELECT语句中定义的,比如SELECT name AS 姓名。在创建候,字段名本身可以使用中文,这在CREATE TABLE语句中直接指定即可,可能需要反引号。 需要验证在Hive中是否允许直接使用中文作为列名。根据经验,Hive支持UTF-8编码,所以应该允许使用中文,但可能需要正确的配置,比如设置合适的文件编码和Hive的配置参数。 现在,结合这些信息,用户的问题是如何在创建为字段或设置中文别名。可能的步骤是: 1. 在CREATE TABLE语句中定义列名,使用反引号包裹中文列名。 2. 在查询使用AS关键字为列或指定中文别名,同样可能需要反引号。 例如,创建的语句可能如下: CREATE TABLE example ( `用户ID` INT, `姓名` STRING ); 或者在查询: SELECT user_id AS `用户编号`, name AS `姓名` FROM table; 对于别名,可以在FROM子句中使用AS,例如: SELECT `姓名` FROM table AS `用户`; 需要注意的是,Hive在某些版本或配置下可能对中文支持不够完善,可能需要检查环境配置。此外,使用中文别名可能会在后续查询或与其他系统集成来不便,因此需谨慎考虑。 最后,根据引用中的例子,比如引用[4]中的CTE用法,虽然没有直接使用中文别名,但可以推断出别名定义的结构。因此,在创建或查询,正确使用反引号和AS关键字即可实现中文别名。</think>在Hive SQL中为字段或设置中文别名,可通过以下方式实现: --- ### 1. **字段中文别名** 在`CREATE TABLE`语句中直接定义中文列名,需用**反引号**包裹。示例: ```sql CREATE TABLE employee ( `员工ID` INT COMMENT '唯一标识', `姓名` STRING, `部门` STRING ); ``` 在查询也可通过`AS`指定别名: ```sql SELECT user_id AS `用户编号`, dept AS `所属部门` FROM employee; ``` --- ### 2. **中文别名** 在`FROM`子句中使用`AS`定义别名: ```sql SELECT `姓名` FROM employee AS `员工`; ``` --- ### 3. **注意事项** - **编码配置**:确保Hive元数据存储(如MySQL)和HDFS文件编码支持UTF-8。 - **反引号必要性**:若列名含空格或特殊字符(如中文),必须用反引号包裹,否则可能报错[^1]。 - **兼容性**:部分可视化工具可能对中文别名支持不佳,需测试验证。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值