使用 pandas to_sql 和 pyhive 替换表时执行失败 - databaseerror: "......not all arguments converted during string formatting"

huwehgph  于 2021-04-03  发布在  Hive
关注(0)|答案(1)|浏览(1398)

我需要用新的 pandas dataframe 替换 hive 中的一个表。我使用 pyhive 创建了一个连接引擎,随后使用 pandas.to_sql 以 'if_exists' 作为替换。

from pyhive import hive

my_data = pd.read_csv('my_data.csv')

conn = hive.Connection(host="111.11.11.11", port=10000, username="abcd")

my_data.to_sql(name='table_name', con=conn, if_exists='replace', schema='my_schema')

conn.close()

然而,这导致了一个意外的错误,如下所示。

DatabaseError: Execution failed on sql: SELECT name FROM sqlite_master WHERE type='table' AND name=?;
not all arguments converted during string formatting
unable to rollback

其他的回答似乎表明这与to_sql期望一个sqlalchemy引擎有关--我的印象是这是pyhive用来创建连接的。
值得注意的是,在其他地方,这个相同的连接从hive读取数据没有问题。
如同预期的那样工作。

conn = hive.Connection(host="111.11.11.11", port=10000, username="abcd")

my_data = pd.read_sql('select * from my_table', conn)

conn.close()
knsnq2tg

knsnq2tg1#

其他的答案似乎表明这与to_sql期望一个sqlalchemy引擎有关--我的印象是这是pyhive用来创建连接的。
pyhive 可以创建一个 sqlalchemy Engine对象,但不是你正在做的那种方式。

engine = create_engine('hive://localhost:10000/default')

然后将engine对象传递给to_sql
read_sql]的工作原理与预期一致
read_sql通常只需要一个dbapi连接就可以工作,但是to_sql需要一个sqlalchemyConnectable ( EngineConnection ),因为它可能需要生成ddl.更多信息请看这个答案。

相关问题