聊聊关于hive“中文乱码”问题
项目场景
我是基于docker搭建的大数据集群,用的是rockylinux8作为基础镜像。目前是在做迁移数据的工作,我们有一些csv数据,然后要放到hive里面去管理。
问题描述
本来呢我觉得挺简单的不就是把csv导入到hive中吗,我就欻欻欻写了一个脚本,把所有的csv数据上传到hdfs上了,然后我就在hive中建表,把表映射到hdfs路径,这不就完事了。当我做完以后,我写一了一个非常简单的查询,发现查询结果为0,然后我看有数据呀,不应该是这个结果,我就去看我的条件,然后看这个数据,妈呀中文全是乱码,然后我又发现这些数据加载进来每个数据都带有双引号,瞬间人麻了。然后我就开始解决,先解决的是数据带双引号的问题,然后解决的中文乱码。
解决数据携带双引号
使用load命令将csv文件加载到Hive表后,数据都带有双引号,因为Hive在加载数据时,将双引号视为字段值的一部分,没有自动识别过滤掉它们。
核心原因在于Hive默认的序列化/反序列化工具(LazySimpleSerDe)并不自动处理字段引号。严格按照您指定的分隔符(我这里是逗号)来拆分字段,并将所有字符(包括引号)都视为字段内容。
使用OpencCSVSerde解决:
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES ("separatorChar" = ",", -- 指定分隔符为逗号"quoteChar" = "\"" -- 指定引号字符为双引号
)
STORED AS TEXTFILE;
解决数据中文乱码
对于hive中可能导致中文乱码的原因有很多种,简单说一说我自己知道的
- 如果hive的元数据库在mysql存放,那么元数据库要设置支持中文
alter table metastore.COLUMNS_V2
