首页 > 解决方案 > 使用 pyodbc DSN 连接将 DataFrame 写入 Hive

问题描述

如何使用 pyodc 连接将数据帧写入配置单元表。写入时会出现编程错误.. 任何其他将数据从本地写入配置单元的方式。

错误

Error                                     Traceback (most recent call last)
C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\sql.py in execute(self, *args, **kwargs)
   1430             else:
-> 1431                 cur.execute(*args)
   1432             return cur

Error: ('HY000', "[HY000] [Cloudera][ImpalaODBC] (110) Error while executing a query in Impala: [HY000] : ParseException: Syntax error in line 1:\n...ERE type='table' AND name=?;\n                             ^\nEncountered: Unexpected character\nExpected: CASE, CAST, DEFAULT, EXISTS, FALSE, IF, INTERVAL, LEFT, NOT, NULL, REPLACE, RIGHT, TRUNCATE, TRUE, IDENTIFIER\n\nCAUSED BY: Exception: Syntax error\n (110) (SQLPrepare)")

在处理上述异常的过程中,又出现了一个异常:

DatabaseError                             Traceback (most recent call last) <ipython-input-8-9f82c88c3a27> in <module>
      1 import pyodbc
      2 with pyodbc.connect("DSN=*****", autocommit=True) as conn:
----> 3     df.to_sql(name='Xyz', con=conn, schema='fgh',if_exists='append',index=False)

标签: pythonpandashivesqlalchemypyodbc

解决方案


您正在将原始(DBAPI)传递pyodbc.Connection给 pandas' to_sql。正如to_sql 的文档所述,这样的Connection对象被假定为 sqlite3 连接,to_sql发送查询也是如此

SELECT name FROM sqlite_master WHERE type='table' AND name=?;

询问数据库。这不适用于 Hive(或 SQLite 以外的任何数据库)。

对于任何其他数据库,您需要将to_sqlSQLAlchemyEngineConnection对象作为con=参数传递。


推荐阅读