【问题标题】:How to raise an exception when bulk inserting faulty rows into crateDB using Python Pandas to_sql()使用 Python Pandas to_sql() 将错误行批量插入 crateDB 时如何引发异常
【发布时间】:2021-10-29 21:15:36
【问题描述】:

我正在使用

将数据批量插入 crateDB
pandas.to_sql(tableId, 'crate://xxxxxxx:4200', if_exists='append', index=False, chunksize=20000)

数据包含一些错误的行,其中“数字”类型的一列包含“对象”/“字符串”类型的值。

这会导致插入时出现类型转换错误。

当我将 to_sql() 的 chunksize 参数设置为 1 时,会引发异常,我可以捕捉到问题。

当 chunksize > 0 时,to_sql() 只是继续,我无法确保数据被正确插入。

我缺少什么,以及解决此问题的好方法是什么?

【问题讨论】:

    标签: python-3.x pandas cratedb


    【解决方案1】:

    对于批量插入,您需要检查查询结果以进行错误处理。它包括rowcounts 的数组。 -2 表示发生了错误。

    对于特定错误,可能包括类型转换错误,所有行都将被拒绝(即所有行数返回 -2),在这种情况下,您需要退回到单次插入。

    更多详情请参阅https://crate.io/docs/crate/reference/en/4.6/interfaces/http.html#bulk-errors

    【讨论】:

    • 谢谢。这适用于 http REST API。使用 to_sql() 时,总是返回 None,遗憾的是没有什么要检查的。
    【解决方案2】:

    问题很可能是 pandas 在 to_sql() 上没有返回任何内容,另请参阅 https://github.com/pandas-dev/pandas/issues/23998https://github.com/pandas-dev/pandas/issues/42645 。由于 CrateDB 中的 bulk_insert 并没有完全失败,而只是跳过了错误的行,因此不会引发异常,而是只返回一个每行有一个值的数组。然而,pandas 永远不会处理该返回:/

    可以更改 CrateDB 的 SQL alchemy 实现,但这反过来会破坏任何实际使用结果数组的实现。

    【讨论】:

      猜你喜欢
      • 2018-08-15
      • 1970-01-01
      • 2017-01-01
      • 2012-10-19
      • 1970-01-01
      • 2021-01-25
      • 2020-05-09
      • 1970-01-01
      • 2019-11-12
      相关资源
      最近更新 更多