我要做的是将CSV上传到表中,同时使用JOIN将第三个表中的信息附加到目标表。
CSV import.csv(包含1M行)如下所示:
firstname | lastname
目标表“名称”如下所示:
firstname | lastname | gender
表“性别”(700k行)看起来像这样:
firstname | gender
所以,我理想的查询看起来像这样:
LOAD DATA LOCAL INFILE "import.csv"
INTO TABLE names n
LEFT JOIN gender g ON(g.firstname=n.firstname)
沿着这些方向,将导入与连接组合在一起,以便名称中的最终结果具有来自性别和CSV的数据。
但是,我知道LOAD DATA LOCAL INFILE不能与JOIN结合使用,并且每行尝试使用INSERT加JOIN都太占用CPU了。
有什么想法吗?
答案 0 :(得分:9)
您可以使用SET
的{{1}}条款来实现目标
LOAD DATA INFILE
确保:
LOAD DATA LOCAL INFILE '/path/to/your/file.csv'
INTO TABLE names
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n' -- or '\r\n' if file has been prepared in Windows
IGNORE 1 LINES -- use this if your first line contains column headers
(@first, @last)
SET firstname = @first,
lastname = @last,
gender =
(
SELECT gender
FROM gender
WHERE firstname = @first
LIMIT 1
)
表firstname
列上有索引
gender
表上没有任何索引。完成加载后添加它们(索引)。答案 1 :(得分:2)
MySql LOAD DATA INFILE语法未定义JOIN。
答案 2 :(得分:1)
根据我的经验,将数据加载到数据库的最佳方法是将其放在临时表中,其中所有列都是字符。然后,将数据库中的数据转换为最终输出。
将此应用于您的代码:
LOAD DATA LOCAL INFILE "import.csv"
INTO TABLE names_staging;
CREATE TABLE names as
select n.firstname, n.lastname, g.gender
from names_staging n LEFT JOIN
gender g
ON g.firstname = n.firstname;
这使得识别和修复数据加载中的问题成为可能。您还可以轻松地添加其他列,例如主键,并将日期插入到最终表中。