【问题标题】:Python to Teradata date issuePython 到 Teradata 日期问题
【发布时间】:2021-10-04 05:48:02
【问题描述】:

我已经阅读了许多关于此问题的 stackoverflow 帖子,但没有提供解决方案。我将详细说明问题:

关于数据:我有一个包含 52 列的数据框。 52 列中有 6 列将日期作为数据。其中 3 个日期列是空的,定义为 df.insert(5,"ACTIVE_DATE",""),因为它们是稍后手动填充的,3 个是用日期填充的。 3 个填充列的格式为 DD/MM/YYYY。

关于问题:我尝试使用 sqlalachemy 和 teradataml 将数据上传到 teradata。 DB 表有自己的索引,因此设置为 false。我正在使用 sqlalchemy 的以下连接方法:

eng = sqlalchemy.create_engine('teradatasql://user:pass@host')
df.to_sql(name='Sales_DB',con=eng,if_exists='append',index=False,schema='sales')

但每次我得到同样的错误:

由 [版本 17.0.0.3] [会话 19245476] [Teradata 数据库] [错误 2666] 为 Sales_DB.CREATE_DATE 提供的日期无效。 在 gosqldriver/teradatasql.(*teradataConnection).formatDatabaseError TeradataConnection.go:1138 在 gosqldriver/teradatasql

为了解决这个问题,我更改了日期格式并将根本问题理解为 YYYY-MM-DD 的 teradata 格式。这似乎适用于 3 个填充日期列,但不适用于 null 日期列。 teradata 似乎无法识别空日期值。我尝试使用 df.insert(5,"ACTIVE_DATE",None),但这在 teradata 中也不起作用,导致出现错误 - 无法追踪的字符。

问题 1: 3 列为空时,如何成功将 df 上传到 teradata?它们不能由占位符填充,因为它们需要空出。

问题 2: 另一个数据库的日期格式为 DD/MM/YYYY,虽然它没有使用 python 脚本,但它似乎可以正常工作。有人可以解释为什么这不起作用吗?

谢谢

【问题讨论】:

  • 在将这些空日期加载到 Teradata 时,它们在数据框 NaN 中是真正空的还是空白 ""?我会假设,但尚未测试,NaN 数据帧值会自动转换为 Teradata 中的 NULL 日期而不会出错。此外,作为解决方案的另一个方向,Teradata 中的这些列是否定义为NOT NULL
  • 此外,在执行 ETL 时,有时最简单的方法是加载到大多数列都设置为“VARCHAR()”的表中,以允许加载不太完美的数据。在加载该“加载”表之后,将加载一个存储过程,或者将后续 SQL 语句发送到数据库以将该数据加载到目标表中,执行任何需要的转换以使其干净。这可能是一个更简单的选择,而不是试图预测 python 和 sqlalchemy 在幕后所做的事情。
  • 通常 sqlalchemy 期望/返回 Python None 用于数据库 NULL。 “不起作用”是什么意思?相同的错误还是不同的错误?如果您的“日期”作为字符串提供给数据库,则转换可能取决于与目标列关联的格式(可能默认为系统设置或明确说明。
  • @Fred 我收到另一个错误 - 无的无法追踪字符。日期已在 Teradata 表中定义为日期,因此我无法更改它。
  • @JNevill 这些列没有定义NOT NULL。 teradata 中的空日期看起来像空白 "",因为它们在 DB 列中没有说 NULL。我无权创建表,只能将数据加载到该表中。

标签: python sql pandas teradata python-datetime


【解决方案1】:

希望我回答这个问题不会太晚,但我认为问题可能是 Teradata 没有 Python 的 None 概念。如果您尝试使用 Python 的 None 在 Teradata 中插入/更新一个值,您可能会遇到类似的问题。看起来您的列也是日期时间,因此您不能在其中插入空白字符串 (""):

INSERT INTO DB.TBL (DATE_FIELD, KEY_FIELD) VALUES (None, 3); -- Will produce a Syntax error

INSERT INTO DB.TBL (DATE_FIELD, KEY_FIELD) VALUES ("",3); -- Will produce a coltype error

尝试将日期的默认值设为 NULL 或 1900-01-01 00:00:01 - Teradata 明白这一点。

df.insert(5,"ACTIVE_DATE","1900-01-01 00:00:01")
df.insert(5,"ACTIVE_DATE","NULL")

【讨论】:

    猜你喜欢
    • 2014-12-01
    • 2017-05-09
    • 2017-04-21
    • 1970-01-01
    • 2022-01-12
    • 2022-07-14
    • 1970-01-01
    • 2021-01-18
    • 2017-06-16
    相关资源
    最近更新 更多