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

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?

    10 Solutions collect form web for “Как получить доступ к улью через Python?”

    Я считаю, что самый простой способ – использовать 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-select --install ( xcode-select --install в Terminal)

    После установки вы можете подключиться к 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#SettingUpHiveServer2-PythonClientDriver

    Ниже python-программа должна работать для доступа к таблицам hive из 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" 

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

    Приведенные выше примеры немного устарели. Вот еще один пример:

     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, клиентский сервер Piveon Hive Server 2

    2.Sasl, привязки Cyrus-SASL для Python

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

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

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

    chmod + x test_hive2.py ./test_hive2.py

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

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

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

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

    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 )

    Дополнительная информация о impyla:

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

    Вы можете использовать пакет python JayDeBeApi для создания соединения DB-API из драйвера Hive или Impala JDBC, а затем передать соединение с функцией pandas.read_sql для возврата данных в dataframe 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() 

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

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

    Результат: список кортежей

    Подобно решению eycheu, но немного более подробно.

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

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

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

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

     pip install jaydebeap 

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

    • Вот ссылка на банки, необходимые для среды CDH предприятия
    • Другое сообщение, в котором говорится о том, где найти драйверы jdbc для Apache Hive

    Храните все файлы .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) по 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) 

    Если вы только заботитесь о чтении, вы можете легко прочитать его прямо в dataframe панды с помощью решения 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() 

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

      Python - лучший язык программирования в мире.