项目上需要迁移华为云dws的数据到aws的redshift。

华为的dws操作很类似与postgresql,本来说是正常使用psql连接后直接copy导出csv,然后再转移到aws,直接还原就完事了,但是不知道是我们的配置问题还是dws的本身的安全规则,不允许使用copy。

那就只能自己jdbc连接dws导出了,但是又懒得写代码,就选择了阿里的DataX完成这件事情。

DataX使用很方便,使用方法从项目的github上看就行了,主要是配置json有点麻烦,所以写了个简单小工具,用来快速生成json配置。

  1. 先使用mybatis查询dws指定表中的字段名称
/**
 * @author: Shuo Ding
 * @description:
 * @date: 2020/10/20
 */
@Mapper
public interface DBManagementMapper {

    @Select("select column_name from information_schema.columns where table_schema='dbadmin' and table_name=#{table} order by ordinal_position")
    List<String> getColumnName(String table);
}
  1. 在Test下面写个测试代码,跑一下配置,并使用hutool快速生成文件就好
import cn.hutool.core.io.file.FileWriter;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

/**
 * @author: Shuo Ding
 * @description:
 * @date: 2020/10/20
 */
@SpringBootTest
@RunWith(SpringRunner.class)
public class DataX2Json {

    @Autowired
    private DBManagementMapper dbManagementMapper;

    private final String json="按照Github上的实例,将json字符串贴到这里就行了"

    @Test
    public void generateFile(){
        JSONObject jsonObject= JSON.parseObject(json);
        //这里写死了我想导出的几个表的名称,如果全库导出,也可以在mybatis里面写sql直接查所有的表名
        List<String> tableName = List.of("table1",
                "tabl2");

        for (String tbName : tableName) {
            List<String> columnName = dbManagementMapper.getColumnName(tbName);
            JSONObject job = jsonObject.getJSONObject("job");
            JSONArray column = job.getJSONArray("content").getJSONObject(0).getJSONObject("reader").getJSONObject("parameter").getJSONArray("column");
            column.clear();
            column.addAll(columnName);
            JSONArray table = job.getJSONArray("content")
                    .getJSONObject(0).getJSONObject("reader")
                    .getJSONObject("parameter").getJSONArray("connection")
                    .getJSONObject(0).getJSONArray("table");
            table.clear();
            table.addAll(List.of(tbName));
            JSONArray header = job.getJSONArray("content")
                    .getJSONObject(0).getJSONObject("writer")
                    .getJSONObject("parameter").getJSONArray("header");
            header.clear();
            header.addAll(columnName);

            job.getJSONArray("content")
                    .getJSONObject(0).getJSONObject("writer")
                    .getJSONObject("parameter").put("fileName",tbName);


            System.out.println(JSON.toJSONString(jsonObject));
            FileWriter writer = new FileWriter(tbName+".json");
            writer.write(JSON.toJSONString(jsonObject));
        }


        System.out.println(json);
    }

}

虽然代码写的很生硬,也比较硬编码,但是好使就行了,对吧!