接到客户方需求,提供了一份2.7G的CSV文件,要求去更新数据库。
第一回合,刚拿到数据的时候,第一想法是直接更新这么多数据肯定不合理的,而且性能非常差,搞不好就卡死数据库。所以想到的是对改数据进行拆分,然后问题来了,由于数据量太大,Excel、txt、Notepad++都无法打开,开始各种查资料,找到了Sublime、和Power BI可以打开,然后开始没千万数据去拆分,后面省略万字。。。。。其中辛苦只有试过的人才懂,然后直接放弃了。
第二回合,写python脚本,听说这个很强大,由于没怎么接触过python脚本,写了个脚本尝试了下,一样的道理读取小文件还行,太大的话直接卡死,原谅我对python脚本理解不深,python大神看到请见谅。然后放弃了。。。。。
第三回合,写java脚本,我可是靠这个吃饭的,同事推荐了commons-io,这个确实强大啊,LineIterator流读取,细节就不说了,肯定有很多逻辑问题的,下面直接贴脚本。
哈哈哈,前面两回合只是自己想吐槽下自己,亲测12分钟解决,千万记住导数据是不能加索引。
public Result insert() {
Long start = System.currentTimeMillis();
StringBuilder sb = new StringBuilder("insert into tb_id_info(customer_id,member_id) values ");
StringBuilder sb1 = new StringBuilder();
Connection con = null;
Statement st = null;
try{
LineIterator it = FileUtils.lineIterator(new File(file), "UTF-8");
con = new DBUtil("db").openConnection();
st = con.createStatement();
int count = 0;
while(it.hasNext()) {
String line = it.nextLine();
count++;
String[] split = line.replaceAll("\"", "").split(",");
sb1.append("('"+split[0]+"','"+ split[1] + "')");
if (count % 10000 != 0){
sb1.append(",");
}
if(count % 10000 == 0) {
System.out.println("插入数量:" + count);
String sql = sb.toString() + sb1.toString();
st.executeUpdate(sql);
sb1 = new StringBuilder();
}
}
String sql = sb.toString() + sb1.deleteCharAt(sb1.length() - 1).toString();
st.executeUpdate(sql);
}catch (Exception e){
e.printStackTrace();
}finally {
try {
con.close();
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
Long end = System.currentTimeMillis();
return new ResultUtil<>().setSuccessMsg("执行结束,共耗时:" + (end - start) / 1000 + "秒");
}
数据虽然是导入成功了,但是最终没有解决问题,还有根据id去更新原表数据啊,再接再厉吧!