Impala在python中打开连接

Posted

技术标签:

【中文标题】Impala在python中打开连接【英文标题】:Impala open connection in python 【发布时间】:2019-12-06 15:12:10 【问题描述】:

我正在寻找一种通过 Python 查询 Impala 的方法,它使您能够保持连接打开并将查询传递给它。

我可以使用这种代码非常愉快地连接到 Impala:

import subprocess
sql = 'some sort of sql statement;'
cmds = ['impala-shell','-k','-B','-i','impala.company.corp','-q', sql]
out,err = subprocess.Popen(cmds, stderr=subprocess.PIPE, stdout=subprocess.PIPE).communicate()
print(out.decode())
print(err.decode())

我还可以根据文档here 将-q 和sql 切换为-f 和带有sql 语句的文件。

当我为多个 sql 语句运行它时,它使用的名称节点对于所有查询都是相同的,如果代码中出现故障,它将停止(除非我使用该选项继续),这是一切都在意料之中。

我想要达到的是我可以运行一两个查询,使用一些 python 逻辑检查结果,然后如果它符合我的条件则继续。 我尝试使用 sqlparse 将我的代码拆分为单独的查询并一一运行。这在隔离时效果很好,但是如果一个语句是drop table if exists x;,而下一个语句是create table x (blah string);,那么如果 x 确实存在,那么因为第二个语句将在不同的节点上运行,所以删除的元数据更改还没有到达那个然而,它失败了 table x already exists 或类似的错误。

我认为,除了解决这个元数据问题之外,在我运行所有语句的同时保持与 impala 的连接更有意义,但我正在努力解决这个问题。 有没有人有任何具有此功能的代码?

【问题讨论】:

【参考方案1】:

如果您还没有这样做,您可能想看看 impyla,Impala/Hive python 客户端。

就您问题的第二部分而言,使用 Impala 的 SYNC_DDL 选项将保证 DDL 更改在执行下一个 DDL 之前在 impalads 中传播。

【讨论】:

谢谢,我先看看sync_ddl 位。周一测试后会反馈。 sync_ddl 确实解决了这个问题。我确信这应该仍然可以进行交互式 impala-shell 会话并通过子进程传递东西。但就目前而言,解决它的麻烦超过了能够实时而不是最终查看查询执行情况的好处。

以上是关于Impala在python中打开连接的主要内容,如果未能解决你的问题,请参考以下文章

Impala JDBC 连接:错误设置/关闭会话:打开会话错误

如何使用Python Impyla客户端连接Hive和Impala

Python连接Impala

使用 Python 连接 Impala 数据库(thriftpy 错误)

Python3 impala 连接 hiveserver2

python连接impala(安装impyla)