【问题标题】:Python bulk insert to Teradata? Default is too slowPython批量插入Teradata?默认太慢
【发布时间】: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


【解决方案1】:

Pedro,如果您尝试通过 ODBC 一次加载一行,那么您遇到的问题就像试图通过吸管填充游泳池一样。

Teradata 一直是并行平台。您需要使用批量加载程序——或者,如果您是 Python 爱好者,请使用 teradataml(代码如下)。

顺便说一句,我在 12 秒内在笔记本电脑上加载了 728,000 条记录。当我在 Azure 中构建 Teradata 系统时,我能够使用以下相同的代码在 2 秒内加载相同的 728,000 条记录:

# -*- coding: utf-8 -*-
import pandas as pd
from teradataml import create_context, remove_context
con = create_context(host = <host name or IP address>, username=<username>, password=<password>, database='<#what ever default database you want>')

colnames = ['storeid','custnumber','invoicenumber','amount']

dataDF = pd.read_csv('datafile.csv', delimiter=',', names=colnames, header=None)

copy_to_sql(dataDF, table_name = 'store', if_exists='replace') # this will load the datafrom from your client machine into the Teradata system.

remove_context()

【讨论】:

    【解决方案2】:

    佩德罗。我可以同情你。我在一个在 Teradata 中拥有大量数据仓库的组织工作,几乎不可能让它正常工作。我开发了一个 Python (3.9) 脚本,它使用 teradatasql 包来连接 Python/SQLAlchemy,它运行得相当好。

    此脚本反映了一个 PostgreSQL 数据库,并逐个表地从 PostgreSQL 中提取数据,将其保存为 Python 中的对象,然后使用反映的 PostgreSQL 表在 Teradata 中创建可比较的版本,最后将检索到的数据推送到表格。

    我已经对此进行了质量检查,这就是我得到的结果:

    • PostgreSQL 中的表反射时间:平均 0.95 秒
    • 最长 PostgreSQL 数据检索:4.22 秒
    • 最短在 Teradata 中创建镜像表的时间:12.10 秒
    • 将数据加载到 Teradata 的最短时间:8.39 秒
    • 最长时间将数据加载到 Teradata:大约。 7,212 秒

    这里的重点是 Teradata 是一个糟糕的平台,无法胜任关键业务任务。我已经向高层领导展示了 Teradata 与其他 5 种 ODBC 相比的性能,而 Teradata 的能力无疑是最差的。

    也许版本 17 会更好;但是,我们使用的是 16.20.53.30 版本,它也不支持就地多行插入。我建议您的组织停止使用 Teradata 并转向功能更强大的产品,例如 Snowflake。 Snowflake 具有出色的 Python 支持和出色的 CLI。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 2017-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多