Как получить доступ к Hive через Python?

https://cwiki.apache.org/confluence/display/Hive/HiveClient представляется устаревшим.

Когда я добавляю это в /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?

18 ответов

Я считаю, что самый простой способ - это использовать PyHive.

Для установки вам понадобятся следующие библиотеки:

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

Обратите внимание, что хотя вы устанавливаете библиотеку как PyHiveВы импортируете модуль как pyhive, все строчные.

Если вы работаете в Linux, вам может потребоваться установить SASL отдельно перед запуском вышеуказанного. Установите пакет libsasl2-dev, используя apt-get или yum или любой другой менеджер пакетов для вашего дистрибутива. Для Windows есть несколько опций на GNU.org, вы можете скачать бинарный установщик. На Mac SASL должен быть доступен, если вы установили инструменты разработчика xcode (xcode-select --install в терминале)

После установки вы можете подключиться к Hive следующим образом:

from pyhive import hive
conn = hive.Connection(host="YOUR_HIVE_HOST", port=PORT, username="YOU")

Теперь, когда у вас есть соединение улья, у вас есть варианты, как его использовать. Вы можете просто прямой запрос:

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)

Я утверждаю, что вы используете 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

Внимание, вы можете установить python-devel.x86_64 cyrus-sasl-devel.x86_64 перед установкой pyhs2 с помощью pip.

Жаль, что это может помочь вам.

Ссылка: https://cwiki.apache.org/confluence/display/Hive/Setting+Up+HiveServer2

Ниже программа Python должна работать для доступа к таблицам кустов из Python:

    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"

Чтобы подключиться, используя имя пользователя / пароль и указав порты, код выглядит следующим образом:

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())

Вы можете использовать библиотеку улья, для которой вы хотите импортировать класс улья из куста, импортировать 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)

Обычная практика - запрещать пользователям загружать и устанавливать пакеты и библиотеки на узлах кластера. В этом случае решения @ python-starter и @goks работают идеально, если куст работает на одном узле. В противном случае можно использовать beeline вместо hive инструмент командной строки. Посмотреть детали

#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")

Вот общий подход, который облегчает мне задачу, потому что я продолжаю подключаться к нескольким серверам (SQL, Teradata, Hive и т. д.) из python. Следовательно, я использую разъем pyodbc. Вот несколько основных шагов для начала работы с pyodbc (если вы никогда не использовали его):

  • Предварительное условие: Вы должны иметь соответствующее соединение ODBC в настройках Windows, прежде чем следовать приведенным ниже шагам. Если у вас его нет, найдите то же самое здесь

После завершения: ШАГ 1. Установка pip: pip install pyodbc ( вот ссылка на скачивание соответствующего драйвера с сайта Microsoft)

ШАГ 2. Теперь импортируйте то же самое в ваш скрипт на python:

import pyodbc

ШАГ 3. Наконец, продолжайте и дайте детали подключения следующим образом:

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

Лучшая часть использования pyodbc - это то, что мне нужно импортировать только один пакет, чтобы подключиться практически к любому источнику данных.

Приведенные выше примеры немного устарели. Один новый пример здесь:

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, привязки Cyrus-SASL для Python

3. Thrift, привязки Python для системы Apache Thrift RPC

4.PyHive, интерфейс Python для Hive

Не забудьте изменить разрешение исполняемого файла

chmod +x test_hive2.py ./test_hive2.py

Жаль, что это поможет вам. Ссылка: https://sites.google.com/site/tingyusz/home/blogs/hiveinpython

Похоже на решение Эйчеу, но немного более подробно.

Вот альтернативное решение специально для hive2, которое не требует PyHive или установки общесистемных пакетов. Я работаю в среде linux, к которой у меня нет доступа с правами root, поэтому установка зависимостей SASL, как упоминалось в сообщении Тристина, не была для меня вариантом:

Если вы работаете в Linux, вам может потребоваться установить SASL отдельно перед запуском вышеуказанного. Установите пакет libsasl2-dev, используя apt-get или yum или любой другой менеджер пакетов для вашего дистрибутива.

В частности, это решение направлено на использование пакета python: JayDeBeApi. По моему опыту, установка этого дополнительного пакета поверх установки Python Anaconda 2.7 - все, что мне было нужно. Этот пакет использует Java (JDK). Я предполагаю, что это уже настроено.

Шаг 1: Установите JayDeBeApi

pip install jaydebeap

Шаг 2: Загрузите соответствующие драйверы для вашей среды:

Храните все файлы.jar в каталоге. Я буду называть этот каталог /path/to/jar/files/.

Шаг 3: Определите механизм аутентификации вашей системы:

В перечисленных решениях pyhive я видел PLAIN, указанный как механизм аутентификации, а также Kerberos. Обратите внимание, что URL-адрес вашего соединения jdbc будет зависеть от используемого вами механизма аутентификации. Я объясню решение Kerberos без передачи имени пользователя / пароля. Вот больше информации аутентификации Kerberos и опций.

Создайте билет 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()

Вы можете представить, что если вы хотите создать таблицу, вам не нужно будет "извлекать" результаты, но вместо этого можно отправить запрос на создание таблицы.

pyhs2 больше не поддерживается. Лучшая альтернатива это импила

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 - https://github.com/cloudera/hs2client/tree/master/python)

Еще немного информации об импыле:

Не смущайтесь, что некоторые из приведенных выше примеров говорят об Импале; просто измените порт на 10000 (по умолчанию) для HiveServer2, и он будет работать так же, как и в примерах Impala. Это тот же протокол (Thrift), который используется как для Impala, так и для Hive.

Похож на @ Python-стартер решение. Но пакет команд недоступен на 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")

Самый простой метод | Использование sqlalchemy

Требования:

  • pip установить 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)

Самый простой способ — использовать 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")

Теперь, когда у вас есть подключение к улью, у вас есть варианты, как его использовать. Вы можете просто запросить:

      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)

Вы можете использовать пакет Python JayDeBeApi для создания соединения DB-API из драйвера Hive или Impala JDBC, а затем передать соединение в функцию pandas.read_sql, чтобы вернуть данные в pandas dataframe.

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()

Это может быть быстрый взлом для подключения улья и питона,

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

Вывод: список кортежей

Ни один из ответов не демонстрирует, как получить и распечатать заголовки таблицы. Изменен стандартный пример 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())

Я решил ту же проблему с вами , вот мое рабочее окружение (Система: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' . Тогда это работает хорошо, любые вопросы, пожалуйста, дайте мне знать

Используя клиентский драйвер 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.

Другие вопросы по тегам