【问题标题】:Removing entire rows from data based on duplicates in a column根据列中的重复项从数据中删除整行
【发布时间】:2013-04-04 15:02:24
【问题描述】:

所以这是我的问题。我有一个巨大的数据文本文件,我需要通过显然使用 java 程序将所有这些数据快速输入到 mySQL 数据库中。我唯一的问题是,数据是由某个 ID 标识的。其中一些 ID 具有重复项,并且包含与彼此相同的所有信息。为了排序和清晰起见,我想删除所有这些。

解决此问题的最佳方法是什么?如果有人可以提供帮助,我将不胜感激!

谢谢。

【问题讨论】:

  • 嗨,注意到没有答案被接受:)

标签: java mysql database duplicates


【解决方案1】:

在读取数据时有一个 hashmap 或 hashset。检查 id 是否存在于 hasmap/hashset 中,如果存在则继续。否则输入 set/map 并插入。

旁白: hashmap 和 hashset 的区别在于 hashset 只取值,而 hashmap 取键值。但是,Hashset 本身在内存中使用了一个 hashmap,并且只是为值插入了一个虚拟对象。 见:Differences between HashMap and Hashtable?

哈希集示例:

    HashSet<Integer> distinctIds = new HashSet<Integer>();

    MyRowData rowdata;
    int rowID;

    while((rowdata = this.getRowData())!=null ) // or however you iterate over the rows using reader etc
    {
    rowID = rowdata.getRowID(); 

    if(!distinctIds.contains(new Integer(rowID)))
    {
      distinctIds.add(rowID);
      inertDataInMysql(rowdata); //however you insert your data here
      System.out.println("Adding " + rowID);
    }
    }

您可以使用批量插入通过对多行执行可交换插入来进一步加快代码速度。见:

【讨论】:

    【解决方案2】:

    在向数据库中添加数据时,只需在您的 ID 中添加一个主键。这样,重复的 ID 行将不会添加到您的数据库中。希望这会有所帮助。

    【讨论】:

    • ID已经设置为主键。但是,在将所有数据放入数据库之前,我正在尝试对删除重复的所有数据进行排序。之前推荐的 hashmap 是否仍然是最好的主意,还是您会提出其他建议?
    • 添加主键意味着他仍将向数据库发送冗余数据并耗尽服务器和客户端上的资源(网络+cpu)。
    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多