由于元数据中的表结构中包含中文,我在抽取到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 &