【问题标题】:ETL process with Python and SQL Server taking a really long time to load使用 Python 和 SQL Server 的 ETL 过程需要很长时间才能加载
【发布时间】:2017-10-20 19:01:22
【问题描述】:

我正在寻找一种可以提高 csv 文件 SQL Server 数据库加载过程性能的技术。我尝试了各种方法,但我所做的似乎都无法打破 5.5 小时的障碍。这只是测试加载一年大约 200 万条记录的数据。我最终要加载 20 年的数据,因此连续 4 天加载数据是行不通的。

挑战在于,必须在加载时丰富数据。我必须添加一些列,因为该信息不是文件本身的信息。到目前为止,我已经尝试过:

  1. 使用 petl 将列附加到数据中,然后将其刷新到数据库中。
  2. 使用 pandas 将列附加到数据,然后将数据框刷新到数据库。
  3. 使用批量加载加载中间临时表,然后使用 T-SQL 填充额外列,然后将其推送到最终临时表。

批量加载确实很快,但是我必须为额外的列添加数据,然后我们回到行级操作,我认为这是这里的瓶颈。我正准备尝试:

  1. 使用 Pandas 附加数据。
  2. 将数据写回 CSV。
  3. 批量加载 CSV。

这让我很困扰,因为我现在有两个 I/O 操作。将文件读入 pandas 并再次将文件写回。

我在某处读到 Pandas 是用 C 或其他东西编写的,所以它应该非常快。将数据框刷新到数据库并没有那么快。在这一点上,我在问是否有人有他们在现实世界中使用的更快的方法。到目前为止,我所拥有的如下:

import pypyodbc
conn_str = "DSN=[dsn name];"
cnxn = pypyodbc.connect(conn_str)
crsr = cnxn.cursor()
sql = "BULK INSERT pre_stage_view FROM '[file path]' WITH (FIELDTERMINATOR = ',',ROWTERMINATOR = '\n')"
crsr.execute(sql)
cnxn.commit()
crsr.close()
cnxn.close()

这是去掉头的存储过程:

DELETE FROM pre_stage_table WHERE Symbol = 'Symbol'


INSERT INTO stage_table(
[Symbol],
[Exchange],
[Date],
[Open],
[High],
[Low],
[Close],
[Volume],
[SourceSystem],
[RunDate]
)
SELECT
[Symbol],
@exchange, --passed in proc parameter
[Date],
[Open],
[High],
[Low],
[Close],
[Volume],
'EODData',
CURRENT_TIMESTAMP
FROM pre_stage_table


TRUNCATE TABLE pre_stage_table

【问题讨论】:

    标签: python sql-server pandas csv tsql


    【解决方案1】:

    批量加载确实很快,但是我必须为额外的列添加数据,然后我们又回到了行级操作,我认为这是这里的瓶颈。

    抱歉,我不明白您为什么要进行行级操作。试试:

    1) 批量加载到暂存表

    2) MERGE 带有目标表的暂存表

    您仍然会获得性能不错的基于集合的方法。请记住禁用触发器(如果可能在目标上),另外您可以删除索引、加载数据并在之后重建它们。

    【讨论】:

    • 如果我理解正确的话,当我从前一个阶段刷新到另一个阶段时,我正在做一个简单的插入,逐行插入行。让我试试你的建议。
    • 从五小时缩短到三分钟!!哈哈哈!!好的! FTW!谢谢!从来没有想过在那个特定的用例中使用 MERGE。
    • @BobWakefield 非常好。我真的很高兴能帮上忙 :)
    • 嗨,lad2025,我有上面的确切场景,但除了插入之外,我还需要在适用的情况下更新某些列,然后将数据推送到我的 RDS Mysql。我需要在我的 pyspark & staging table 中执行 upsert。你能提供一些帮助吗?谢谢
    • @YuvaKumar MySQL 没有 MERGE 但有 ON DUPLICATE KEY How to Perform an UPSERT so that I can use both new and old values in update part
    猜你喜欢
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 2014-08-15
    相关资源
    最近更新 更多