使用Spark 编码 写入 hive 的过程中 hive字段乱码 [解决方案]
Posted 辉常努腻
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Spark 编码 写入 hive 的过程中 hive字段乱码 [解决方案]相关的知识,希望对你有一定的参考价值。
由于元数据中的表结构中包含中文,我在抽取到spark过程中已经解决了一次乱码问题,具体显示为问题????,解决方法是在mysql连接上加参数
spark 字段乱码
def readMysql(sparkSession: SparkSession,table: String): DataFrame =
val frame: DataFrame = sparkSession
.read
.format("jdbc")
.option("url", "jdbc:mysql://master:3306/hotel?useSSL=false&characterEncoding=utf8")
.option("dbtable", table)
.option("user", "root")
.option("password", "123456")
.option("driver", "com.mysql.jdbc.Driver").load()
frame
读取mysql成功解决乱码
我经过清洗之后,准备写入到hive中,等我写完后,我以为完活啦,可是没想到等我再次使用数据的时候,个别字段值全是null,我在hive查看过数据之后又看表结构,发现表结构中中文是乱码的,我猜想,这应该就导致了字段值无法插入对应字段的结果,找不到对应的字段了,因为乱码了。
开始了我的网上冲浪,最后因为我是字段乱码,我翻阅了很多不管用的资料。
好啦,把解决方法给阿大家整理了出来啦
hive字段乱码 [解决方案]
登录hive元数据库 mysql
use hive;
修改表字段注释编码和表字段编码
alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
alter table TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
修改分区字段编码
alter table PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
alter table INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
-- 注意选择对应的元数据存储数据库
use hive_db;
-- 修改表字段注释字符集
ALTER TABLE COLUMNS_V2 MODIFY COLUMN `COMMENT` varchar(256) CHARACTER SET utf8;
-- 修改表字段名字符集
ALTER TABLE COLUMNS_V2 MODIFY COLUMN `COLUMN_NAME` varchar(767) CHARACTER SET utf8;
-- 修改表属性Key和Value字符集
ALTER TABLE TABLE_PARAMS MODIFY COLUMN `PARAM_VALUE` varchar(4000) CHARACTER SET utf8;
ALTER TABLE TABLE_PARAMS MODIFY COLUMN `PARAM_KEY` varchar(256) CHARACTER SET utf8;
-- 修改分区属性Key和Value字符集
ALTER TABLE PARTITION_PARAMS MODIFY COLUMN `PARAM_KEY` varchar(256) CHARACTER SET utf8;
ALTER TABLE PARTITION_PARAMS MODIFY COLUMN `PARAM_VALUE` varchar(4000) CHARACTER SET utf8;
-- 修改分区字段Key和Value字符集
ALTER TABLE PARTITION_KEYS MODIFY COLUMN `PKEY_COMMENT` varchar(4000) CHARACTER SET utf8;
ALTER TABLE PARTITION_KEY_VALS MODIFY COLUMN `PART_KEY_VAL` varchar(256) CHARACTER SET utf8;
-- 修改分区的分区名字符集
ALTER TABLE `PARTITIONS` MODIFY COLUMN `PART_NAME` varchar(767) CHARACTER SET utf8;
-- 修改索引属性Key和Value字符集
ALTER TABLE INDEX_PARAMS MODIFY COLUMN `PARAM_KEY` varchar(256) CHARACTER SET utf8;
ALTER TABLE INDEX_PARAMS MODIFY COLUMN `PARAM_VALUE` varchar(4000) CHARACTER SET utf8;
修改hive配置文件
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop-3/hive?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8</value>
</property>
重启hive生效
nohup hive --service metastore &
以上是关于使用Spark 编码 写入 hive 的过程中 hive字段乱码 [解决方案]的主要内容,如果未能解决你的问题,请参考以下文章
将数据写入 Hive Spark SQL 时出现 ArrayIndexOutOfBoundsException 异常
spark利用sparkSQL将数据写入hive两种通用方式实现及比较