【发布时间】:2020-06-22 09:43:03
【问题描述】:
我在 HDFS 中有一些数据,我需要使用 python 访问这些数据,谁能告诉我如何使用 python 从 hive 访问数据?
【问题讨论】:
我在 HDFS 中有一些数据,我需要使用 python 访问这些数据,谁能告诉我如何使用 python 从 hive 访问数据?
【问题讨论】:
要安装,您需要以下库:
pip install sasl
pip install thrift
pip install thrift-sasl
pip install PyHive
如果您使用的是 Linux,则可能需要在运行上述程序之前单独安装 SASL。使用apt-get 或yum 或任何包管理器安装包libsasl2-dev。对于 Windows,有一些选项 on GNU.org。如果您已安装 xcode 开发人员工具 (xcode-select --install),则在 Mac 上应该可以使用 SASL
安装后,您可以像这样执行 hive 查询:
from pyhive import hive
conn = hive.Connection(host="YOUR_HIVE_HOST", port=PORT, username="YOU")
现在您已经有了 hive 连接,您可以选择如何使用它。您可以直接查询:
cursor = conn.cursor()
cursor.execute("SELECT cool_stuff FROM hive_table")
for result in cursor.fetchall():
use_result(result)
...或使用连接来制作 Pandas 数据框:
import pandas as pd
df = pd.read_sql("SELECT cool_stuff FROM hive_table", conn)
【讨论】:
您可以使用 hive 库从 python 访问 hive,因为您要导入 hive 类 从蜂巢导入 ThriftHive
下面的例子
import sys
from hive import ThriftHive
from hive.ttypes import HiveServerException
from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
try:
transport = TSocket.TSocket('localhost', 10000)
transport = TTransport.TBufferedTransport(transport)
protocol = TBinaryProtocol.TBinaryProtocol(transport)
client = ThriftHive.Client(protocol)
transport.open()
client.execute("CREATE TABLE r(a STRING, b INT, c DOUBLE)")
client.execute("LOAD TABLE LOCAL INPATH '/path' INTO TABLE r")
client.execute("SELECT * FROM r")
while (1):
row = client.fetchOne()
if (row == None):
break
print row
client.execute("SELECT * FROM r")
print client.fetchAll()
transport.close()
except Thrift.TException, tx:
print '%s' % (tx.message)
【讨论】:
如果您在 Windows 上使用pyodbc,则更简单的解决方案:
import pyodbc
import pandas as pd
# connect odbc to data source name
conn = pyodbc.connect("DSN=<your_dsn>", autocommit=True)
# read data into dataframe
hive_df = pd.read_sql("SELECT * FROM <table_name>", conn)
只要您有 ODBC 驱动程序和 DSN,这就是您所需要的。
【讨论】:
unixODBC 版本是否足够新,检查您的 $LD_LIBRARY_PATH 是否使用它的库,安装适当的ODBC驱动,在odbcinst.ini中引用该驱动,在odbc.ini中定义DSN,排除故障)