记一次大量CSV数据文件同步到数据库

背景:

公司的自研产品准备替换外购的产品,涉及到的数据量达到几亿,供应商推送数据采用推送到他们的OSS上面,给我们开放一个子账号用来读取数据文件。但是怎么快速的将数据文件里的数据导入到我们mysql的库中,是个难题,用程序来跑,计算下来要跑两个月且优化空间不大。
数据文件有以下特征:

  • 供应商给的数据文件间隔符还不是逗号,而是制表符’/u0001’
  • 数据文件一般在500M左右,总计有1000多个

解决:

很多数据库工具都带有导入文件的功能,少量的数据文件可以采用这种方式

比如navicate可以导入数据文件,csv文件可以当text文件导入,这样的好处是可以自己设置分割符,但是一次只能选中一个CSV文件,如果数据文件很多,真的是很折磨人,效率极低。

使用MYSQL的LOADFILE功能,可以快速的写入数据

mysql的load file命令,可以读取客户端的数据文件,而且读写速度很快,最好硬盘是固态的,这样效率更高,经过测试,300万的数据20S就可以写进去。如果文件命令是有规则的,写个代码生成一下批量执行脚本就OK了。LOADFILE脚本如下:

-- 数据文件的位置
LOAD DATA LOCAL INFILE 'D:\\scrm\\5eb696d75372c45ec22d9136\\bdMemberEventLog\\20240507\\part-00000-e90f623c-67bf-437c-8e72-5f6f8a894b85-c000.csv'
-- 要写入的目标表
INTO TABLE MEMBER_EVENT_LOG
-- 间隔符
FIELDS TERMINATED BY '' 
ENCLOSED BY '"'
ESCAPED BY ''
-- 换行符
LINES TERMINATED BY '\n'
-- csv文件的目标字段,这里取值是按顺序的
IGNORE 1 LINES
(
  @accountId,
  @channelId,
	@clientId, 
	@createdAt,
	@id,
	  @isSystem,
  @memberId,
	@name,
	 @occurredAt,
  @openId,
	 @properties,
  @unionId,
  @uniqueId,
  @updatedAt
)
SET 
-- 写入表中的字段
  account_id=@accountId,
  channel_id=@channelId,
  member_id=@memberId,
  open_id=@openId,
  union_id= @unionId,
  client_id=@clientId,
  name=@name,
  properties=@properties,
  unique_id=@uniqueId,
  is_system=@isSystem,
	occurred_at=CASE   
                  WHEN @occurredAt = '' OR @occurredAt IS NULL THEN NULL  
                  ELSE @occurredAt
                END,
  created_at=CASE   
                 WHEN @createdAt = '' OR @createdAt IS NULL THEN NULL  
                 ELSE @createdAt 
               END,
  updated_at=CASE   
                 WHEN @updatedAt = '' OR @updatedAt IS NULL THEN NULL  
                 ELSE @updatedAt
               END,
  qm_id=@id,
file_name ='D:\\scrm\\5eb696d75372c45ec22d9136\\bdMemberEventLog\\20240507\\part-00000-e90f623c-67bf-437c-8e72-5f6f8a894b85-c000.csv';

注意:
如果遇到不能读取本地文件的报错,可以执行命令 SET GLOBAL local_infile = 1; 这样就可以读取本地文件了

相关推荐

  1. 大量CSV数据文件同步数据库

    2024-06-11 09:20:05       30 阅读
  2. etcd数据恢复

    2024-06-11 09:20:05       31 阅读
  3. requests.get()返回数据乱码问题

    2024-06-11 09:20:05       33 阅读
  4. 若依项目组装树型结构数据的效率优化

    2024-06-11 09:20:05       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-11 09:20:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-11 09:20:05       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-11 09:20:05       82 阅读
  4. Python语言-面向对象

    2024-06-11 09:20:05       91 阅读

热门阅读

  1. go_compiler

    2024-06-11 09:20:05       29 阅读
  2. 平均召回(Average Recall,AR)概述

    2024-06-11 09:20:05       47 阅读
  3. 细说wayland和X11

    2024-06-11 09:20:05       31 阅读
  4. 详细说说机器学习在工业制造的应用

    2024-06-11 09:20:05       28 阅读
  5. STM32 ST-LINK Utility的下载安装使用说明如下:

    2024-06-11 09:20:05       47 阅读
  6. 观察者模式

    2024-06-11 09:20:05       31 阅读
  7. C#面:什么是DLL文件,使用它们有什么好处

    2024-06-11 09:20:05       44 阅读