【问题标题】:Multiple query execution in cloudera impalacloudera impala 中的多个查询执行
【发布时间】:2013-07-08 04:52:03
【问题描述】:

是否可以在 impala 中同时执行多个查询?如果是,impala 是如何处理的?

【问题讨论】:

    标签: cloudera impala


    【解决方案1】:

    我当然会自己做一些测试,但我无法执行多个查询: 我正在使用 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)
    

    【讨论】:

      【解决方案2】:

      Impala 可以同时执行多个查询,只要它没有达到内存上限。

      【讨论】:

        【解决方案3】:

        您可以发出类似impala-shell -f <<file_name>> 的命令,其中文件有多个查询,每个完整的查询用分号 (;) 分隔

        【讨论】:

          【解决方案4】:

          如果您是 python 极客,您甚至可以尝试使用 impyla 包来创建多个连接并一次运行所有查询。

          pip install impyla

          【讨论】:

          • 我不认为 impyla 可以在同一个执行调用中执行多个语句。它使用 dbapi 标准,该标准不允许单次执行中的多个语句。如果您能够使用 impyla 执行此操作,请告诉我。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多