【发布时间】: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