Множественное выполнение запросов в Cloudera Impala

Можно ли выполнять несколько запросов одновременно в импале? Если да, то как импала справляется с этим?


person Anirudh    schedule 08.07.2013    source источник


Ответы (4)


Я бы, конечно, провел некоторые тесты самостоятельно, но мне не удалось выполнить несколько запросов: я использовал соединение с Impala и читал запрос из файла .sql. Это работает для одиночных команд.

from impala.dbapi import connect
# actual server and port changed for this post for security
conn=connect(host='impala server', port=11111,auth_mechanism="GSSAPI")
cursor = conn.cursor()
cursor.execute((open("sandbox/z_temp.sql").read()))

Это ошибка, которую я получил.

 HiveServer2Error: AnalysisException: Syntax error in line 2:

Вот как выглядел SQL в файле .sql.

Select * FROM database1.table1;
Select * FROM database1.table2;

Я смог запустить несколько команд с командами SQL в отдельных файлах .sql, перебирая все файлы .sql в указанной папке.

#Create list of file names for recon .sql files this will be sorted
#Numbers at begining of filename are important to sort so that files will be executed in correct order

file_names = glob.glob('folder/.sql')

asc_names = sorted(file_names, reverse = False)
filename = ""
for file_name in asc_names:
  str_filename = str(file_name)
  print(filename)
  query = (open(str_filename).read())

  cursor = conn.cursor()

# creates an error log dataframe to print, or write to file at end of job.

  try:
# Each SQL command must be executed seperately
    cursor.execute(query)
    df_id= pd.DataFrame([{'test_name': str_filename[-40:], 'test_status': 'PASS'}])
    df_log = df_log.append(df_id, ignore_index=True)

  except:
    df_id= pd.DataFrame([{'test_name': str_filename[-40:], 'test_status': 'FAIL'}])
    df_log = df_log.append(df_id, ignore_index=True)
    continue

Другой способ сделать это — поместить все операторы SQL в один файл .sql, разделенные ; затем переберите операторы разделения файла .sql на ; бегут по одному.

from impala.dbapi import connect
from impala.util import as_pandas

conn=connect(host='impalaserver', port=11111, auth_mechanism='GSSAPI')
cursor = conn.cursor()

# split SQL statements from one file seperated by ';', Note: last command will not have semicolon at end.

sql_file = open("sandbox/temp.sql").read()
sql = sql_file.split(';')
for cmd in sql:
# This gets rid of the non printing characters you may have
      cmd = cmd.replace('/r','')
      cmd = cmd.replace('/n','')
# This runs your SQL commands one at a time.
      cursor.execute(cmd)
  print(cmd)
person Brian DS    schedule 16.12.2017

Impala может выполнять несколько запросов одновременно, если не достигает предела памяти.

person interskh    schedule 17.10.2013

Вы можете ввести команду типа impala-shell -f <<file_name>>, где файл содержит несколько запросов, каждый полный запрос разделен точкой с запятой (;)

person Raunak Jhawar    schedule 20.04.2014

Если вы являетесь фанатом Python, вы даже можете попробовать пакет impyla для создания нескольких подключений и одновременного выполнения всех ваших запросов.

pip install impyla

person lalith kkvn    schedule 18.03.2015
comment
Я не думаю, что impyla может выполнять несколько операторов в одном вызове выполнения. Он использует стандарты dbapi, которые не позволяют выполнять несколько операторов за один раз. Пожалуйста, дайте мне знать, если вы можете выполнить это с помощью impyla. - person Kishan Pandey; 15.11.2019