【发布时间】:2021-01-04 18:38:55
【问题描述】:
有人要求我使用 Python 脚本来读取文件、加载到数据帧中以及写入 Teradata 中的表。它可以工作,但编写一个 300 行的表需要 3-4 分钟。
现在这对于数据仓库来说是一项微不足道的工作,而且我们的 Teradata 在处理海量数据集时工作正常,但我发现等待 3 分钟才能运行此脚本实在是太费劲了。我不认为这是系统问题。
有没有更好的方法将中小型表加载到 Teradata 中?如果我们在 SQL Server 中执行此操作,则需要几秒钟的时间,但我们需要访问的其他一些数据已经存在于 Teradata 中。
主要代码如下:
import pandas as pd
from sqlalchemy import create_engine
conn_string = 'teradata://' + user + ':' + passw + '@' + host + '/?authentication=LDAP'
eng = create_engine(conn_string)
# insert into table
df.to_sql(table_name, con = eng, if_exists = 'replace',
schema='TEMP', index=False, dtype=df_datatypes)
上述方法有效,但是当我将 method='multi' 参数添加到 to_sql 时,出现错误:
CompileError: The 'teradata' dialect with current database version settings does not
support in-place multirow inserts.
然后我添加了 chunksize=100,我得到了这个错误:
DatabaseError: [HY000] [Teradata][ODBC Teradata Driver][Teradata Database](-9719)QVCI feature is disabled.
有没有办法加快速度?我应该完全在 Python 之外做点什么吗?
【问题讨论】:
-
第二个错误与块大小无关。更新到最新的 Teradata 驱动程序版本,这应该可以修复它。
-
或者考虑使用teradatasql方言(teradatasqlalchemy包),而不是teradata方言(sqlalchemy-teradata 包)+ ODBC。
标签: sql python-3.x pandas teradata