Hive默认是所有文件都是UTF-8的。
Hive将按照UTF-8编码格式对数据文件进行解析和查询。
如果数据文件不是UTF-8,则需要SerDe支持指定编码格式。对于常用的LazySimpleSerDe是支持指定字符集的。
待导入的数据文件:
/home/test/person.txt //GBK编码文件
张三,18
李四,16
王五,20
建表语句(会有乱码):
create table t_person (
name string,
age int
)
row format delimited fields terminated by ',' stored as textfile;
导入本地数据:
load data local inpath '/home/test/person.txt' into table t_person;
以上情况会出现乱码。
通过以下2种方式可以解决乱码问题:
方法一、建表语句中指定SerDe类和字符集,如下语句为改造后:
create table t_person (
name string,
age int
)
row format serde 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
with serdeproperties('field.delim'=',', 'serialization.encoding'='GBK')
stored as textfile;
需要注意的是:
指定SerDe类后,则不允许使用"delimited fields terminated by",而是要显式通过"field.delim"属性指定分隔符。
方法二、建表后修改字符集:
修改命令如下:
alter table t_person set serdeproperties ('serialization.encoding'='GBK');
以上两种方式仅供参考,可能会因为环境或版本问题效果不一样。