先上解决方案 中文变成问号?是因为原表信息为varchar,改成string就ok,直接select的话他的结果集也是临时用varchar模型存的,所以展示效果也是问号。 如果是insert overwrite table xxx select …这种形式,可以在select 语句中把原表涉及中文的字段利用cast关键字转成string 例如
insert overwrite table test
select
a.id
b.name
from
(select id from a) a
left join
(select id,cast(name as string) from b) b
on a.id = b.id
原因 hive源码org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl类中对每一列进行写入的
nextValue(ColumnVector vector, int row,TypeDescription schema,Object previous)
方法
if (vector.isRepeating) {
row = 0;
}
if (vector.noNulls || !vector.isNull[row]) {
HiveCharWritable result;
if(previous==null||previous.getClass()!=HiveCharWritable.class) {
result = new HiveCharWritable();
} else {
result = (HiveCharWritable) previous;
}
BytesColumnVector bytes = (BytesColumnVector) vector;
result.set(bytes.toString(row), size);
return result;
} else {
return null;
}
上面调用了BytesColumnVector 这个类的toString我们再点进去发现,是new的string并没有指定字符集
所以我上面提到使用string来作为列类型而非varchar,因为string在处理数据时默认使用utf-8进行编码
|