【原】Python通过Presto连接Hive

/ 0评 / 1

最近项目上遇到了一个需求,其中需要我做的部分是要使用Python连接Hive,写入数据到hive里。

一、环境介绍:

二、分析

因为项目中还需要连接其他数据库使用,同时在服务器上已经部署了Presto。因此我计划使用Presto来连接Hive,并进行各种操作。

首先摆在面前的第一个难题就是服务器是内网的,无法上外网,只能通过离线包安装的方式安装pyhive。由于还需要一些其它的依赖,为了方便实现,我直接选择使用pip3的离线导出包功能将包导出后,再到服务器上去安装。

三、离线包的导出和安装

首先我在测试服务器(可以上外网)上通过pip3安装需要的包。此处只列出了pyhive,如有其他需要可自行安装。

pip3 install pyhive
....

然后测试通过后,就依照测试服务器上的环境,将包离线导出

pip3 download -d /python_packages/ -r requirements.txt

/python_packages/ 是导出的包的保存路径,这里需要自己设置。
requirements.txt 是导出的包的清单。

然后根据需要在requirements.txt清单里选择需要的包,删除不需要的。

最后将python_packages目录和requirements.txt上传到服务器上。执行如下命令离线安装包。

pip3 install --no-index --find-links=python_packages/ -r requirements.txt

同样,这里python_packages是离线包的目录,根据自己的实际情况设置,建议使用绝对路径。requirements.txt是清单,也建议使用绝对路径。

这样就完成了所需的包的离线安装步骤。

四、Python代码实现Hive的读写

下面是通过Python连接Hive的代码:

# -*- coding:utf-8 -*-
from pyhive import presto
# 查询
def select(sql):
    conn = presto.connect(host="192.168.1.1", port="9999", catalog="hive", schema="default", username="hive")
    cur = conn.cursor()
    cur.execute(sql)
    rows = cur.fetchone()
    cur.close()
    return rows

# 插入数据
def save(sql):
    conn = presto.connect(host="192.168.1.1", port="9999", catalog="hive", schema="default", username="hive")
    cur = conn.cursor()
    cur.execute(sql)
    conn.commit()
    cur.close()


if __name__ == '__main__':
    sql1 = "select count(*) from testdb.user"
    users = select(sql1)
    print(users[0])
    sql2 = "insert into testdb.user (username,age) values ('zhangsan',20)"
    save(sql2)

Presto是Facebook开源的一个查询引擎,具体相关信息请自行搜索。

这里有几个点需要注意一下:

五、Presto的Catalog

Presto使用Catalog、Schema和Table这3层结构来管理数据。

Catalog就是数据源,我们需要创建对应的Catalog来管理数据源。因为本人当前环境里集成了一些产品,所以Hive的Catalog有些复杂,下面给出一个官方Hive的Catalog示例

connector.name=hive-hadoop2
hive.metastore.uri=thrift://example.net:9083

Catalog的具体路径是在Presto安装路径里的etc/catalog目录下,新建hive.properties。

在使用的时候这个文件名的值是传入的catalog参数。比如我上面的python里代码的例子里传入的是hive,而我的Catalog文件名是:hive.properties。

设置了Catalog后记得重启Presto才能生效。

本人平时很少用Python,也许代码格式不是很规范,还请见谅。这里只是介绍了一个方法和demo。希望大家根据自己项目的情况进行调整。