【问题标题】:How to Access Hive via Python?如何通过 Python 访问 Hive?
【发布时间】:2014-02-17 16:13:26
【问题描述】:

https://cwiki.apache.org/confluence/display/Hive/HiveClient#HiveClient-Python 似乎已经过时了。

当我将它添加到 /etc/profile 时:

export PYTHONPATH=$PYTHONPATH:/usr/lib/hive/lib/py

然后我可以按照链接中列出的方式进行导入,但 from hive import ThriftHive 除外,它实际上需要:

from hive_service import ThriftHive

接下来示例中的端口是 10000,当我尝试时导致程序挂起。默认的 Hive Thrift 端口是 9083,它停止了挂起。

所以我是这样设置的:

from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
try:
    transport = TSocket.TSocket('<node-with-metastore>', 9083)
    transport = TTransport.TBufferedTransport(transport)
    protocol = TBinaryProtocol.TBinaryProtocol(transport)
    client = ThriftHive.Client(protocol)
    transport.open()
    client.execute("CREATE TABLE test(c1 int)")

    transport.close()
except Thrift.TException, tx:
    print '%s' % (tx.message)

我收到以下错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/hive/lib/py/hive_service/ThriftHive.py", line 68, in execute
self.recv_execute()
File "/usr/lib/hive/lib/py/hive_service/ThriftHive.py", line 84, in recv_execute
raise x
thrift.Thrift.TApplicationException: Invalid method name: 'execute'

但检查 ThriftHive.py 文件会发现该方法在 Client 类中执行。

如何使用 Python 访问 Hive?

【问题讨论】:

标签: python hadoop hive


【解决方案1】:

您可以使用 hive 库,因为您想从 hive import ThriftHive 导入 hive 类

试试这个例子:

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)

【讨论】:

  • 嗨,纳文。我为 year+ 的回复道歉。当我为我的一个表尝试此示例时,client.fetchOne() 命令似乎返回一个字符串,而不是由列索引的行/数组/dict 对象。这也是你的印象吗?我希望能够访问各个列。问候。
【解决方案2】:

我断言您使用的是 HiveServer2,这就是导致代码不起作用的原因。

您可以使用 pyhs2 正确访问您的 Hive,示例代码如下:

import pyhs2

with pyhs2.connect(host='localhost',
               port=10000,
               authMechanism="PLAIN",
               user='root',
               password='test',
               database='default') as conn:
    with conn.cursor() as cur:
        #Show databases
        print cur.getDatabases()

        #Execute query
        cur.execute("select * from table")

        #Return column info from query
        print cur.getSchema()

        #Fetch table results
        for i in cur.fetch():
            print i

注意,在使用 pip 安装 pyhs2 之前,您可以先安装 python-devel.x86_64 cyrus-sasl-devel.x86_64。

希望这对您有所帮助。

参考:https://cwiki.apache.org/confluence/display/Hive/Setting+Up+HiveServer2#SettingUpHiveServer2-PythonClientDriver

【讨论】:

  • 感谢您,我在 CentOS 6 中使用 pip 安装 pyhs2 时遇到问题,但您建议的 YUM 库可以解决问题。快速评论一下,在上面的示例代码中,您需要将 database='default') 下面的所有内容缩进为 conn: 以使其正常工作。这里有一些额外的文档:github.com/BradRuderman/pyhs2
  • 我收到此错误。我想知道你是否对此有所了解? github.com/BradRuderman/pyhs2/issues/32
  • 在我写这个问题的时候,我不在 HiveServer2 上。但是我们昨天才安装它,我可以确认这个答案适用于 HS2。
  • 太棒了.. 这种方法也适用于 Hive Server 2 服务器吗?这适用于kerberized集群吗?谢谢。
  • 您将如何使用 kerberos 身份验证而不是普通身份验证?
【解决方案3】:

上面的例子有点过时了。 这里有一个新的例子:

import pyhs2 as hive
import getpass
DEFAULT_DB = 'default'
DEFAULT_SERVER = '10.37.40.1'
DEFAULT_PORT = 10000
DEFAULT_DOMAIN = 'PAM01-PRD01.IBM.COM'

u = raw_input('Enter PAM username: ')
s = getpass.getpass()
connection = hive.connect(host=DEFAULT_SERVER, port= DEFAULT_PORT, authMechanism='LDAP', user=u + '@' + DEFAULT_DOMAIN, password=s)
statement = "select * from user_yuti.Temp_CredCard where pir_post_dt = '2014-05-01' limit 100"
cur = connection.cursor()

cur.execute(statement)
df = cur.fetchall() 

除了标准的 python 程序之外,还需要安装一些库以允许 Python 建立与 Hadoop 数据库的连接。

1.Pyhs2,Python Hive Server 2 客户端驱动

2.Sasl,Python 的 Cyrus-SASL 绑定

3.Thrift,Apache Thrift RPC 系统的 Python 绑定

4.PyHive,Hive 的 Python 接口

记得更改可执行文件的权限

chmod +x test_hive2.py ./test_hive2.py

希望对您有所帮助。 参考:https://sites.google.com/site/tingyusz/home/blogs/hiveinpython

【讨论】:

    【解决方案4】:

    下面的python程序应该可以从python访问hive表:

    import commands
    
    cmd = "hive -S -e 'SELECT * FROM db_name.table_name LIMIT 1;' "
    
    status, output = commands.getstatusoutput(cmd)
    
    if status == 0:
       print output
    else:
       print "error"
    

    【讨论】:

    • 当您无法在服务器上安装外部 yum 或 pip 软件包时,+1 可能会在某些快速而肮脏的情况下很好。
    • @python-starter ,您的方法仅在配置单元位于安装了 python 的同一台服务器上时才有效。如果您要访问远程服务器上的配置单元表,我想还需要其他的东西。
    • @ML_Passion 可能只是多行 bash 代码来处理远程问题。但是解析结果将是真正的地狱(尤其是当尝试使用亚洲语言和来自其他团队的奇怪脏数据时)
    【解决方案5】:

    我相信最简单的方法是使用 PyHive。

    要安装,您需要以下库:

    pip install sasl
    pip install thrift
    pip install thrift-sasl
    pip install PyHive
    

    请注意,虽然您将库安装为PyHive,但您将模块导入为pyhive,全部小写。

    如果您使用的是 Linux,则可能需要在运行上述程序之前单独安装 SASL。使用 apt-get 或 yum 或任何用于您的发行版的包管理器安装包 libsasl2-dev。对于 Windows,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)
    

    【讨论】:

    • 仅供参考,目前 sasl 不适用于 python 3。其他信息 here
    • 我在 Debian 上连接到 HiveServer2 时遇到了一些麻烦。错误是:“SASL 身份验证失败:未找到有价值的机甲”。我必须安装 libsasl2-modules 包(通过 apt-get)才能使其正常工作。
    • 您说过“对于 Windows,GNU.org 上有一些选项,您可以下载二进制安装程序”。你能提供链接吗?因为我还有一个问题.. stackoverflow.com/questions/42210901/…
    • 当我尝试通过 Pip 安装 sasl 时,我发现了一个错误:sasl/saslwrapper.h:22:23: fatal error: sasl/sasl.h: No such file or directory。通过apt-get安装libsasl2-dev,安装正常。
    • 这太有帮助了!谢谢
    【解决方案6】:

    pyhs2 不再维护。更好的选择是 impyla

    不要对下面关于 Impala 的一些示例感到困惑;只需将 HiveServer2 的端口更改为 10000(默认),它的工作方式与 Impala 示例相同。它与 Impala 和 Hive 使用的协议 (Thrift) 相同。

    https://github.com/cloudera/impyla

    它比 pyhs2 有更多的功能,例如,它具有 Kerberos 身份验证,这对我们来说是必须的。

    from impala.dbapi import connect
    conn = connect(host='my.host.com', port=10000)
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM mytable LIMIT 100')
    print cursor.description  # prints the result set's schema
    results = cursor.fetchall()
    
    ##
    cursor.execute('SELECT * FROM mytable LIMIT 100')
    for row in cursor:
        process(row)
    

    Cloudera 现在在 hs2 客户端 https://github.com/cloudera/hs2client 上投入更多精力 这是一个 C/C++ HiveServer2/Impala 客户端。如果您向 python 推送大量数据/从 python 推送大量数据,这可能是一个更好的选择。 (也有 Python 绑定 - https://github.com/cloudera/hs2client/tree/master/python

    有关 impyla 的更多信息:

    【讨论】:

    • 我有一个奇怪的问题。如果我给“select * from limit 10”它工作正常。但是,如果我给出“select * from
      where hostname=''”,它就会失败。它说 raise NotSupportedError("Hive does not have transactions") # pragma: no cover 知道为什么会这样吗?我可以在 Ambari 上执行相同的查询。
    • 我得到了同样的错误。不知道从哪里开始寻找。
    • Impala 的主要角色是 Impala 的接口,它不支持事务,因此当您尝试提交/回滚等时出现 NotImplemented 错误。提交 github.com/cloudera/impyla/issues/372 改进请求
    【解决方案7】:

    这可以快速连接 hive 和 python,

    from pyhive import hive
    cursor = hive.connect('YOUR_HOST_NAME').cursor()
    cursor.execute('SELECT * from table_name LIMIT 5',async=True)
    print cursor.fetchall()
    

    输出:元组列表

    【讨论】:

      【解决方案8】:

      您可以使用 python JayDeBeApi 包从 Hive 或 Impala JDBC 驱动程序创建 DB-API 连接,然后将连接传递给 pandas.read_sql 函数以在 pandas 数据帧中返回数据。

      import jaydebeapi
      # Apparently need to load the jar files for the first time for impala jdbc driver to work 
      conn = jaydebeapi.connect('com.cloudera.hive.jdbc41.HS2Driver',
      ['jdbc:hive2://host:10000/db;AuthMech=1;KrbHostFQDN=xxx.com;KrbServiceName=hive;KrbRealm=xxx.COM', "",""],
      jars=['/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/HiveJDBC41.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/TCLIServiceClient.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/commons-codec-1.3.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/commons-logging-1.1.1.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/hive_metastore.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/hive_service.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/httpclient-4.1.3.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/httpcore-4.1.3.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/libfb303-0.9.0.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/libthrift-0.9.0.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/log4j-1.2.14.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/ql.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/slf4j-api-1.5.11.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/slf4j-log4j12-1.5.11.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/zookeeper-3.4.6.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/ImpalaJDBC41.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/TCLIServiceClient.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/commons-codec-1.3.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/commons-logging-1.1.1.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/hive_metastore.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/hive_service.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/httpclient-4.1.3.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/httpcore-4.1.3.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/libfb303-0.9.0.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/libthrift-0.9.0.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/log4j-1.2.14.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/ql.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/slf4j-api-1.5.11.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/slf4j-log4j12-1.5.11.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/zookeeper-3.4.6.jar'
      ])
      
      # the previous call have initialized the jar files, technically this call needs not include the required jar files
      impala_conn = jaydebeapi.connect('com.cloudera.impala.jdbc41.Driver',
      ['jdbc:impala://host:21050/db;AuthMech=1;KrbHostFQDN=xxx.com;KrbServiceName=impala;KrbRealm=xxx.COM',"",""],
      jars=['/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/HiveJDBC41.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/TCLIServiceClient.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/commons-codec-1.3.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/commons-logging-1.1.1.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/hive_metastore.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/hive_service.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/httpclient-4.1.3.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/httpcore-4.1.3.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/libfb303-0.9.0.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/libthrift-0.9.0.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/log4j-1.2.14.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/ql.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/slf4j-api-1.5.11.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/slf4j-log4j12-1.5.11.jar',
      '/hadp/opt/jdbc/hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/zookeeper-3.4.6.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/ImpalaJDBC41.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/TCLIServiceClient.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/commons-codec-1.3.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/commons-logging-1.1.1.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/hive_metastore.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/hive_service.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/httpclient-4.1.3.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/httpcore-4.1.3.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/libfb303-0.9.0.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/libthrift-0.9.0.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/log4j-1.2.14.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/ql.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/slf4j-api-1.5.11.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/slf4j-log4j12-1.5.11.jar',
      '/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/zookeeper-3.4.6.jar'
      ])
      
      import pandas as pd
      df1 = pd.read_sql("SELECT * FROM tablename", conn)
      df2 = pd.read_sql("SELECT * FROM tablename", impala_conn)
      
      conn.close()
      impala_conn.close()
      

      【讨论】:

        【解决方案9】:

        要使用用户名/密码并指定端口进行连接,代码如下所示:

        from pyhive import presto
        
        cursor = presto.connect(host='host.example.com',
                            port=8081,
                            username='USERNAME:PASSWORD').cursor()
        
        sql = 'select * from table limit 10'
        
        cursor.execute(sql)
        
        print(cursor.fetchone())
        print(cursor.fetchall())
        

        【讨论】:

          【解决方案10】:

          类似于 eycheu 的解决方案,但更详细一些。

          这是专门针对 hive2 的替代解决方案,不需要需要 PyHive 或安装系统范围的软件包。我正在使用我没有 root 访问权限的 linux 环境,因此安装 Tristin 帖子中提到的 SASL 依赖项对我来说不是一个选项:

          如果您使用的是 Linux,则可能需要在运行上述程序之前单独安装 SASL。使用 apt-get 或 yum 或任何用于您的发行版的包管理器安装包 libsasl2-dev。

          具体来说,此解决方案侧重于利用 python 包:JayDeBeApi。根据我在 python Anaconda 2.7 安装之上安装这个额外包的经验,我只需要安装这个额外的包。这个包利用了 java (JDK)。我假设已经设置好了。

          第 1 步:安装 JayDeBeApi

          pip install jaydebeap
          

          第 2 步:下载适合您环境的驱动程序

          将所有 .jar 文件存储在一个目录中。我将此目录称为 /path/to/jar/files/。

          第 3 步:确定您的系统身份验证机制:

          在列出的 pyhive 解决方案中,我看到 PLAIN 和 Kerberos 一样被列为身份验证机制。 请注意,您的 jdbc 连接 URL 将取决于您使用的身份验证机制。我将在不传递用户名/密码的情况下解释 Kerberos 解决方案Here is more information Kerberos authentication and options.

          如果尚未创建 Kerberos 票证,则创建一个

          $ kinit
          

          可以通过klist查看门票。

          您现在已准备好通过 python 建立连接:

          import jaydebeapi
          import glob
          # Creates a list of jar files in the /path/to/jar/files/ directory
          jar_files = glob.glob('/path/to/jar/files/*.jar')
          
          host='localhost'
          port='10000'
          database='default'
          
          # note: your driver will depend on your environment and drivers you've
          # downloaded in step 2
          # this is the driver for my environment (jdbc3, hive2, cloudera enterprise)
          driver='com.cloudera.hive.jdbc3.HS2Driver'
          
          conn_hive = jaydebeapi.connect(driver,
                  'jdbc:hive2://'+host+':' +port+'/'+database+';AuthMech=1;KrbHostFQDN='+host+';KrbServiceName=hive'
                                     ,jars=jar_files)
          

          如果您只关心阅读,那么您可以通过 eycheu 的解决方案轻松地将其直接读入熊猫的数据框:

          import pandas as pd
          df = pd.read_sql("select * from table", conn_hive)
          

          否则,这里有一个更通用的通信选项:

          cursor = conn_hive.cursor()
          sql_expression = "select * from table"
          cursor.execute(sql_expression)
          results = cursor.fetchall()
          

          您可以想象,如果您想创建一个表,您不需要“获取”结果,而是可以提交一个创建表查询。

          【讨论】:

          • 这是一个很好的解决方案。 jaydebeapi 方法唯一让我担心的是数据库连接需要生成一个 jvm——这是一个巨大的开销。此外,jaydebeapi 在 pip 注册表上仍被标记为“测试版”,并且在过去几年没有更新。
          【解决方案11】:

          类似于@python-starter 解决方案。但是,命令包在 python3.x 上不可用。所以替代解决方案是在 python3.x 中使用子进程

          import subprocess
          
          cmd = "hive -S -e 'SELECT * FROM db_name.table_name LIMIT 1;' "
          
          status, output = subprocess.getstatusoutput(cmd)
          
          if status == 0:
             print(output)
          else:
             print("error")
          

          【讨论】:

          • 我正在使用 python 3(虚拟环境)虽然我收到此错误AttributeError: module 'subprocess' has no attribute 'getstatusoutput'
          • @SandeepSingh 检查你的工作目录中是否有任何名为“subprocess”的python模块
          【解决方案12】:

          通常的做法是禁止用户在集群节点上下载和安装包和库。在这种情况下,如果 hive 在同一节点上运行,@python-starter 和 @goks 的解决方案可以完美运行。否则,可以使用beeline 代替hive 命令行工具。见details

          #python 2
          import commands
          
          cmd = 'beeline -u "jdbc:hive2://node07.foo.bar:10000/...<your connect string>" -e "SELECT * FROM db_name.table_name LIMIT 1;"'
          
          status, output = commands.getstatusoutput(cmd)
          
          if status == 0:
             print output
          else:
             print "error"
          

          .

          #python 3
          import subprocess
          
          cmd = 'beeline -u "jdbc:hive2://node07.foo.bar:10000/...<your connect string>" -e "SELECT * FROM db_name.table_name LIMIT 1;"'
          
          status, output = subprocess.getstatusoutput(cmd)
          
          if status == 0:
             print(output)
          else:
             print("error")
          

          【讨论】:

            【解决方案13】:

            我和你解决了同样的问题,这是我的运行环境( 系统:linux 版本:python 3.6 封装:Pyhive) 请参考我的回答如下:

            from pyhive import hive
            conn = hive.Connection(host='149.129.***.**', port=10000, username='*', database='*',password="*",auth='LDAP')
            

            关键是添加参考密码&auth,同时设置auth等于'LDAP'。然后效果很好,有任何问题请告诉我

            【讨论】:

              【解决方案14】:

              通过使用 Python 客户端驱动程序

              pip install pyhs2
              

              然后

              import pyhs2
              
              with pyhs2.connect(host='localhost',
                             port=10000,
                             authMechanism="PLAIN",
                             user='root',
                             password='test',
                             database='default') as conn:
              with conn.cursor() as cur:
                  #Show databases
                  print cur.getDatabases()
              
                  #Execute query
                  cur.execute("select * from table")
              
                  #Return column info from query
                  print cur.getSchema()
              
                  #Fetch table results
                  for i in cur.fetch():
                      print i
              

              参考:https://cwiki.apache.org/confluence/display/Hive/Setting+Up+HiveServer2#SettingUpHiveServer2-PythonClientDriver

              【讨论】:

                【解决方案15】:

                这是一种通用方法,它使我很容易,因为我一直从 python 连接到多个服务器(SQL、Teradata、Hive 等)。因此,我使用 pyodbc 连接器。以下是使用 pyodbc 的一些基本步骤(如果您从未使用过它):

                • 先决条件:在执行以下步骤之前,您应该在 Windows 设置中拥有相关的 ODBC 连接。没有的话,找同样的here

                一旦完成: 步骤 1. pip 安装: pip install pyodbc (here's the link to download the relevant driver from Microsoft's website)

                步骤 2. 现在,在你的 python 脚本中导入相同的内容:

                import pyodbc
                

                STEP 3. 最后,继续并给出连接细节如下:

                conn_hive = pyodbc.connect('DSN = YOUR_DSN_NAME , SERVER = YOUR_SERVER_NAME, UID = USER_ID, PWD = PSWD' )
                

                使用 pyodbc 最好的部分是我只需导入一个包即可连接到几乎任何数据源。

                【讨论】:

                  【解决方案16】:

                  没有一个答案演示了如何获取和打印表格标题。修改了被广泛使用和积极维护的PyHive的标准示例。

                  from pyhive import hive
                  cursor = hive.connect(host="localhost", 
                                        port=10000, 
                                        username="shadan", 
                                        auth="KERBEROS", 
                                        kerberos_service_name="hive"
                                        ).cursor()
                  cursor.execute("SELECT * FROM my_dummy_table LIMIT 10")
                  columnList = [desc[0] for desc in cursor.description]
                  headerStr = ",".join(columnList)
                  headerTuple = tuple(headerStr.split (",")
                  print(headerTuple)
                  print(cursor.fetchone())
                  print(cursor.fetchall())
                  

                  【讨论】:

                    【解决方案17】:

                    最简单的方法 |使用sqlalchemy

                    要求:

                    • pip install pyhive

                    代码:

                    import pandas as pd
                    from sqlalchemy import create_engine
                    
                    SECRET = {'username':'lol', 'password': 'lol'}
                    user_name = SECRET.get('username')
                    passwd = SECRET.get('password')
                    
                    host_server = 'x.x.x.x'
                    port = '10000'
                    database = 'default'
                    conn = f'hive://{user_name}:{passwd}@{host_server}:{port}/{database}'
                    engine = create_engine(conn, connect_args={'auth': 'LDAP'})
                    
                    query = "select * from tablename limit 100"
                    data = pd.read_sql(query, con=engine)
                    print(data)
                    

                    【讨论】:

                      【解决方案18】:

                      最简单的方法是使用 PyHive。

                      要安装,您需要以下库:

                      pip install sasl
                      pip install thrift
                      pip install thrift-sasl
                      pip install PyHive
                      

                      安装后,你可以像这样连接到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)
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2015-11-25
                        • 2016-03-17
                        • 2011-04-15
                        • 2018-01-15
                        • 1970-01-01
                        • 2020-09-05
                        相关资源
                        最近更新 更多