前言
之前在读hive数据的时候,经常使用读hdfs parquet文件的方法,虽然封装函数一样,调用起来也方便,但是总觉得不得劲,既然我需要的是hive数据,为何不直接读hive呢?刚好今天又遇到了这个问题,就花了两个小时,研究了不同的方法,mark一下,以便查阅。好了,进入正题,下面列出了两种方法,但大体上差不多,可根据需要选择。另外,还看到使用 impala 操作hive的方法,没有详细研究,有空再看看。
pyhive
在网上查了一下,使用比较多的是 pyhs2 和 pyhive,看了下pyhs2已经好多年没有更新了,转而研究pyhive,操作步骤如下:
-
conda install sasl ##网上很多资料都是使用pip安装,但是大多会遇到下面的错误信息,强烈建议使用conda安装。这里提示一下,不仅仅是这个包,其他包遇到pip不能安装的时候,也使用conda试试,因为pip有些包需要gcc编译等,对环境要求比较高。
ERROR: Command errored out with exit status 1: anaconda3/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-_iihdxsa/sasl/setup.py'"'"'; __file__='"'"'/tmp/pip-install-_iihdxsa/sasl/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-kukgvvno/install-record.txt --single-version-externally-managed --compile Check the logs for full command output.
- pip install thrift-sasl
- pip install PyHive
测试程序如下:
from pyhive import hive
import pandas as pd
cursor = hive.connect(host=IP,port=10000, auth="LDAP", database="default", username="test", password="test").cursor()
cursor.execute('select * from test_table')
data = cursor.fetchall()
columns = [col[0].split('.')[-1] for col in cursor.description]
data = pd.DataFrame(data=data, columns=columns)
print(data.shape)
因为我的hive是采用LDAP认证的,所以需要提供用户名、密码,如果不是这种方式,参考官方demo稍微改一下就可以了。另外,大家可能看到使用 hive.Connection 的方式连接hive的,其实这种方法和 hive.connect 一样,看一下源码就明白了,后者调用了前者。
pandas
采用pandas读取hive是偶然间在网上看到的,测试后发现挺好用的,毕竟pandas好用。首先看一下自己是否有 SQLAlchemy 这个包,如果没有执行下面命令安装:
pip install SQLAlchemy
测试程序如下:
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('hive://username:passwd@IP:10000/default?auth=LDAP')
data = pd.read_sql("SELECT * FROM test_table",con=engine)
print(data.shape)
上述程序同样使用了LDAP认证,pandas的源码中同样提供了使用demo,看一下就明白了。SQLAlchemy 的使用请看参考资料链接。
参考资料
https://docs.sqlalchemy.org/en/13/