【pyhive】本地使用pyhive连接hive数据库踩的坑

18 篇文章 4 订阅

       OK,本文来看看本地在PyCharm中使用pyhive连接hive数据库时踩过的坑吧,先看看一眼小编的测试代码~

       首先是封装了一个连接hive获取数据的类,因为是测试,所以写的简单了些,如下:

'''
@File  : sql.py
@Author: xzw
@Date  : 2020/6/14
@Desc  : 封装类
'''

from pyhive import hive
import pandas as pd


class TestHive(object):
    '''
    连接Hive获取数据
    '''

    def __init__(self, host, port, username, database):
        '''
        初始化方法
        :param host: 地址
        :param port: 端口号
        :param username: 用户名
        :param database: 数据库名称
        '''
        self.conn = hive.Connection(host=host, port=port, username=username, database=database)

    def get_data(self, sql):
        '''
        获取数据
        :param sql: SQL语句
        :return: 返回得到的数据
        '''
        data = pd.read_sql(sql, self.conn)
        return data

       然后是测试类:

'''
@File  : manager.py
@Author: xzw
@Date  : 2020/6/14
@Desc  : 访问Hive获取数据
'''

from connect_hive.sql import TestHive
from fastapi import FastAPI
import uvicorn

app = FastAPI()


@app.get("/get_hive_data")
def get_data():
    '''
    获取hive中的数据
    :return:
    '''
    host, port, username, database = 'cdh-master', 10000, 'hive', 'test'
    instance = TestHive(host, port, username, database)
    result = instance.get_data("select * from xzw")
    return {"result": result}


if __name__ == '__main__':
    uvicorn.run(app="manager:app", host="127.0.0.1", port=9999, reload=True, debug=True)

       上面就是整个过程的简单代码,想象着很快就能拿到hive中的数据了,然后……坑来了~

       第一个坑:

thrift.transport.TTransport.TTransportException: Could not start SASL: b'Error in sasl_client_start (-4) SASL(-4): no mechanism available: Unable to find a callback: 2'

       解决办法是在Connection中添加auth="NOSASL":

self.conn = hive.Connection(host=host, port=port, username=username, database=database, auth="NOSASL")

       第二个坑:

Connection Issue: thrift.transport.TTransport.TTransportException: TSocket read 0 bytes

       解决办法是在hive-site.xml中增加下面属性:

<property>
	<name>hive.server2.authentication</name>
	<value>NOSASL</value>
</property>

       当然,小编使用的是CDH搭建的集群,直接在监控界面配置即可,如下所示:

使用PyHive连接池的步骤如下: 1. 安装DBUtils库 首先需要安装DBUtils库,可以使用pip命令进行安装: ``` pip install DBUtils ``` 2. 创建连接池 在代码中引入DBUtils.PooledDB库,创建连接池对象,指定数据库连接参数,如下所示: ``` from pyhive import hive from DBUtils.PooledDB import PooledDB pool = PooledDB( creator=hive.Connection, host='your_hive_server_host', port=10000, username='your_username', password='your_password', database='your_database', maxconnections=10, # 最大连接数 mincached=2, # 最小空闲连接数 maxcached=5, # 最大空闲连接数 blocking=True, # 阻塞等待连接 maxusage=None, # 单个连接最多被重复使用的次数 setsession=[], # 会话参数列表 ping=0, # 自动ping数据库连接,0表示不ping ) ``` 其中,creator参数指定了连接的创建方式,这里使用的是hive.Connection,其他参数的含义如下: - host:Hive服务器的主机名或IP地址 - port:Hive服务器的端口号,默认为10000 - username:用户名 - password:密码 - database:默认数据库 - maxconnections:连接池中最大连接数,默认为0,表示无限制 - mincached:连接池中最少空闲连接数 - maxcached:连接池中最多空闲连接数 - blocking:连接池达到最大连接数时,是否阻塞等待连接 - maxusage:单个连接最多被重复使用的次数 - setsession:会话参数列表 - ping:自动ping数据库连接,0表示不ping 3. 使用连接使用连接池时,通过pool.connection()方法获取数据库连接连接池会自动管理连接的创建、重用和释放,示例如下: ``` conn = pool.connection() cursor = conn.cursor() cursor.execute('SELECT * FROM your_table') result = cursor.fetchall() cursor.close() conn.close() ``` 这里获取连接使用了pool.connection()方法,而不是hive.Connection()方法。使用完毕后,需要关闭游标和连接,这样连接会自动返回连接池中。 注意,如果在使用连接池时出现错误,可能需要手动关闭连接池中的所有连接,以避免连接泄漏。可以使用pool.close()方法来关闭连接池中的所有连接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

象在舞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值