Bri*_*yer 4 mysql sql csv join load-data-infile
我要做的是将CSV上传到表中,同时使用JOIN将第三个表中的信息附加到目标表.
CSV import.csv(包含1M行)如下所示:
firstname | lastname
Run Code Online (Sandbox Code Playgroud)
目标表"名称"如下所示:
firstname | lastname | gender
Run Code Online (Sandbox Code Playgroud)
表"性别"(700k行)看起来像这样:
firstname | gender
Run Code Online (Sandbox Code Playgroud)
所以,我理想的查询看起来像这样:
LOAD DATA LOCAL INFILE "import.csv"
INTO TABLE names n
LEFT JOIN gender g ON(g.firstname=n.firstname)
Run Code Online (Sandbox Code Playgroud)
沿着这些方向,将导入与连接组合在一起,以便名称中的最终结果具有来自性别和CSV的数据.
但是,我知道LOAD DATA LOCAL INFILE不能与JOIN结合使用,并且尝试对每一行使用INSERT加JOIN都是CPU密集型的.
有任何想法吗?
您可以使用SET子句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
)
Run Code Online (Sandbox Code Playgroud)
确保:
firstname列索引gendernames在加载数据之前,表中没有任何索引.完成加载后添加它们(索引).根据我的经验,将数据加载到数据库中的最佳方法是首先将其放入临时表中,其中所有列都是字符。然后,将数据库中的数据转换为最终输出。
将其应用到您的代码中:
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;
Run Code Online (Sandbox Code Playgroud)
这使得可以识别并修复数据加载中的问题。您还可以轻松添加其他列(例如主键)并将日期插入最终表中。
| 归档时间: |
|
| 查看次数: |
4084 次 |
| 最近记录: |