问题解决-Hive创建汉字字段表时,报错org.apache.hadoop.hive.ql.exec.DDLTask. MetaException

在CDH6.2.0环境下,使用Hive2.1.1遇到用户需求,需创建含有中文字段名的表。由于Hive元数据存储在MySQL的COLUMNS_V2表中,该表的COLUMN_NAME字段字符集为latin1,导致无法识别中文。通过查询COLUMNS_V2表的字符集信息,发现问题所在,并通过SQL语句`alter table COLUMNS_V2 modify column COLUMN_NAME varchar(128) character set utf8;`将字符集改为utf8,成功解决了建表时的错误。

项目场景:

在大数据集群场景中,需求方(客户)会给你提出很多奇葩问题,让一个大数据职场小白的我为之抓狂,在一顿挠心之后,还得想办法去满足需求方提出的需求


前不久我的需求方就是我们CDH集群的使用方-数据应用开发团队给我出了个难题,说业务部门想要使用汉语字段的表使用,也就是表结构中字段名称必须是汉语,俗话说,中国文化博大精深,汉语最为精髓。

汉语考试:
1.“小明,今晚有思修课,你去不去?”,“我去!我不去!”,问小明到底去不没去?
2.“小明,窗台上落了鸟屎,去擦一下好吗?”,“我擦,我不擦”,问小明到底擦不擦?
不瞎扯了,进入正题
环境描述
CDH6.2.0
Hive2.1.1
MySQL5.7.19
需求,用户想要使用以汉语为字段的表;
例如

姓名年龄性别住址
小明19北京
小红17上海
小李20广州
小王18深圳

问题描述:

我们知道Hive是可以使用中文作为字段名的,使用符号``进行处理就可以实现。以下为创建表的语句:

CREATE EXTERNAL TABLE stu(
`姓名` STRING,
`年龄` INT,
`性别` STRING,
`地址` STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION 'hdfs://hadoop01:9000/dome'

在hive shell中执行以上语句报错信息如下:

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:Add request failed : INSERT INTO `COLUMNS_V2` (`CD_ID`,`COMMENT`,`COLUMN_NAME`,`TYPE_NAME`,`INTEGER_IDX`) VALUES (?,?,?,?,?) )

原因分析:

从报错信息中分析,推断是在执行建表语句时,hive的元数据进行更新时,需要向元数据存储数据库MySQL中插入表结构信息。报错信息中说明:在向MySQL中的表COLUMNS_V2中插入字段名称时出现的问题。
通过命令查看COLUMNS_V2表的字符集信息

show create table COLUMNS_V2\G;

查询表的字符集会发现,COLUMNS_V2表中COLUMN_NAME字段的字符集为默认字符集,latin1字符集,所以中文无法识别,因此需要使用utf8字符集。


解决方案:

分析了一波之后,基本定位到问题的根本原因,对症下药即可。
通过SQL命令将字段字符集修改为utf8

alter table COLUMNS_V2 modify column COLUMN_NAME  varchar(128) character set utf8; 

结语:如若文章有何不妥之处欢迎指正,谢谢!

### Hive 创建遇到 `Execution Error, return code 1` 的解决方案 当尝试创建如果遇到了 `FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask` 错误,这通常意味着DDL操作未能成功完成。此问题可能由多种因素引起。 #### 可能的原因及对应的解决方法: - **元数据异常** 如果错误伴随有类似于 "MetaException(message:You have an error in your SQL syntax)" 这样的提示,则可能是SQL语句存在语法上的问题[^2]。应仔细检查用于定义新表结构的HQL脚本中的每一部分,特别是字段名称、类型以及任何约束条件等是否遵循正确的语法规范。 - **连接失败** 若日志显示有关于网络调用被拒绝的信息,比如 `Call From node01/192.168.126.100 to node01:9000 failed on connection exception... Connection refused` ,则表明客户端无法建立到目标服务端口的有效TCP/IP链接[^4]。此需确认集群内各节点之间的连通性和防火墙设置,并验证NameNode的服务状态及其监听地址配置无误。 - **字符编码冲突** 对某些特定版本而言,在处理非ASCII字符的数据源可能会因为默认使用的UTF-8编码而引发兼容性方面的问题。可以考虑通过更改数据库级别的字符集来规避此类障碍;例如执行命令 `ALTER DATABASE hive CHARACTER SET latin1 COLLATE latin1_bin;` 将其改为更通用的形式之一——latin1[^5]。 - **权限不足** 用户账户缺乏足够的访问权限也可能导致类似的故障现象发生。确保当前登录的身份具有适当的操作许可级别,尤其是在涉及跨目录读写资源的情况下更为重要。 - **其他潜在问题** 此外还有可能存在诸如磁盘空间已满、内存溢出或是第三方插件干扰等情况影响着DDL指令的成功提交。建议全面排查系统环境并参照官方文档进一步定位具体成因所在。 ```sql -- 修改字符集的例子 ALTER DATABASE hive CHARACTER SET latin1; ``` 对于上述提到的各种情况,均应在采取措施前做好充分准备,包括但不限于备份现有数据以防意外丢失,同密切关注变更后的效果反馈以便及调整策略方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值