将数百万行从teradata传输到mySQL

时间:2013-12-06 01:23:27

标签: java mysql sql bigdata teradata

我必须将大约500万行数据从Teradata传输到MySQL。任何人都可以建议我通过网络最快的方式,而不使用文件系统。我是Teradata和MySQL的新手。我希望每周将此传输作为批处理作业运行,因此我正在寻找可以完全自动化的解决方案。任何建议或提示将不胜感激。

我已经使用JDBC编写代码来从Teradata获取记录并将它们插入MySQL。但它非常慢,所以我希望使代码更有效率。我保持通用,因为我没有解决方案受到我的实现的限制,因为随着现有代码的更高效,我也对其他替代方案持开放态度。但我不想使用文件系统,因为维护或更新脚本并不容易。

我的实施:

从teradata获取记录:

connection  =   DBConnectionFactory.getDBConnection(SOURCE_DB);

    statement = connection.createStatement();
    rs = statement.executeQuery(QUERY_SELECT);
    while (rs.next()) {

        Offer offer = new Offer();
        offer.setExternalSourceId(rs.getString("EXT_SOURCE_ID"));
        offer.setClientOfferId(rs.getString("CLIENT_OFFER_ID"));
        offer.setUpcId(rs.getString("UPC_ID"));

        offers.add(offer);
    }

在mySQL中插入记录:

int count = 0;
    if (isUpdated) {
        for (Offer offer : offers) {

            count++;

            stringBuilderUpdate = new StringBuilder();
            stringBuilderUpdate = stringBuilderUpdate
                    .append(QUERY_INSERT);

            stringBuilderUpdate = stringBuilderUpdate.append("'"
                    + offer.getExternalSourceId() + "'");

            statement.addBatch(stringBuilderUpdate.toString());

            queryBuilder = queryBuilder.append(stringBuilderUpdate
                    .toString() + SEMI_COLON);

            if (count > LIMIT) {
                countUpdate = statement.executeBatch();
                LOG.info("DB update count : " + countUpdate.length);
                count = 0;
            }

        }
        if (count > 0) {
            // Execute batch
            countUpdate = statement.executeBatch();
        }

有人可以告诉我,我们是否可以使这个代码更有效率???

由于

PS:请忽略上面代码中的语法错误,因为此代码工作正常。由于复制和粘贴,某些信息可能会丢失。

1 个答案:

答案 0 :(得分:1)

将数据导入MySQL的fastest方法是使用LOAD DATA INFILEmysqlimport,它是LOAD DATA INFILE的命令行界面,它涉及从文件加载数据,最好驻留在本地文件系统上。

  

从文本文件加载表时,请使用LOAD DATA INFILE。这是   通常比使用INSERT语句快20倍

因此,尽管您不想使用文件系统,但我建议考虑创建转储到文件,将其传输到MySQL服务器并使用上述方法加载数据。

所有这些任务都可以通过脚本完全自动化。