【问题标题】:How to insert 780k records Spring Data Postgres如何插入780k条记录Spring Data Postgres
【发布时间】:2018-12-04 01:25:06
【问题描述】:

CSV 文件将上传到 Amazon S3 存储桶中。

当前实施:

  1. 使用返回 List 的 OpenCSV 实用程序的 readAll 读取 CSV 文件
  2. 将每个列值映射到一个实体对象
  3. 创建一个列表对象(当前大小 :: 15000)
  4. 调用 Spring Data CRUD Repository saveAll(List objects)
  5. 在 780k 条记录中,只有 570k 条记录保留在数据库中。
  6. 在插入这么多记录后,我们没有看到任何异常/错误。

完全不知道之后发生了什么

谷歌搜索后发现 PostgreSQL 中的copy 命令是读取/写入 PostgreSQL 数据库的最快方法。

Java、C、Python 等多种语言也支持此功能。

尝试使用 PostgreSQL 的 CopyManager API,该 API 具有重载版本的 copyIn 方法。

copyIn(String sql, InputStream is) - 我们不能使用它,因为我们的 csv 在第一行包含标题列并且我们想跳过第一行。

copyIn(String sql, Reader rd) - 这不接受 CSVReader 对象,因为它不是 java.io.Reader 类型

技术

  • Java 8
  • Spring-Boot 2.0
  • Spring -Data 2.x
  • Spring-JPA 2.x
  • PostgreSQL - 9.6

【问题讨论】:

    标签: java spring-boot java-8 spring-data-jpa postgresql-9.6


    【解决方案1】:

    我能够找出代码缺陷。 我们提供了一个 db 列作为不需要的唯一约束,而在 CSV 文件中有此列的重复值。由于这个原因,记录插入失败。

    谢谢, 仙人掌

    【讨论】:

    • @Phanendra 你如何处理代码中的这种重复问题?
    【解决方案2】:

    我们不能使用这个,因为我们的 csv 在第一行包含标题列并且我们想跳过第一行。

    这就是COPY ... WITH HEADER 的用途。

    指定文件包含一个标题行,其中包含文件中每一列的名称。输出时,第一行包含表中的列名,输入时,第一行被忽略。只有在使用 CSV 格式时才允许使用此选项。

    【讨论】:

      【解决方案3】:

      我们不能使用这个,因为我们的 csv 在第一行包含标题列并且我们想跳过第一行。

      那么就跳过第一行。 copyIn() 不会“倒带”它获得的阅读器。您也不需要使用 CSVReader。 copy 语句将负责解析 CSV 文件。您需要做的就是提供一个位于应处理的第一行的阅读器。

      类似的东西:

      CopyManager mgr = new CopyManager(...);
      
      BufferedReader in = new BufferedReader(new FileReader(...));
      in.readLine(); // skip the header line
      
      mgr.copyIn("copy target_table from stdin with (...)", in);
      

      确保在copy 命令中提供适当的选项,以便正确解析文件。

      【讨论】:

      • 非常感谢您的回复 a_horse_with_no_name。目前问题已经解决,但这对我来说绝对是一个学习。
      • 我在下面的评论中提供了解决方案,这是我犯的错误。
      • @a_horse_with_no_name 在复制命令之前如何处理日期格式列? eg:在csv中数据可以是dd/mm/yyyy、dd-mm-yyyy、dd.mmm.yyyy等,其中for eg在postgres表中默认是yyyy-mm-dd格式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-07
      • 2015-10-04
      • 2016-12-31
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 2015-05-10
      相关资源
      最近更新 更多