【问题标题】:MYSQL Error 1366, 1265 when importing 2 million+ row large csv fileMYSQL 错误 1366, 1265 导入 200 万+ 行大 csv 文件时
【发布时间】:2021-01-18 17:21:09
【问题描述】:

问题:我需要导入一个包含超过 200 万行、12 列的 csv 文件。为此,我将其命名为 stack.csv

列: Search_term、货币、成本、Avg_CPC、展示次数、点击次数、Impr_Top_Percent、Impr_Abs_Top_Percent、转化次数、Conv_value、Conv_rate、Conv_value_cost

行示例:

table sample

到目前为止,我遇到了两个主要问题。我会提出问题是什么以及我的解决方案。

1) 问题:

csv 上有一个标题(行开始的上方)导致匹配错误,并且实际的列标题使用了特殊字符。我无法使用 excel 打开它,因为它被限制为 1,000,000 行。单元格中还内置了百分比符号。

解决方案:经过许多不同的解决方案后,我在一个简单的文本文件中打开它并删除了主标题并重命名了列标题。我还使用查找/替换删除了所有百分号。

2) 我创建了一个表,使用导入向导将 1:1 导入 MYSQL。代码如下:

CREATE TABLE stack (
  id INT(7) NOT NULL AUTO_INCREMENT,
  Search_Term VARCHAR(255) NOT NULL,
  Currency VARCHAR(10) NOT NULL,
  Cost DECIMAL(19,2) NOT NULL,
  Avg_CPC DECIMAL(19,2) NOT NULL,
  Impressions INTEGER(10) NOT NULL,
  Clicks INTEGER(10) NOT NULL,
  Impr_Top_Percent DECIMAL(10,2) NOT NULL,
  Impr_Abs_Top_Percent DECIMAL(5,2) NOT NULL,
  Conversions DECIMAL(5,2) NOT NULL,
  Conv_value DECIMAL(10,2) NOT NULL,
  Conv_rate DECIMAL(5,2) NOT NULL,
  Conv_value_cost DECIMAL(10,2) NOT NULL,
  PRIMARY KEY (id)
);

问题:当我开始导入时,遇到以下错误:

行导入失败并出现错误:(“不正确的十进制值:第 1 行的列 'Conv_rate' 的 '0.00%'”,1366)

行导入失败并出现错误:(“不正确的十进制值:'0.00%' for column 'Conv_value_cost' at row 1”,1366)

行导入失败并出现错误:(“第 1 行的“展示次数”列的数据被截断”,1265

解决方案:我给 DECIMAL 值足够的空间,所以我真的卡住了。在尝试导入 (SET SESSION sql_mode = '';) 之前,我运行了一些代码以使其脱离严格模式。它什么也没做。

所以我的问题是

如何消除错误?

这是我第一次导入这么大的东西 - 通常需要几个小时吗?我让它运行了 50 分钟,它大约是 20%

当我停止导入以对某些行(大约 10,000 行)进行超快速抽查时,数据似乎没问题?错误更多的是形式吗?它会自动更正以适合我的参数吗?

我是否应该尝试对出现错误的列执行 VARCHAR 作为最后的手段?或者甚至做VARCHAR然后抽查?

仅供参考,我正在运行 MYSQL 8.0。非常感谢大家。

【问题讨论】:

  • 我建议将所有列作为字符串导入临时表,然后将数据转换为您想要的最终格式。
  • 我偶尔会看到这样的问题,描述性能非常缓慢。不,那个进口率真的不正常。你的服务器有问题。我不知道出了什么问题,但任何合理的当前笔记本电脑都可以在几秒钟内而不是几小时内导入 200 万行。如果您有合适的服务器并为资源配置 MySQL 服务,它应该能够做得更好。所以你的服务器有问题。也许它在非常过时的硬件上。或者你让它与其他进程过载。
  • @BillKarwin 我不认为我的 2013 年的 MacBook Pro 已经过时,它已经能够处理其他所有问题。也许我会在它完成后尝试重新启动,因为我不想中断这个过程,因为它几乎完成了。
  • @GordonLinoff 我一直在阅读有关临时表的信息——我不知道那是什么。这只是另一种说法,为这个特定用途创建一个表吗?例如我的架构下的overflow_staging_table。关于将它们作为字符串导入 - 所以是 VARCHAR?如果是这样,当我把它们放在那里时,只需使用 ALTER 函数将它们转换为 DECIMAL 或 INT ?非常感谢您抽出宝贵时间回复,非常感谢。
  • @Stop-YouAnimal 。 . .暂存表只是一个“临时”表,您可以在其中放置数据,同时为最终数据结构处理数据。该表不需要是真正的临时表,这就是“临时”在引号中的原因。

标签: mysql sql csv


【解决方案1】:

请注意,我使用的是 Mac。我将简洁地发布答案,然后进行一些解释。

  1. 将所有错误列切换为 VARCHAR

  2. 不要使用 MYSQL 数据导入向导。 *1

  3. 在 MYSQL 中使用以下代码导入。

    加载数据输入文件'[文件路径]/stack.csv'

    INTO TABLE [您在 SQL SCHEMA 中创建的表的名称]

    由“,”终止的字段

    由'"'封闭

    以“\n”结尾的行

    忽略 1 行; [这忽略了第一行/标题,仅供参考]

  4. 我收到了一个安全文件私有问题 ERROR 1290

  5. 在MYSQL>管理>实例[点击扳手]>系统配置文件[确保 enter image description here

确保配置文件指向你的 my.cnf

my.cnf 文件应位于这些文件夹位置之一(请注意,usr 文件可能已隐藏/变灰)

/etc/my.cnf 
/etc/mysql/my.cnf 
/usr/local/etc/my.cnf [most likely]
~/.my.cnf 

使用简单的文字编辑器打开 cnf 文件

将以下内容添加到底部并保存:secure-file-priv = ""

在终端输入 mysql.server 重启

现在你应该很好了!

*1 它花费的时间太长并且没有优化。我说的是几个小时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    相关资源
    最近更新 更多