Подстановка параметров при выполнении скриптов 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)