mysql数据快速导入doris

mysql数据快速导入doris

  • 背景
  • 问题
  • 解决
  • 最后

背景

前段时间业务需要将mysql数据导入到doris ,以便大数据平台使用

问题

本来想法很简单,doris 语法兼容mysql,将数据导出为insert 语句,直接插入就行。
想法不错,但是奈何数据量大(200多w),插入几个钟头还没完事。后来想想,试试批量insert语句。也挺慢。听说csv导入doris挺快的,奈何又遇到分隔符问题,简单说就是没有转义,导致列数不对。难道没有完美方法

解决

办法还是有的,可以将插入sql转换为csv,并转义(分界符),代码如下:

importjava.io.BufferedReader;importjava.io.FileReader;importjava.io.FileWriter;importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;/***简化但可靠的SQL转CSV工具*/publicclassInsertSqlToCSV{publicstaticvoidmain(String[]args)throwsIOException{if(args.length<2){System.out.println("使用方法: java InsertSqlToCSV <输入SQL文件> <输出CSV文件>");return;}convertSqlToCsv(args[0],args[1]);}publicstaticvoidconvertSqlToCsv(StringsqlFile,StringcsvFile)throwsIOException{List<String[]>allData=newArrayList<>();List<String>headers=null;inttotalRows=0;intsuccessRows=0;interrorRows=0;System.out.println("开始处理: "+sqlFile);try(BufferedReaderbr=newBufferedReader(newFileReader(sqlFile));FileWriterfw=newFileWriter(csvFile)){Stringline;intlineNum=0;while((line=br.readLine())!=null){lineNum++;line=line.trim();if(line.toUpperCase().startsWith("INSERT INTO")){totalRows++;try{//提取字段名(只从第一行提取)if(headers==null){headers=extractHeaders(line);System.out.println("提取到 "+headers.size()+" 个字段");}//提取VALUES部分StringvaluesPart=extractValuesPart(line);//解析VALUESList<String>values=parseSimple(valuesPart);//验证列数if(values.size()!=headers.size()){System.out.println("第 "+lineNum+" 行: 期望 "+headers.size()+" 列,实际 "+values.size()+" 列");errorRows++;continue;}allData.add(values.toArray(newString[0]));successRows++;}catch(Exceptione){System.out.println("第 "+lineNum+" 行解析失败: "+e.getMessage());errorRows++;}}}System.out.println("\n处理完成:");System.out.println("总INSERT语句: "+totalRows);System.out.println("成功: "+successRows);System.out.println("失败: "+errorRows);if(successRows==0){System.out.println("没有成功解析的数据!");return;}//写入CSVwriteCsv(fw,headers,allData);System.out.println("CSV文件已生成: "+csvFile);}catch(Exceptione){System.err.println("处理失败: "+e.getMessage());e.printStackTrace();}}/***提取字段名*/privatestaticList<String>extractHeaders(Stringsql){List<String>headers=newArrayList<>();//找到字段列表的开始intstart=sql.indexOf('(');if(start==-1)returnheaders;//找到字段列表的结束intend=sql.indexOf(')',start);if(end==-1)returnheaders;StringheaderPart=sql.substring(start+1,end).trim();//简单分割字段名String[]parts=headerPart.split(",");for(Stringpart:parts){Stringheader=part.trim();//移除引号if(header.startsWith("`")&&header.endsWith("`")){header=header.substring(1,header.length()-1);}elseif(header.startsWith("\"")&&header.endsWith("\"")){header=header.substring(1,header.length()-1);}elseif(header.startsWith("'")&&header.endsWith("'")){header=header.substring(1,header.length()-1);}elseif(header.startsWith("[")&&header.endsWith("]")){header=header.substring(1,header.length()-1);}headers.add(header);}returnheaders;}/***提取VALUES部分*/privatestaticStringextractValuesPart(Stringsql){//找到VALUES关键字intvaluesIndex=sql.toUpperCase().indexOf("VALUES");if(valuesIndex==-1){thrownewIllegalArgumentException("未找到VALUES关键字");}StringafterValues=sql.substring(valuesIndex+"VALUES".length()).trim();//移除末尾分号if(afterValues.endsWith(";")){afterValues=afterValues.substring(0,afterValues.length()-1);}//找到括号内容intopenParen=afterValues.indexOf('(');intcloseParen=afterValues.lastIndexOf(')');if(openParen==-1||closeParen==-1||closeParen<=openParen){thrownewIllegalArgumentException("未找到有效的VALUES括号");}returnafterValues.substring(openParen+1,closeParen).trim();}/***简单但可靠的解析器*/privatestaticList<String>parseSimple(StringvaluesStr){List<String>values=newArrayList<>();StringBuildercurrent=newStringBuilder();booleaninQuotes=false;charquoteChar='\0';for(inti=0;i<valuesStr.length();i++){charc=valuesStr.charAt(i);if(!inQuotes){//不在引号内if(c=='\''||c=='"'){inQuotes=true;quoteChar=c;current.append(c);}elseif(c==','){//字段分隔符Stringvalue=cleanValue(current.toString().trim());values.add(value);current.setLength(0);}else{current.append(c);}}else{//在引号内current.append(c);if(c==quoteChar){//检查是否是转义引号if(i+1<valuesStr.length()&&valuesStr.charAt(i+1)==quoteChar){//是转义引号,跳过下一个current.append(quoteChar);i++;}else{//是结束引号inQuotes=false;}}}}//最后一个值if(current.length()>0){Stringvalue=cleanValue(current.toString().trim());values.add(value);}returnvalues;}/***清理值*/privatestaticStringcleanValue(Stringvalue){value=value.trim();if(value.equalsIgnoreCase("NULL")){return"";}//移除外层引号if((value.startsWith("'")&&value.endsWith("'"))||(value.startsWith("\"")&&value.endsWith("\""))){value=value.substring(1,value.length()-1);//处理转义引号value=value.replace("''","'").replace("\"\"","\"");}returnvalue;}/***写入CSV*/privatestaticvoidwriteCsv(FileWriterwriter,List<String>headers,List<String[]>data)throwsIOException{//写入表头List<String>escapedHeaders=newArrayList<>();for(Stringheader:headers){escapedHeaders.add(escapeCsv(header));}writer.write(String.join(",",escapedHeaders));writer.write("\n");//写入数据for(String[]row:data){List<String>escapedRow=newArrayList<>();for(Stringcell:row){escapedRow.add(escapeCsv(cell));}writer.write(String.join(",",escapedRow));writer.write("\n");}}/***CSV转义*/privatestaticStringescapeCsv(Stringvalue){if(value==null)return"";//if(value.contains(",")||value.contains("\"")||//value.contains("\n")||value.contains("\r")){//value=value.replace("\"","\"\"");//return"\""+value+"\"";//}//移除可能已经存在的外层单引号Stringprocessed=value.trim();booleanhadQuotes=false;if(processed.startsWith("'")&&processed.endsWith("'")&&processed.length()>1){processed=processed.substring(1,processed.length()-1);hadQuotes=true;}//转义处理StringBuilderresult=newStringBuilder();for(inti=0;i<processed.length();i++){charc=processed.charAt(i);if(c=='\\'){//反斜杠转义result.append("\\\\");}elseif(c=='\''){//单引号转义result.append("\\'");}else{result.append(c);}}//如果原始值有引号或者我们需要加引号,就加上if(hadQuotes||!processed.isEmpty()){return"'"+result.toString()+"'";}else{returnresult.toString();}}}

这样处理后,250万行的sql转csv,大概10分钟左右,然后csv导入doris ,几秒就行

最后

如果那位有更好办法,可以联系我:lita2lz

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1150923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用Multisim验证克拉泼振荡电路起振条件的详细过程

从零开始验证克拉泼振荡电路的起振条件&#xff1a;Multisim实战全记录你有没有遇到过这种情况——理论课上老师讲得头头是道&#xff0c;什么“巴克豪森准则”、“相位平衡”、“环路增益大于1”&#xff0c;可真到了自己搭电路&#xff0c;却发现压根不起振&#xff1f;输出一…

快速理解AUTOSAR中BSW与SWC的关系

深入理解AUTOSAR中BSW与SWC的协同机制&#xff1a;从开发痛点到系统设计你有没有遇到过这样的场景&#xff1f;一个原本在A车型上运行良好的发动机控制算法&#xff0c;移植到B车型时却“水土不服”——不是CAN通信收不到数据&#xff0c;就是ADC采样值异常。更糟的是&#xff…

【零基础学java】(等待唤醒机制,线程池补充)

等待唤醒机制生产者和消费者&#xff08;常见方法&#xff09; void wait()当前线程等待&#xff0c;直到被其他线程唤醒 void notify()随机唤醒单个线程 void notifyAll()唤醒所有线程等待唤醒机制的阻塞队列方式实现put数据时&#xff1a;放不进去会等着&#xff0c;叫做阻塞…

自动资源调度AI工具:架构师降低云成本的8个使用技巧

自动资源调度AI工具&#xff1a;架构师降低云成本的8个实战技巧 副标题&#xff1a;从优化策略到落地实践&#xff0c;用AI帮你搞定云资源浪费 摘要/引言 作为云架构师&#xff0c;你是否经常遇到这样的困境&#xff1a; 业务峰值时资源不够用&#xff0c;导致服务延迟甚至宕机…

AI应用架构师如何解决社会学研究模型训练问题?这6款工具帮你

AI应用架构师如何解决社会学研究模型训练问题&#xff1f;这6款工具帮你 1. 引入与连接 1.1 引人入胜的开场 想象一下&#xff0c;你是一位社会学家&#xff0c;试图研究社交媒体对青少年心理健康的影响。你收集了海量的数据&#xff0c;包括青少年在社交媒体上的行为记录、心理…

L298N电机驱动原理图常见问题排查:智能小车专用解析

L298N驱动翻车实录&#xff1a;智能小车电机不转、芯片发烫&#xff1f;一文搞定原理图设计坑点从“嗡嗡响却不走”说起&#xff1a;一个典型的智能小车调试现场上周&#xff0c;有位学生在实验室群里发了一段视频&#xff1a;一辆刚组装好的四轮小车通电后&#xff0c;两个电机…

【零基础学java】(网络编程)

前言什么是网络编程 在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行的数据传输。 应用场景:即时通信、网游对战、金融证券、国际贸易、邮件、等等。 不管是什么场景&#xff0c;都是计算机跟计算机之间通过网络进行数据传输。 Java中可以使用java.net包下…

被生活投喂的小确幸,藏不住啦~​

捕捉日常中的小确幸留意身边细微的美好瞬间&#xff0c;比如清晨的阳光、一杯热茶、陌生人的微笑。这些看似平凡的细节往往能带来意想不到的温暖和快乐。养成记录的习惯&#xff0c;用手机拍照或写日记的方式将这些小确幸保存下来。回顾时会发现生活其实充满闪光点。培养感恩的…

【2025最新】基于SpringBoot+Vue的智能物流管理系统管理系统源码+MyBatis+MySQL

摘要 随着电子商务和全球贸易的快速发展&#xff0c;物流行业在国民经济中的地位日益凸显。传统物流管理方式依赖人工操作&#xff0c;效率低下且容易出错&#xff0c;难以满足现代企业对高效、精准物流服务的需求。智能物流管理系统通过整合信息技术与物流管理&#xff0c;能够…

大数据领域 Hadoop 安全机制深度剖析

大数据领域 Hadoop 安全机制深度剖析 关键词:大数据、Hadoop、安全机制、访问控制、数据加密 摘要:本文深入剖析了大数据领域中 Hadoop 的安全机制。随着大数据的快速发展,Hadoop 作为主流的大数据处理框架,其安全问题至关重要。文章从 Hadoop 安全机制的背景出发,详细阐述…

豪威集团港股上市:募资48亿港元 市值1529亿港元 虞仁荣再敲钟 身价超400亿

雷递网 雷建平 1月12日豪威集成电路&#xff08;集团&#xff09;股份有限公司&#xff08;简称&#xff1a;“豪威集团”&#xff0c;股票代码&#xff1a;“00501”&#xff09;今日在港交所上市。豪威集团发行价为104.8港元&#xff0c;发行4580万股&#xff0c;募资总额为4…

Keil5显示中文异常?快速理解文件编码匹配原理

Keil5中文注释乱码&#xff1f;一文讲透编码匹配的本质与实战修复你有没有遇到过这样的场景&#xff1a;打开一个刚从同事那里接过来的Keil工程&#xff0c;点开.c文件一看——“测试函数”变成了“”&#xff0c;注释里的“初始化完成”显示成“˜”……满屏乱码&#xff0c;根…

快速理解es客户端工具的节点状态管理功能

深入掌握 Elasticsearch 节点状态管理&#xff1a;从原理到实战你有没有遇到过这样的场景&#xff1f;线上集群突然搜索变慢&#xff0c;监控显示某个节点 CPU 飙升&#xff1b;或者日志系统写入延迟&#xff0c;查看 Kibana 发现集群状态是黄色。这时候&#xff0c;你的第一反…

ant-design-vue组件设置中文

//app.vue<script setup lang"ts"> import {inject} from vue //添加1 import BasicLayout from /layouts/BasicLayout.vue import {LoginUserStore} from /stores/LoginUserStore.tsconst locale inject(locale)//添加2const loginUserStore LoginUserStore…

全面讲解AUTOSAR BSW通信模块集成方法

深入AUTOSAR通信栈&#xff1a;从信号到总线的完整链路解析在现代汽车电子开发中&#xff0c;一个ECU如何将“车门已打开”这样的状态准确、及时地广播到整车网络&#xff1f;这背后并非简单的函数调用&#xff0c;而是一套高度标准化、分层解耦的通信机制在支撑——这就是AUTO…

兆易创新明日上市:CPE小米TCL是基石 认购3亿美元

雷递网 雷建平 1月12日兆易创新科技集团股份有限公司&#xff08;简称&#xff1a;“兆易创新”&#xff0c;股票代码&#xff1a;“3986”&#xff09;将于2026年1月13日在港交所上市。兆易创新发行价162港元&#xff0c;发行2891.58万股&#xff0c;募资总额为46.82亿港元。兆…

基于SpringBoot+Vue的大创管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】

&#x1f4a1;实话实说&#xff1a;CSDN上做毕设辅导的都是专业技术服务&#xff0c;大家都要生活&#xff0c;这个很正常。我和其他人不同的是&#xff0c;我有自己的项目库存&#xff0c;不需要找别人拿货再加价&#xff0c;所以能给到超低价格。摘要 随着高等教育改革的深入…

理解UDS诊断协议P2定时器管理:图解说明

深入理解UDS诊断中的P2定时器&#xff1a;从原理到实战的完整指南你有没有遇到过这样的情况——诊断仪发了一个请求&#xff0c;ECU明明“听见了”&#xff0c;却迟迟不回&#xff0c;结果诊断仪直接报超时失败&#xff1f;或者在刷写Bootloader时&#xff0c;刚进入编程会话就…

2026 CRM 排行榜:中小企业客户管理系统核心能力横向对比指南

在数字化转型背景下&#xff0c;中小企业对CRM的需求已从“单一客户管理”升级为“全流程业务协同”——不仅要管好客户&#xff0c;还要打通团队、进销存与上下游供应链。本文基于超兔一体云、Odoo、Nimble、有赞、探迹、用友CRM等主流品牌的公开能力&#xff0c;从客户管理、…

企业级图书进销存管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

&#x1f4a1;实话实说&#xff1a;CSDN上做毕设辅导的都是专业技术服务&#xff0c;大家都要生活&#xff0c;这个很正常。我和其他人不同的是&#xff0c;我有自己的项目库存&#xff0c;不需要找别人拿货再加价&#xff0c;所以能给到超低价格。摘要 在数字化时代背景下&…