hive 分区值支持中文

本文详细探讨了在Hive中遇到中文分区名插入失败的问题,通过MySQL字符集排查,发现PARTITIONS表使用了latin1字符集导致冲突。解决办法包括修改表字符集至utf8,以及调整关键字段长度。重点在于如何确保字符集兼容性以避免此类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

hive 插入分区时(insert into 或者add partition等操作)分区值是中文的时候,就出现报错。
alter table test add partition(part=“中文”);
hivemetastore报错信息

2021-12-01T15:25:03,474 ERROR [pool-8-thread-134] bonecp.ConnectionHandle: Database access problem. Killing off this connection and all remaining connections in the connection pool. SQL State = HY000
2021-12-01T15:25:03,478 ERROR [pool-8-thread-134] DataNucleus.Transaction: Operation rollback failed on resource: org.datanucleus.store.rdbms.ConnectionFactoryImpl$EmulatedXAResource@6e8aa02d, error code UNKNOWN and transaction: [DataNucleus Transaction, ID=Xid=
2021-12-01T15:25:03,479 ERROR [pool-8-thread-134] metastore.RetryingHMSHandler: Retrying HMSHandler after 2000 ms (attempt 1 of 10) with error: javax.jdo.JDOException: Exception thrown when executing query : SELECT DISTINCT 'org.apache.hadoop.hive.metastore.model.MPartition' AS `NUCLEUS_TYPE`,`A0`.`CREATE_TIME`,`A0`.`LAST_ACCESS_TIME`,`A0`.`PART_NAME`,`A0`.`PART_ID` FROM `PARTITIONS` `A0` LEFT OUTER JOIN `TBLS` `B0` ON `A0`.`TBL_ID` = `B0`.`TBL_ID` LEFT OUTER JOIN `DBS` `C0` ON `B0`.`DB_ID` = `C0`.`DB_ID` WHERE `B0`.`TBL_NAME` = ? AND `C0`.`NAME` = ? AND `A0`.`PART_NAME` = ?

原因定位

怀疑是中英文的问题,但是还是不能确认。进入mysql控制台,执行上面的命令(需要通过开启mysql通用日志获取到上面错误日志中?的内容)
执行后出现这个错误

ERROR 1267 (HY000): Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

这个时候,可以确定是字符集的问题了。
确认一下,果然PARTITIONS表的字符集是latin1,不支持中文

MariaDB [hivemeta]> show create table PARTITIONS;
+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table      | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| PARTITIONS | CREATE TABLE `PARTITIONS` (
  `PART_ID` bigint(20) NOT NULL,
  `CREATE_TIME` int(11) NOT NULL,
  `LAST_ACCESS_TIME` int(11) NOT NULL,
  `PART_NAME` varchar(767) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `SD_ID` bigint(20) DEFAULT NULL,
  `TBL_ID` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`PART_ID`),
  UNIQUE KEY `UNIQUEPARTITION` (`PART_NAME`,`TBL_ID`),
  KEY `PARTITIONS_N49` (`TBL_ID`),
  KEY `PARTITIONS_N50` (`SD_ID`),
  CONSTRAINT `PARTITIONS_FK1` FOREIGN KEY (`TBL_ID`) REFERENCES `TBLS` (`TBL_ID`),
  CONSTRAINT `PARTITIONS_FK2` FOREIGN KEY (`SD_ID`) REFERENCES `SDS` (`SD_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

解决方案

在hive连接的mysql中执行下面命令,更改字符集为utf8

alter table PARTITIONS default character set utf8;
alter table PARTITION_KEY_VALS default character set utf8;
alter table SDS default character set utf8;
field coding
alter table PARTITIONS modify column PART_name varchar(190) character set utf8;
alter table PARTITION_KEY_VALS modify column PART_KEY_VAL varchar(256) character set utf8;
alter table SDS modify column LOCATION varchar(4000) character set utf8;

细节说明

  1. MariaDB [hivemeta]> alter table PARTITIONS modify column PART_NAME varchar(767) CHARACTER SET utf8;
    ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
    原因:PART_NAME是索引建,按照规定最大的长度就是767字节,而设置为utf8字符集之后,就相当于一个utf8字符要占用3个字节,因此就不能直接设置767,设置200就不会报错了。

mysql的日志开启

  1. show variables like ‘general_log’; – 查看日志是否开启

  2. set global general_log=on; – 开启日志功能

  3. show variables like ‘general_log_file’; – 看看日志文件保存位置

<think>好的,用户想寻找关于Hive的实际应用案例或操作指南,特别是实战教程或应用场景。首先,我需要整理Hive常见的应用场景,比如日志分析、数据仓库构建等。然后,结合用户提供的引用内容,看看是否有相关的操作步骤或配置可以引用。 用户提供的引用中,引用[1]提到配置Hive的环境文件,引用[2]涉及查看操作历史,引用[3]是日志配置,引用[4]是推测执行机制。这些可以作为操作指南的一部分,比如在数据清洗或查询优化时调整配置。需要将这些引用自然地融入到回答中,例如在数据清洗步骤中建议配置日志以便追踪,或者在优化查询时启用推测执行。 接下来,思考实际应用案例。比如电商用户行为分析,可以分步骤说明如何创建表、加载数据、进行聚合查询和留存分析。每个步骤需要给出具体的HiveQL示例,并注意使用正确的LaTeX格式,如变量名用$符号包裹。同时,在操作指南部分,可以引用用户提供的配置步骤,如配置hive-env.sh或日志文件,以增强实用性。 还需要生成相关问题,这些问题应该围绕Hive的优化、配置、与其他工具的整合等,帮助用户深入探索。确保问题具体且有针对性,比如性能调优方法或Hive分区表的使用场景。 最后,检查回答是否符合系统级指令:行内公式用$...$,独立公式用$$...$$,正确的中文回答,引用标识正确添加。确保所有技术细节准确,并且引用来源与内容匹配。</think>### Hive 实际应用场景与操作指南 #### 一、Hive 典型应用场景 1. **日志分析** Hive 常用于处理大规模日志数据(如网站点击流、服务器日志)。例如,通过加载日志文件到 Hive 表后,可执行聚合查询统计每日活跃用户数(DAU)或页面访问量(PV)。 ```sql SELECT date, COUNT(DISTINCT user_id) AS dau FROM user_logs GROUP BY date; ``` 2. **数据仓库构建** 在数据仓库中,Hive 支持通过分区表(Partitioned Table)和分桶表(Bucketed Table)优化查询性能。例如按日期分区存储订单数据: ```sql CREATE TABLE orders ( order_id STRING, amount DOUBLE ) PARTITIONED BY (dt STRING); ``` 3. **ETL 数据清洗** 使用 Hive SQL 对原始数据进行清洗,例如过滤无效记录、填充缺失: ```sql INSERT OVERWRITE TABLE cleaned_data SELECT user_id, COALESCE(ip, '0.0.0.0') FROM raw_data WHERE user_id IS NOT NULL; ``` #### 二、Hive 实战操作指南 1. **环境配置与日志管理** - 配置 `hive-env.sh` 文件以设置内存参数(参考引用[1]): ```bash cd /opt/hive-2.3.3/conf cp hive-env.sh.template hive-env.sh vi hive-env.sh # 修改 HADOOP_HEAPSIZE=2048 ``` - 日志文件配置(参考引用[3]): ```bash cp hive-log4j2.properties.template hive-log4j2.properties cp hive-exec-log4j2.properties.template hive-exec-log4j2.properties ``` 2. **查询优化技巧** - **启用推测执行**:避免因个别慢任务拖累整体作业(参考引用[4]): ```sql SET mapreduce.map.speculative=true; SET mapreduce.reduce.speculative=true; ``` - **使用 Tez 引擎**:替换 MapReduce 以加速查询: ```sql SET hive.execution.engine=tez; ``` 3. **实际案例:电商用户行为分析** **步骤 1:创建用户行为表** ```sql CREATE TABLE user_actions ( user_id STRING, action_time TIMESTAMP, page_url STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; ``` **步骤 2:加载数据** ```sql LOAD DATA INPATH '/user/input/actions.log' INTO TABLE user_actions; ``` **步骤 3:统计热门页面** ```sql SELECT page_url, COUNT(*) AS visit_count FROM user_actions GROUP BY page_url ORDER BY visit_count DESC LIMIT 10; ``` **步骤 4:计算用户留存率** ```sql SELECT first_day, COUNT(DISTINCT a.user_id) AS retained_users, COUNT(DISTINCT a.user_id)/COUNT(DISTINCT b.user_id) AS retention_rate FROM ( SELECT user_id, MIN(action_time) AS first_day FROM user_actions GROUP BY user_id ) a JOIN user_actions b ON a.user_id = b.user_id WHERE DATEDIFF(b.action_time, a.first_day) = 7 GROUP BY first_day; ``` #### 三、操作历史追踪(参考引用[2]) 通过查看 `.hivehistory` 文件可回溯执行过的命令: ```bash cat /home/hadoop/.hivehistory ``` --- §§ 1. Hive 如何通过分区表提升查询性能? 2. 如何通过 Hive 实现与 HBase 的数据集成? 3. Hive 在数据倾斜场景下的优化方法有哪些? 4. Hive on Spark 的配置步骤是什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值