一、需求
需要从生产环境ck数据库导数据到mysql,数据量大约100w条记录。
二、处理步骤
1、这里的关键词是生产库,第二就是100w条记录。所以处理数据的时候就要遵守一定的规范。首先将原数据库表进行备份,或者将需要导出的数据建一张新的表了来操作,切记不能在原数据表上进行操作,因为如果操作有误,恢复就很麻烦了,或者直接造成生产事故。
2、100W条记录,那么我们直接通过SQL语句导出来,再导到mysql,显然不现实。第一sql语法不一样,第二数据量太大,导出来的SQL文件打不开。
三、实现
1、ck中创建一个新的临时表,存储需要导出的数据
CREATE TABLE data_dwd.data_user_import_cdj_1113
(
phone Nullable(String) ,
one_id String ,
reg_time_platform Nullable(String) ,
level_no Nullable(String) ,
employee_id_mall Nullable(String) ,
reg_time_travel Nullable(String) ,
activate_status_travel Nullable(String) ,
activate_date_travel Nullable(String) ,
platform_reg_travel Nullable(String) ,
level_name_travel Nullable(String) ,
available_integral Nullable(String) ,
isaccpmak Nullable(String) ,
reg_time_hotel Nullable(String) ,
platform_reg_hotel Nullable(String) ,
level_name_hotel Nullable(String) ,
x_mph_kctp Nullable(String) ,
reg_time_invest Nullable(String) ,
platform_reg_invest Nullable(String) ,
level_name_invest Nullable(String)
)
ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/data_user_import_cdj_1113',
'{replica}')
ORDER BY (
one_id)
SETTINGS index_granularity = 8192
2、将需要导出的数据,插入到临时表
--将数据写入中间表
insert into data_dwd.data_user_import_cdj_1113 select
phone ,
one_id ,
reg_time_platform ,
level_no ,
employee_id_mall ,
reg_time_travel ,
activate_status_travel ,
activate_date_travel ,
platform_reg_travel ,
level_name_travel ,
available_integral ,
isaccpmak ,
reg_time_hotel ,
platform_reg_hotel ,
level_name_hotel ,
x_mph_kctp ,
reg_time_invest ,
platform_reg_invest ,
level_name_invest
from data_user_import where phone is not null;
这里处理的关键信息,是获取需要的数据和字段就行了。原因,原始表一共有400多个字段,实际需要的就20几个,所以这里建的临时表没必要和原始表的表结构一样。
3、创建mysql表,表结构应对应上ck表
--创建mysql表
CREATE TABLE data_user_import_cdj
(
phone varchar(255) ,
one_id varchar(255) ,
reg_time_platform varchar(255) ,
level_no varchar(255) ,
employee_id_mall varchar(255) ,
reg_time_travel varchar(255) ,
activate_status_travel varchar(255) ,
activate_date_travel varchar(255) ,
platform_reg_travel varchar(255) ,
level_name_travel varchar(255) ,
available_integral varchar(255) ,
isaccpmak varchar(255) ,
reg_time_hotel varchar(255) ,
platform_reg_hotel varchar(255) ,
level_name_hotel varchar(255) ,
x_mph_kctp varchar(255) ,
reg_time_invest varchar(255) ,
platform_reg_invest varchar(255) ,
level_name_invest varchar(255)
)
4、将临时表数据导入到mysql数据表
这时可以通过工具导
这个步骤一般比较慢的,但是导100w的数据应该没什么问题
5、数据导到mysql数据库,就可以在mysql数据库对数据进行加工。
这里同样的要对数据加工前,最好使用一张新的表来存储数据加工,而不是直接在原来的表上加工,以防加工错误,数据无法恢复,又需要重新导数据。
比如:从数据中选出10W条处理出来
create table tmp_data_user_import_zlt_10W as select * from data_user_import_cdj where reg_time_platform is not null limit 100000;
create table tmp_data_user_import_zlt_10W as select * from data_user_import_cdj where reg_time_platform is not null limit 100000;
应创建新的表来存储,而不是在原表上进行操作。
实际开发中,处理完的数据,可能还要导到其他数据库,会涉及到存储过程或者定时任务的一些编写。