Подстановка параметров при выполнении скриптов Hive из Python

Я должен выполнить следующий запрос к Hive из Python:

SELECT * FROM user WHERE age > ${hiveconf:AGE} 

На данный момент у меня есть следующий рабочий код:

import pyhs2
with pyhs2.connect(host='localhost',
                   port=60850,
                   authMechanism="PLAIN",
                   user='hduser',
                   database='default') as conn:
    with conn.cursor() as cur:
        cur.execute("SELECT * FRPM user WHERE age > ?", 10)

Так что я могу передать параметры в запрос с PyHs2. Но как я могу выполнить подстановку переменных из кода Python, чтобы не изменять исходный запрос (т.е. заменить ${hiveconf:AGE} с какой-то ценностью в чистом виде)?

2 ответа

Что -то вроде этого?:

def get_sql(substitution="${hiveconf:AGE}"):
    sql = "select * from bla where blub > {variable}"
    sql = sql.format(variable=substitution)
    return sql

результат:

get_sql()
"select * from bla where blub > ${hiveconf:AGE}"

get_sql("test")
"select * from bla where blub > test"

Для получения более подробной информации о синтаксисе формата смотрите здесь: https://docs.python.org/2/library/string.html

Вы можете использовать подпроцесс в Python. Вы можете сохранить sql в отдельном файле и выполнить его в следующем формате. Вы также можете добавить больше переменных

 import subprocess
 value1=your_value
 p=subprocess.Popen("hive -f /sql/file/location/script.hql"+" --hiveconf variable1="+value1,shell=True,
                 stdout=subprocess.PIPE,
                 stderr=subprocess.PIPE)
 out, err = p.communicate()

 if err==None:
    print "successfull"
else:
    print "not successfull"

Или, если вы хотите выполнить его, путь pyhs2 ниже - это формат для вашего оператора execute.

 cur.execute("SELECT * FROM user WHERE age > %d"% 10)
Другие вопросы по тегам