交互式查询工具——Impala

Posted 小企鹅推雪球!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了交互式查询工具——Impala相关的知识,希望对你有一定的参考价值。

文章目录

Impala概述

  1. Impala是用于处理存储在Hadoop集群中的大量数据的MPP(大规模并行处理)SQL查询引擎。与其他Hadoop的SQL引擎相比,它提供了高性能和低延迟。
  2. Impala是性能最高的SQL引擎(提供类似RDBMS的体验),它提供了访问存储在Hadoop分布式文件系统中的数据的最快方法。
  3. 使用Impala,与其他SQL引擎(如Hive)相比,用户可以使用SQL查询以更快的方式与HDFS或HBase进行通信。
  4. Impala可以读取Hadoop使用的几乎所有文件格式,如Parquet,Avro,RCFile
  5. Impala将相同的元数据,SQL语法(Hive SQL),ODBC驱动程序和用户界面(Hue Beeswax)用作Apache Hive,为面向批量或实时查询提供熟悉且统一的平台。
  6. 与Apache Hive不同,Impala不基于MapReduce算法。 它实现了一个基于守护进程的分布式架构,它负责在同一台机器上运行的查询执行的所有方面。它减少了使用MapReduce的延迟,这使Impala比Apache Hive快。

Impala的优点

  1. 使用impala,可以极快的速度处理存储在HDFS中的数据。
  2. 由于在数据驻留(在Hadoop集群上)时执行数据处理,因此在使用Impala时,不需要对存储在Hadoop上的数据进行数据转换和数据移动。

Impala的功能

  1. Impala支持内存中数据处理,即,它访问/分析存储在Hadoop数据节点上的数据,而无需数据移动。
  2. 与其他SQL引擎相比,Impala为HDFS中的数据提供了更快的访问。
  3. Impala支持各种文件格式,如LZO,序列文件,Avro,RCFile和Parquet。

Impala的缺点

  1. Impala不提供任何对序列化和反序列化的支持。
  2. Impala只能读取文本文件,而不能读取自定义二进制文件。
  3. 每当新的记录/文件被添加到HDFS中的数据目录时,该表需要被刷新。

impala 架构

  1. Impala是在Hadoop集群中的许多系统上运行的MPP(大规模并行处理)查询执行引擎。 与传统存储系统不同,impala与其存储引擎解耦。
  2. impala 有三个主要组件,即Impala daemon(Impalad),Impala Statestore和Impala元数据或metastore。

Impala daemon(Impalad)

  1. Impala daemon(也称为impalad)在安装Impala的每个节点上运行。 它接受来自各种接口的查询,如impala shell,hue browser等…并处理它们。每当将查询提交到特定节点上的impalad时,该节点充当该查询的“协调器节点”。
  2. Impalad还在其他节点上运行多个查询。 接受查询后,Impalad读取和写入数据文件,并通过将工作分发到Impala集群中的其他Impala节点来并行化查询。
  3. 当查询处理各种Impalad实例时,所有查询都将结果返回到中央协调节点。根据需要,可以将查询提交到专用Impalad或以负载平衡方式提交到集群中的另一Impalad。

Impala 存储的状态

  1. Impala有另一个称为Impala State存储的重要组件,它负责检查每个Impalad的运行状况,然后经常将每个Impala Daemon运行状况中继给其他守护程序
  2. Impala State存储守护进程的名称为存储的状态。 Impalad将其运行状况报告给Impala State存储守护程序,即存储的状态
  3. 在由于任何原因导致节点故障的情况下,Statestore将更新所有其他节点关于此故障,并且一旦此类通知可用于其他impalad,则其他Impala守护程序不会向受影响的节点分配任何进一步的查询。

Impala元数据和元存储

  1. Impala使用传统的mysql或PostgreSQL数据库来存储表定义。 诸如表和列信息和表定义的重要细节存储在称为元存储的集中式数据库中
  2. 每个Impala节点在本地缓存所有元数据。 减少处理极大量的数据和/或许多分区时,获得表特定的元数据需要的时间
  3. 当表定义或表数据更新时,其他Impala后台进程必须通过检索最新元数据来更新其元数据缓存,然后对相关表发出新查询

impala 创建数据库

  1. 在Impala中,数据库是一种在其命名空间中保存相关表,视图和函数的构造。 它在HDFS中表示为目录树; 它包含表分区和数据文件。
  2. 创建数据块:CREATE DATABASE IF NOT EXISTS database_name;IF NOT EXISTS是一个可选的子句。 如果我们使用此子句,则只有在没有具有相同名称的现有数据库时,才会创建具有给定名称的数据库。
  3. 为了在HDFS文件系统中创建数据库,需要指定要创建数据库的位置:CREATE DATABASE IF NOT EXISTS database_name LOCATION hdfs_path;

impala 删除数据库

  1. Impala的DROP DATABASE语句用于从Impala中删除数据库。 在删除数据库之前,建议从中删除所有表

  2. 删除数据库语法:IF EXISTS是一个可选子句。 如果我们在存在具有给定名称的数据库时使用此子句,则它将被删除。 如果没有具有给定名称的现有数据库,则不执行任何操作。

    DROP (DATABASE|SCHEMA) [IF EXISTS] 
    	database_name [RESTRICT | 
    CASCADE] [LOCATION hdfs_path];
    
  3. 一般来说,要删除数据库,您需要手动删除其中的所有表。 如果使用级联,Impala会在删除指定数据库中的表之前删除它。

  4. 一个数据库命名为sample,它包含两个表,即student和test,直接删除会报错,使用级联,可以直接删除此数据库(无需手动删除其内容)

    DROP database sample cascade; 
    

impala CREATE TABLE语句

  1. CREATE TABLE语句用于在Impala中的所需数据库中创建新表。 创建基本表涉及命名表并定义其列和每列的数据类型
create table IF NOT EXISTS database_name.table_name (
   column1 data_type,
   column2 data_type,
   column3 data_type,
   ………
   columnN data_type
);
在HDFS文件系统中创建数据库,需要指定要创建数据库的位置
CREATE DATABASE IF NOT EXISTS database_name LOCATION hdfs_path;

impala Insert语句

  1. Impala的INSERT语句有两个子句 - into和overwrite。 Insert语句with into子句用于将新记录添加到数据库中的现有表中。

    insert into table_name (column1, column2, column3,...columnN)
    
    values (value1, value2, value3,...valueN);
    
  2. 使用overwrite子句的语覆盖表中的数据, 覆盖的记录将从表中永久删除

    Insert overwrite table_name values (value1, value2, value2);
    

impala Describe语句

  1. Impala中的describe语句用于提供表的描述。 此语句的结果包含有关表的信息,例如列名称及其数据类型
  2. Impala describe语句的语法:Describe table_name;

impala ALTER TABLE

  1. Impala中的Alter table语句用于对给定表执行更改。 使用此语句,我们可以添加,删除或修改现有表中的列,也可以重命名它们
  2. 更改表的名称:ALTER TABLE [old_db_name.]old_table_name RENAME TO [new_db_name.]new_table_name
  3. 向表中添加列:ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...])
  4. 从表中删除列:ALTER TABLE name DROP [COLUMN] column_name
  5. 更改列的名称和类型:ALTER TABLE name CHANGE column_name new_name new_type

impala 删除表

  1. Impala drop table语句用于删除Impala中的现有表。此语句还会删除内部表的底层HDFS文件,此语句还会删除内部表的底层HDFS文件
  2. 删除表的语法:DROP table database_name.table_name;

impala 截断表

  1. Impala的Truncate Table语句用于从现有表中删除所有记录。
  2. truncate table语句的语法:truncate table_name;

impala 创建视图

  1. 视图仅仅是存储在数据库中具有关联名称的Impala查询语言的语句。 它是以预定义的SQL查询形式的表的组合
  2. 视图可以包含表的所有行或选定的行。 可以从一个或多个表创建视图。
  3. 视图允许以用户或用户类发现自然或直观的方式结构化数据。
  4. 视图限制对数据的访问,以便用户可以看到和(有时)完全修改他们需要的内容,而不再更改
  5. 视图汇总可用于生成报告的各种表中的数据。
  6. 创建视图语法:Create View IF NOT EXISTS view_name as Select statement

impala ALTER VIEW修改视图

  1. Impala的Alter View语句用于更改视图。
  2. Alter View可以更改视图的名称,更改数据库以及与其关联的查询。
  3. Alter View语句的语法:ALTER VIEW database_name.view_name为Select语句

impala 删除视图

  1. Impala的Drop View查询用于删除现有视图。 由于视图是一个逻辑结构,因此没有物理数据将受到视图查询的影响。
  2. drop视图语句的语法:DROP VIEW database_name.view_name;

impala ORDER BY子句

  1. Impala ORDER BY子句用于根据一个或多个列以升序或降序对数据进行排序。 默认情况下,一些数据库按升序对查询结果进行排序。
  2. ORDER BY子句的语法:select * from table_name ORDER BY col_name [ASC|DESC] [NULLS FIRST|NULLS LAST]
  3. 可以使用关键字ASC或DESC分别按升序或降序排列表中的数据。
  4. 使用NULLS FIRST,表中的所有空值都排列在顶行,使用NULLS LAST,包含空值的行将最后排列。

impala GROUP BY子句

  1. Impala GROUP BY子句与SELECT语句协作使用,以将相同的数据排列到组中
  2. GROUP BY子句的语法:select data from table_name Group BY col_name;

impala having子句

  1. mpala中的Having子句允许指定过滤哪些组结果显示在最终结果中的条件
  2. 一般来说,Having子句与group by子句一起使用; 它将条件放置在由GROUP BY子句创建的组上。
  3. having语法:select * from table_name ORDER BY col_name [ASC|DESC] [NULLS FIRST|NULLS LAST]

impala Limit子句

  1. Impala中的limit子句用于将结果集的行数限制为所需的数,即查询的结果集不包含超过指定限制的记录
  2. Limit子句的语法:select * from table_name order by id limit numerical_expression;

impala offset子句

  1. 一般来说,select查询的resultset中的行从0开始。使用offset子句以决定从哪里考虑输出

  2. 选择偏移为0,结果将像往常一样,如果选择偏移为5,结果从第五行开始。

  3. 按照id的顺序在customers表中获取记录,并从第0行开始打印前四行

    select * from customers order by id limit 4 offset 0;
    Query: select * from customers order by id limit 4 offset 0 
    +----+----------+-----+-----------+--------+
    | id | name     | age | address   | salary | 
    +----+----------+-----+-----------+--------+ 
    | 1  | Ramesh   | 32  | Ahmedabad | 20000  | 
    | 2  | Khilan   | 25  | Delhi     | 15000  | 
    | 3  | kaushik  | 23  | Kota      | 30000  | 
    | 4  | Chaitali | 25  | Mumbai    | 35000  | 
    +----+----------+-----+-----------+--------+ 
    Fetched 4 row(s) in 0.62s
    

Impala的Union子句

  1. 可以使用Impala的Union子句组合两个查询的结果
  2. Impala中的Union子句的语法:query1 union query2;
  3. 按照ID的顺序在两个表中排列记录,并使用两个单独的查询并使用UNION子句连接这些查询来将其数量限制为3。
select * from customers order by id limit 3
 union 
select * from employee order by id limit 3;

+----+---------+-----+-----------+--------+ 
| id | name    | age | address   | salary | 
+----+---------+-----+-----------+--------+ 
| 2  | Khilan  | 25  | Delhi     | 15000  |
| 3  | mahesh  | 54  | Chennai   | 55000  | 
| 1  | subhash | 34  | Delhi     | 40000  | 

| 2  | ramesh  | 44  | Chennai   | 50000  | 
| 3  | kaushik | 23  | Kota      | 30000  | 
| 1  | Ramesh  | 32  | Ahmedabad | 20000  | 
+----+---------+-----+-----------+--------+ 

impala with子句

  1. 如果查询太复杂,我们可以为复杂部分定义别名,并使用Impala的with子句将它们包含在查询中。

  2. Impala中的with子句的语法:with x as (select 1), y as (select 2) (select * from x union y);

     with t1 as (select * from customers where age>25), 
       t2 as (select * from employee where age>25) 
       (select * from t1 union select * from t2);
    

impala DISTINCT运算符

  1. Impala中的distinct运算符用于通过删除重复值来获取唯一值。
  2. distinct操作符的语法:select distinct columns… from table_name;

以上是关于交互式查询工具——Impala的主要内容,如果未能解决你的问题,请参考以下文章

impala使用指南

Impala快速入门

impala 小记

学习Hive和Impala必看经典解析

回顾·基于Impala平台打造交互查询系统

基于Impala平台打造交互查询系统