作者:刘元强
通过Navicat Premium的Data transfer工具来做数据转换。
测试环境:
从PostgreSQL中导出表的数据,但是不导表结构,表结构通过CM去创建
1.在MySQL中创建Hive元数据库并授权
CREATE DATABASE hive_from_pg DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL ON hive_from_pg.* TO 'hive_from_pg'@'%' IDENTIFIED BY 'password';
2.停止Hive服务,在配置中搜索“database”,修改数据库配置到MySQL库
3.在Hive -> Action中点击“创建 Hive Metastore 数据库表”来创建表结构
4.等待命令执行完成,在MySQL中查看Hive元数据表已存在
5.执行以下SQL,修改表的字段类型
alter table SDS modify column IS_COMPRESSED varchar(5) NOT NULL;
alter table SDS modify column IS_STOREDASSUBDIRECTORIES varchar(5) NOT NULL;
执行之一步的原因是,从PostgreSQL导出的数据字段类型和Hive自动创建的不一样,从PostgreSQL里导出的是varchar(5),Hive自动创建的是bigint(1),直接导入数据会报错。
1.在Navicat 的工具栏选择“Tools -> Data Transfer…”
2.设置源数据库和目标数据库
3.选择页面下方的“Option”,取消勾选“Create tables”,点击OK保存
4.点击Next进入下一步,勾选所有的表
5.点击Next进入下一步,勾选“Continue on error”, 点击Start开始进行转换
6.转换完成,检查转换过程的日志是否有报错
查看转换的日志可以看到有几个报错
[DTF] Data Transfer started
……
[ERR] 47> INSERT INTO `VERSION` (`VER_ID`, `SCHEMA_VERSION`, `VERSION_COMMENT`, `SCHEMA_VERSION_V2`) VALUES (1, '1.1.0', 'Hive release version 1.1.0', '1.1.0-cdh5.16.0')
[ERR] 47> 1062 - Duplicate entry '1' for key 'PRIMARY'
……
[ERR] 51> INSERT INTO `next_compaction_queue_id` (`ncq_next`) VALUES (1)
[ERR] 51> 1146 - Table 'hive_from_pg.next_compaction_queue_id' doesn't exist
……
[ERR] 52> INSERT INTO `next_lock_id` (`nl_next`) VALUES (1)
[ERR] 52> 1146 - Table 'hive_from_pg.next_lock_id' doesn't exist
……
[ERR] 53> INSERT INTO `next_txn_id` (`ntxn_next`) VALUES (1)
[ERR] 53> 1146 - Table 'hive_from_pg.next_txn_id' doesn't exist
……
[DTF] Finished with error
其中VERSION表记录的是Hive的版本信息,本来就有数据,所以会报错,要插入的数据和本来的数据一样,所以不影响。
剩下几张表next_txn_id、next_compaction_queue_id、next_lock_id报错不存在,Hive使用MySQL做元数据库不需要这几张表,也没影响。
7.此时可以对元数据表进行一些检查,比如对比一下行数是否准确。
8.启动Hive服务
9.验证Hive服务是否正常。