【笔记】用户指南—数据导入和导出—使用程序进行数据导入

简介: 本文将介绍如何通过编写代码的方式,将导入数据到PolarDB-X中。

假设有一操作表:


CREATE TABLE `test1` (
    `id` int(11) NOT NULL,
    `k` int(11) NOT NULL DEFAULT '0',
    `c` char(120) NOT NULL DEFAULT '',
    `pad` char(60) NOT NULL DEFAULT '',
    PRIMARY KEY (`id`),
    KEY `k_1` (`k`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 dbpartition by hash(`id`);

从数据库中导出源数据

源数据可以用户自行生成,也可以从数据库中导出,在数据库中导出可通过mysql -e命令的方式,PolarDB-X和MySQL都支持该方式,具体方法如下:


mysql -h ip  -P port -u usr -pPassword db_name -N -e "SELECT id,k,c,pad FROM test1;" >/home/data_1000w.txt

## 原始数据以制表符分隔,数据格式:188092293 27267211 59775766593-64673028018-...-09474402685 01705051424-...-54211554755
mysql -h ip -P port -u usr -pPassword db_name -N -e "SELECT id,k,c,pad FROM test1;" | sed 's/\t/,/g' >/home/data_1000w.csv
## csv文件格式以逗号分隔,数据格式:188092293,27267211,59775766593-64673028018-...-09474402685,01705051424-...-54211554755

推荐对字符串进行处理,转变成csv文件格式,方便后续程序读取数据。

在PolarDB-X中创建目标表

源数据不包括建表语句,所以需要手动在PolarDB-X目标数据库上创建表,关于PolarDB-X建表语句的语法请参见CREATE TABLE语句,例如:


CREATE TABLE `test1` (
    `id` int(11) NOT NULL,
    `k` int(11) NOT NULL DEFAULT '0',
    `c` char(120) NOT NULL DEFAULT '',
    `pad` char(60) NOT NULL DEFAULT '',
    PRIMARY KEY (`id`),
    KEY `k_1` (`k`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 dbpartition by hash(`id`);

使用程序导入数据到PolarDB-X

您可以自行编写程序,连接PolarDB-X,然后读取本地数据,通过Batch Insert语句导入PolarDB-X中。

下面是一个简单的JAVA程序示例:


// 需要mysql-connector-java.jar, 详情界面:https://mvnrepository.com/artifact/mysql/mysql-connector-java

// 下载链接:https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.20/mysql-connector-java-8.0.20.jar
// 注:不同版本的mysql-connector-java.jar,可能Class.forName("com.mysql.cj.jdbc.Driver")类路径不同
// 编译 javac LoadData.java
// 运行 java -cp .:mysql-connector-java-8.0.20.jar LoadData
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class LoadData {
public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
File dataFile = new File("/home/data_1000w.csv");
String sql = "insert into test1(id, k, c, pad) values(?, ?, ?, ?)";
int batchSize = 1000;
try (
Connection connection = getConnection("ip", 3306, "db", "usr", "password");
BufferedReader br = new BufferedReader(new FileReader(dataFile))) {
String line;
PreparedStatement st = connection.prepareStatement(sql);
long startTime = System.currentTimeMillis();
int batchCount = 0;
while ((line = br.readLine()) != null) {
String[] data = line.split(",");
st.setInt(1, Integer.valueOf(data[0]));
st.setInt(2, Integer.valueOf(data[1]));
st.setObject(3, data[2]);
st.setObject(4, data[3]);
st.addBatch();
if (++batchCount % batchSize == 0) {
st.executeBatch();
System.out.println(String.format("insert %d records", batchCount));
}
}
if (batchCount % batchSize != 0) {
st.executeBatch();
}
long cost = System.currentTimeMillis() - startTime;
System.out.println(String.format("Take %d second,insert %d records, tps %d", cost/1000, batchCount, batchCount/(cost/1000)));
}
}
/**
* 获取数据库连接
*
* @param host 数据库地址
* @param port 端口
* @param database 数据库名称
* @param username 用户名
* @param password 密码
* @return
* @throws ClassNotFoundException
* @throws SQLException
*/
private static Connection getConnection(String host, int port, String database, String username, String password)
throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = String.format(
"jdbc:mysql://%s:%d/%s?autoReconnect=true&socketTimeout=600000&rewriteBatchedStatements=true", host, port,
database);
Connection con = DriverManager.getConnection(url, username, password);
return con;
}
}

您可以根据实际应用场景编写程序,设置合适的batch size和多线程导入,能够加快性能。

相关文章
|
自然语言处理 Kubernetes 机器人
基于OpenIM 实现聊天机器人功能
基于OpenIM 实现聊天机器人功能
598 0
|
Kubernetes API Docker
(一)零基础小白都能懂的超全Docker入门教程之开篇
(一)零基础小白都能懂的超全Docker入门教程之开篇
|
8月前
|
人工智能 JavaScript Serverless
从零开始开发 MCP Server
本文介绍如何使用Serverless Devs CLI工具从零开发并一键部署MCP Server到阿里云函数计算(FC)。首先通过初始化MCP Server项目,完成本地代码编写,利用Node.js实现一个简单的Hello World工具。接着对代码进行打包,并通过Serverless Devs工具将项目部署至云端。部署完成后,提供三种客户端接入方式:官方Client、其他本地Client及在FC上部署的Client。最后可通过内置大模型的inspector测试部署效果。Serverless Devs简化了开发流程,提升了MCP Server的构建效率。
1512 119
|
运维 Kubernetes 监控
提升运维效率:容器化技术在现代IT基础设施中的应用
本文将探讨容器化技术如何优化企业的IT基础设施,提高部署效率和资源利用率。我们将深入分析容器技术的优势、实现步骤以及在实际运维中的应用场景。通过实例展示,帮助读者更好地理解并应用这一前沿技术,助力企业实现高效运维。
|
机器学习/深度学习 并行计算 算法
《解锁 C++矩阵运算优化秘籍,助力人工智能算法“光速”飞驰》
矩阵运算是人工智能算法的核心,尤其在深度学习中扮演着至关重要的角色。C++以其高效性和对底层硬件的精细控制能力,提供了多种优化策略,包括内存布局优化、高级算法应用、多线程并行计算及SIMD指令集利用,显著提升了矩阵运算的效率与性能。这些优化措施不仅加快了模型训练速度,还提高了实际应用中的响应速度,为人工智能技术的发展注入了强大动力。
203 8
|
数据采集 存储 监控
构建高效爬虫系统:设计思路与案例分析
构建高效爬虫系统涉及关键模块如爬虫引擎、链接存储、内容处理器等,以及用户代理池、IP代理池等反反爬策略。评估项目复杂性考虑数据规模、网站结构、反爬虫机制等因素。案例分析展示了电子商务价格比较爬虫的设计,强调了系统模块化、错误处理和合规性的重要性。爬虫技术需要不断进化以应对复杂网络环境的挑战。
545 1
|
机器学习/深度学习 人工智能 边缘计算
软件测试的未来:自动化与AI的融合
在数字化时代的浪潮中,软件测试作为确保产品质量的关键步骤,正经历着前所未有的变革。随着技术的发展,自动化测试和人工智能(AI)的结合不仅提升了测试的效率和准确性,还极大地扩展了测试的范围和深度。本文将探讨自动化测试的最新趋势、AI如何重塑测试流程,以及未来软件测试可能达到的新高度。
|
监控 安全 网络安全
网络安全中的网络隔离与访问控制技术
【7月更文挑战第5天】网络隔离与访问控制技术是网络安全领域的重要组成部分。通过合理的网络隔离和严格的访问控制策略,可以有效保护网络资产免受未经授权的访问和攻击。随着技术的不断发展,我们需要不断探索和创新,以应对日益复杂的网络安全威胁。
|
机器学习/深度学习 存储 关系型数据库
深入Doris实时数仓:导入本地数据
深入Doris实时数仓:导入本地数据
|
关系型数据库 MySQL 数据处理
一文彻底理解乐观锁与悲观锁
一文彻底理解乐观锁与悲观锁
1396 0