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

简介: 本文将介绍如何通过编写代码的方式,将导入数据到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和多线程导入,能够加快性能。

相关文章
led点阵---显示数字或汉字(内含代码+注释+图片)
led点阵---显示数字或汉字(内含代码+注释+图片)
1221 0
led点阵---显示数字或汉字(内含代码+注释+图片)
|
Python
tinytag-用于读取MP3,OGG,FLAC和Wave文件的音乐元数据的python库
tinytag是一个python库,用于使用python读取MP3,OGG,OPUS,MP4,M4A,FLAC,WMA和Wave文件的音乐元数据。特征: - 读取音频文件的标签,长度和封面图像 - 支持的格式:(MP3 (ID3 v1, v1.1, v2.2, v2.3+)、Wave/RIFF、OGG、OPUS、FLAC、WMA、MP4/M4A/M4B) - 纯python,无依赖 - 支持python 2.7和3.4或更高版本 - 高测试覆盖率 - 仅几百行代码(只需将其包含在您的项目中即可!)
2324 0
tinytag-用于读取MP3,OGG,FLAC和Wave文件的音乐元数据的python库
|
机器学习/深度学习 人工智能 安全
超长序列,超快预测!深势科技联手阿里云,AI蛋白质预测再下一城
强强联合,突破 AI 蛋白质预测模型推理性能瓶颈,支持最高 6.6k 长氨基酸序列蛋白质的预测计算,达到目前已知最优推理效果。
超长序列,超快预测!深势科技联手阿里云,AI蛋白质预测再下一城
|
机器学习/深度学习 固态存储 算法
【论文泛读】 YOLO v3:An Incremental Improvement
【论文泛读】 YOLO v3:An Incremental Improvement
【论文泛读】 YOLO v3:An Incremental Improvement
|
Web App开发 弹性计算 负载均衡
阿里云acp考试时间、内容?阿里云ACP认证考试有什么经验?
相信大部分朋友都参加过各种考试吧,或者说以后工作可能会用到的各种含金量高的证件。那么阿里云acp考试时间、内容?阿里云ACP认证考试有什么经验?认证大使小编带大家了解一下几个问题。
1633 0
阿里云acp考试时间、内容?阿里云ACP认证考试有什么经验?
|
云安全 边缘计算 监控
|
Web App开发 安全 应用服务中间件
针对Chrome 80和 Chrome 91对Cookie SameSite限制的解决方案
针对Chrome 80和 Chrome 91对Cookie SameSite限制的解决方案
1370 0
针对Chrome 80和 Chrome 91对Cookie SameSite限制的解决方案
|
Web App开发 缓存 前端开发
前端获取微信头像 base64 数据的踩坑实践
应用场景 前端生成一张图片, 一般是基于页面的内容(DOM)生成一张用于分享的海报形式的图片(例如通过 html2canvas)。不过当分享的图片要包含微信用户的头像时(图片位于 thirdwx.qlogo.cn 域名,没有转存到自己的域名下),微信用户的头像图片相当于页面是跨域的。我们如何解决此场景下获取微信头像的问题。
|
传感器 算法 ice
Google Earth Engine ——LANDSAT/LT04/C02/T1系列数据介绍!
Google Earth Engine ——LANDSAT/LT04/C02/T1系列数据介绍!
718 0
Google Earth Engine ——LANDSAT/LT04/C02/T1系列数据介绍!
|
Web App开发 编解码 缓存
2020双十一,阿里云GRTN拉开直播和RTC技术下半场的序幕
直播,已经成为了“剁手党”们最喜闻乐见的一种购物形式。对直播体验的极致追求,也是淘宝技术人们长期的努力方向。为了提升用户购物体验,让直播更加丝滑,让剁手更快一些,在2020双十一期间,淘宝首次启用了阿里云CDN的GRTN全球实时传输网络。数据显示,和传统的HTTPFLV/RTMP方式相比,在启用了GRTN后,直播端到端的延时降低了83%。那么,GRTN到底是什么?其背后究竟隐藏了哪些核心技术?
10928 0
2020双十一,阿里云GRTN拉开直播和RTC技术下半场的序幕