Impala - 快速指南


黑斑羚 - 简介

什么是黑斑羚?

Impala 是一个 MPP(大规模并行处理)SQL 查询引擎,用于处理存储在 Hadoop 集群中的大量数据。它是一个用 C++ 和 Java 编写的开源软件。与其他 Hadoop SQL 引擎相比,它提供了高性能和低延迟。

换句话说,Impala 是性能最高的 SQL 引擎(提供类似 RDBMS 的体验),它提供了访问存储在 Hadoop 分布式文件系统中的数据的最快方式。

为什么是黑斑羚?

Impala 通过利用 HDFS、HBase、Metastore、YARN 和 Sentry 等标准组件,将传统分析数据库的 SQL 支持和多用户性能与 Apache Hadoop 的可扩展性和灵活性相结合。

  • 与 Hive 等其他 SQL 引擎相比,使用 Impala,用户可以使用 SQL 查询更快地与 HDFS 或 HBase 进行通信。

  • Impala 可以读取 Hadoop 使用的几乎所有文件格式,如 Parquet、Avro、RCFile。

Impala 使用与 Apache Hive 相同的元数据、SQL 语法 (Hive SQL)、ODBC 驱动程序和用户界面 (Hue Beeswax),为批量或实时查询提供熟悉且统一的平台。

与 Apache Hive 不同,Impala 并不基于 MapReduce 算法。它实现了基于守护进程的分布式体系结构,守护进程负责在同一台计算机上运行的查询执行的所有方面。

因此,它减少了利用 MapReduce 的延迟,这使得 Impala 比 Apache Hive 更快。

黑斑羚的优点

以下列出了 Cloudera Impala 的一些值得注意的优势。

  • 使用 impala,您可以使用传统 SQL 知识以闪电般的速度处理存储在 HDFS 中的数据。

  • 由于数据处理是在数据所在的位置(在 Hadoop 集群上)进行的,因此在使用 Impala 时,存储在 Hadoop 上的数据不需要数据转换和数据移动。

  • 使用 Impala,您可以访问存储在 HDFS、HBase 和 Amazon s3 中的数据,而无需了解 Java(MapReduce 作业)。您可以使用 SQL 查询的基本概念来访问它们。

  • 要在业务工具中编写查询,数据必须经历复杂的提取-转换-加载 (ETL) 周期。但是,有了 Impala,这个过程就缩短了。探索性数据分析和数据发现等新技术克服了加载和重组的耗时阶段,从而加快了流程。

  • Impala 率先使用 Parquet 文件格式,这是一种列式存储布局,针对数据仓库场景中典型的大规模查询进行了优化。

黑斑羚的特点

以下是 cloudera Impala 的功能 -

  • Impala 可在 Apache 许可下作为开源免费提供。

  • Impala 支持内存中数据处理,即它无需移动数据即可访问/分析存储在 Hadoop 数据节点上的数据。

  • 您可以使用 Impala 使用类似 SQL 的查询来访问数据。

  • 与其他 SQL 引擎相比,Impala 可以更快地访问 HDFS 中的数据。

  • 使用 Impala,您可以将数据存储在 HDFS、Apache HBase 和 Amazon s3 等存储系统中。

  • 您可以将 Impala 与 Tableau、Pentaho、微观策略和 Zoom 数据等商业智能工具集成。

  • Impala 支持各种文件格式,例如 LZO、序列文件、Avro、RCFile 和 Parquet。

  • Impala 使用 Apache Hive 中的元数据、ODBC 驱动程序和 SQL 语法。

关系数据库和 Impala

Impala 使用类似于 SQL 和 HiveQL 的查询语言。下表描述了 SQL 和 Impala 查询语言之间的一些主要差异。

黑斑羚 关系数据库
Impala 使用类似于 SQL 的查询语言,类似于 HiveQL。 关系数据库使用SQL语言。
在 Impala 中,您无法更新或删除单个记录。 在关系数据库中,可以更新或删除单个记录。
Impala 不支持事务。 关系数据库支持事务。
Impala 不支持索引。 关系数据库支持索引。
Impala 存储和管理大量数据(PB)。 与 Impala 相比,关系数据库处理的数据量较小(TB)。

Hive、Hbase 和 Impala

尽管 Cloudera Impala 使用与 Hive 相同的查询语言、元存储和用户界面,但它在某些方面与 Hive 和 HBase 有所不同。下表给出了HBase、Hive和Impala之间的对比分析。

数据库 蜂巢 黑斑羚
HBase 是基于 Apache Hadoop 的宽列存储数据库。它使用 BigTable 的概念。 Hive 是一个数据仓库软件。使用它,我们可以访问和管理基于 Hadoop 构建的大型分布式数据集。 Impala 是一个用于管理、分析存储在 Hadoop 上的数据的工具。
HBase的数据模型是宽列存储。 Hive 遵循关系模型。 Impala 遵循关系模型。
HBase是使用Java语言开发的。 Hive是使用Java语言开发的。 Impala 使用 C++ 开发。
HBase的数据模型是无模式的。 Hive的数据模型是基于Schema的。 Impala 的数据模型是基于 Schema 的。
HBase 提供 Java、RESTful 和 Thrift API。 Hive 提供 JDBC、ODBC、Thrift API。 Impala 提供 JDBC 和 ODBC API。
支持 C、C#、C++、Groovy、Java、PHP、Python 和 Scala 等编程语言。 支持 C++、Java、PHP 和 Python 等编程语言。 Impala 支持所有支持 JDBC/ODBC 的语言。
HBase 提供对触发器的支持。 Hive 不提供任何触发器支持。 Impala 不提供任何触发器支持。

所有这三个数据库 -

  • 是NOSQL数据库。

  • 作为开源提供。

  • 支持服务器端脚本。

  • 遵循 ACID 属性,例如持久性和并发性。

  • 使用分片进行分区

Impala 的缺点

使用 Impala 的一些缺点如下:

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

Impala - 环境

本章介绍安装 Impala 的先决条件,以及如何在系统中下载、安装和设置Impala 。

与Hadoop及其生态系统软件类似,我们需要在Linux操作系统上安装Impala。由于cloudera 发布了Impala,因此可以通过Cloudera Quick Start VM 来使用它。

本章介绍如何下载Cloudera Quick Start VM并启动 Impala。

下载Cloudera快速启动VM

按照下面给出的步骤下载最新版本的Cloudera QuickStartVM

步骤1

打开cloudera网站主页http://www.cloudera.com/。您将看到如下所示的页面。

Cloudera网站首页

第2步

单击cloudera主页上的登录链接,这会将您重定向到登录页面,如下所示。

登录页面

如果您尚未注册,请单击“立即注册”链接,该链接将为您提供帐户注册表。在那里注册并登录 cloudera 帐户。

步骤3

登录后,单击以下快照中突出显示的“下载”链接,打开 cloudera 网站的下载页面。

下载链接

第 4 步 - 下载 QuickStartVM

单击“立即下载”按钮下载 cloudera QuickStartVM,如以下快照中突出显示的

下载快速入门VM

这会将您重定向到QuickStart VM的下载页面。

下载页面快速入门VM

单击“立即获取一个”按钮,接受许可协议,然后单击“提交”按钮,如下所示。

提交按钮

Cloudera 提供其 VM 兼容的 VMware、KVM 和 VIRTUALBOX。选择所需的版本。在我们的教程中,我们使用虚拟盒演示Cloudera QuickStartVM设置,因此单击VIRTUALBOX 下载按钮,如下面给出的快照所示。

虚拟盒下载

这将开始下载名为cloudera-quickstart-vm-5.5.0-0-virtualbox.ovf 的文件,这是一个虚拟框映像文件。

导入 Cloudera QuickStartVM

下载cloudera-quickstart-vm-5.5.0-0-virtualbox.ovf文件后,我们需要使用virtual box导入它。为此,首先,您需要在系统中安装 virtual box。按照以下步骤导入下载的图像文件。

步骤1

从以下链接下载 virtual box 并安装https://www.virtualbox.org/

第2步

打开虚拟盒子软件。单击“文件”并选择“导入设备”,如下所示。

虚拟盒软件

步骤3

单击“导入设备”后,您将看到“导入虚拟设备”窗口。选择下载的图像文件的位置,如下所示。

进口设备窗口

导入Cloudera QuickStartVM镜像后,启动虚拟机。该虚拟机安装了 Hadoop、cloudera Impala 和所有必需的软件。VM 的快照如下所示。

虚拟机快照

启动 Impala Shell

要启动 Impala,请打开终端并执行以下命令。

[cloudera@quickstart ~] $ impala-shell

这将启动 Impala Shell,并显示以下消息。

Starting Impala Shell without Kerberos authentication 
Connected to quickstart.cloudera:21000 
Server version: impalad version 2.3.0-cdh5.5.0 RELEASE (build
0c891d79aa38f297d244855a32f1e17280e2129b) 
********************************************************************************
 Welcome to the Impala shell. Copyright (c) 2015 Cloudera, Inc. All rights reserved. 
(Impala Shell v2.3.0-cdh5.5.0 (0c891d7) built on Mon Nov 9 12:18:12 PST 2015)
 
Press TAB twice to see a list of available commands. 
******************************************************************************** 
[quickstart.cloudera:21000] >

注意- 我们将在后面的章节中讨论所有 impala-shell 命令。

Impala 查询编辑器

除了Impala shell之外,您还可以使用 Hue 浏览器与 Impala 进行通信。安装CDH5并启动Impala后,如果打开浏览器,您将看到如下所示的cloudera主页。

Cloudera 主页

现在,单击书签Hue打开 Hue 浏览器。单击后,您可以看到 Hue 浏览器的登录页面,使用凭证 cloudera 和 cloudera 进行登录。

色相浏览器

登录Hue浏览器后,您可以看到如下图的Hue浏览器快速启动向导。

快速启动向导

单击“查询编辑器”下拉菜单时,您将获得 Impala 支持的编辑器列表,如以下屏幕截图所示。

查询编辑器

单击下拉菜单中的Impala ,您将获得如下所示的 Impala 查询编辑器。

Impala 查询编辑器

Impala - 架构

Impala 是一个 MPP(大规模并行处理)查询执行引擎,运行在 Hadoop 集群中的多个系统上。与传统存储系统不同,Impala 与其存储引擎解耦。它具有三个主要组件,即 Impala 守护进程(Impalad)、Impala Statestore 和 Impala 元数据或元存储。

黑斑羚架构

Impala 守护进程( Impalad )

Impala 守护进程(也称为impalad)在安装 Impala 的每个节点上运行。它接受来自各种接口(如 impala shell、hue 浏览器等)的查询并处理它们。

每当将查询提交给特定节点上的 impalad 时,该节点就会充当该查询的“协调器节点”。多个查询也由在其他节点上运行的Impalad提供服务。接受查询后,Impalad读取和写入数据文件,并通过将工作分配到 Impala 集群中的其他 Impala 节点来并行化查询。当在各个Impalad 实例上处理查询时,所有实例都会将结果返回到中央协调节点。

根据要求,查询可以提交到专用的Impalad或以负载平衡的方式提交到集群中的另一个Impalad 。

因帕拉州立商店

Impala 还有另一个重要组件,称为 Impala State store,它负责检查每个Impalad的运行状况,然后经常将每个 Impala 守护进程的运行状况转发给其他守护进程。它可以在运行 Impala 服务器或集群内其他节点的同一节点上运行。

Impala 状态存储守护进程的名称是StatestoredImpalad向 Impala State store 守护进程报告其健康状态,即State returned

如果由于任何原因发生节点故障,Statestore会更新所有其他节点有关此故障的信息,并且一旦其他impalad收到此类通知,其他 Impala 守护程序就不会向受影响的节点分配任何进一步的查询。

Impala 元数据和元存储

Impala 元数据和元存储是另一个重要组件。Impala 使用传统的 MySQL 或 PostgreSQL 数据库来存储表定义。表和列信息以及表定义等重要详细信息存储在称为元存储的集中式数据库中。

每个 Impala 节点都在本地缓存所有元数据。当处理大量数据和/或许多分区时,获取表特定元数据可能会花费大量时间。因此,本地存储的元数据缓存有助于立即提供此类信息。

当表定义或表数据更新时,其他 Impala 守护进程必须在针对相关表发出新查询之前通过检索最新元数据来更新其元数据缓存。

查询处理接口

为了处理查询,Impala 提供了三个接口,如下所示。

  • Impala-shell - 使用 Cloudera VM 设置 Impala 后,您可以通过在编辑器中键入命令impala-shell来启动 Impala shell。我们将在接下来的章节中详细讨论 Impala shell。

  • Hue 界面- 您可以使用 Hue 浏览器处理 Impala 查询。在 Hue 浏览器中,您有 Impala 查询编辑器,您可以在其中键入并执行 impala 查询。要访问此编辑器,首先,您需要登录 Hue 浏览器。

  • ODBC/JDBC 驱动程序- 就像其他数据库一样,Impala 提供 ODBC/JDBC 驱动程序。使用这些驱动程序,您可以通过支持这些驱动程序的编程语言连接到 impala,并使用这些编程语言构建在 impala 中处理查询的应用程序。

查询执行过程

每当用户使用提供的任何接口传递查询时,集群中的一个 Impalad 都会接受该查询。该 Impalad 被视为该特定查询的协调器。

收到查询后,查询协调器使用Hive 元存储中的表架构验证查询是否合适。随后,它从 HDFS 名称节点收集有关执行查询所需的数据位置的信息,并将该信息发送到其他 impalad 以执行查询。

所有其他 Impala 守护进程都会读取指定的数据块并处理查询。一旦所有守护进程完成其任务,查询协调器就会收集返回结果并将其传递给用户。

Impala - 壳牌

在前面的章节中,我们已经看到了使用cloudera安装Impala及其架构。

  • Impala shell(命令提示符)
  • 色调(用户界面)
  • ODBC 和 JDBC(第三方库)

本章介绍如何启动 Impala Shell 以及 shell 的各种选项。

Impala Shell 命令参考

Impala shell 的命令分为通用命令、查询特定选项以及表和数据库特定选项,如下所述。

通用命令

  • 帮助
  • 版本
  • 历史
  • 外壳(或)!
  • 连接
  • 退出 | 辞职

查询具体选项

  • 设置/取消设置
  • 轮廓
  • 解释

表和数据库特定选项

  • 改变
  • 描述
  • 降低
  • 插入
  • 选择
  • 展示
  • 使用

启动 Impala Shell

打开cloudera终端,以超级用户身份登录,然后输入cloudera作为密码,如下所示。

[cloudera@quickstart ~]$ su
Password: cloudera
[root@quickstart cloudera]#

通过输入以下命令启动 Impala shell -

[root@quickstart cloudera] # impala-shell 
Starting Impala Shell without Kerberos authentication 
Connected to quickstart.cloudera:21000 
Server version: impalad version 2.3.0-cdh5.5.0 RELEASE 
(build 0c891d79aa38f297d244855a32f1e17280e2129b)
********************************************************************* 

Welcome to the Impala shell. Copyright (c) 2015 Cloudera, Inc. All rights reserved.
(Impala Shell v2.3.0-cdh5.5.0 (0c891d7) built on Mon Nov 9 12:18:12 PST 2015)

Want to know what version of Impala you're connected to? Run the VERSION command to 
find out! 
********************************************************************* 
[quickstart.cloudera:21000] >

Impala – 通用命令

Impala 的通用命令解释如下 -

帮助命令

Impala shell 的帮助命令为提供了 Impala 中可用命令的列表 -

[quickstart.cloudera:21000] > help;
 
Documented commands (type help <topic>):
========================================================
compute  describe  insert  set     unset  with  version
connect  explain   quit    show    values use
exit     history   profile select  shell  tip 
  
Undocumented commands:
========================================= 
alter create desc drop help load summary

版本命令

version命令为您提供 Impala 的当前版本,如下所示。

[quickstart.cloudera:21000] > version;
Shell version: Impala Shell v2.3.0-cdh5.5.0 (0c891d7) built on Mon Nov 9 
12:18:12 PST 2015

Server version: impalad version 2.3.0-cdh5.5.0 RELEASE (build 
0c891d79aa38f297d244855a32f1e17280e2129b)

历史命令

Impala 的历史命令显示 shell 中最近执行的 10 个命令以下是历史命令的示例。这里我们执行了5个命令,分别是version、help、show、use、history。

[quickstart.cloudera:21000] > history;
[1]:version;
[2]:help;
[3]:show databases;
[4]:use my_db;
[5]:history;

退出/退出命令

您可以使用quitexit命令退出 Impala shell ,如下所示。

[quickstart.cloudera:21000] > exit; 
Goodbye cloudera

连接命令

connect命令用于连接到给定的 Impala 实例。如果您未指定任何实例,它将连接到默认端口21000,如下所示。

[quickstart.cloudera:21000] > connect; 
Connected to quickstart.cloudera:21000 
Server version: impalad version 2.3.0-cdh5.5.0 RELEASE (build 
0c891d79aa38f297d244855a32f1e17280e2129b)

Impala 查询特定选项

Impala 的查询特定命令接受查询。它们的解释如下:

解释

解释命令返回给定查询的执行计划。

[quickstart.cloudera:21000] > explain select * from sample;
Query: explain select * from sample
+------------------------------------------------------------------------------------+ 
| Explain String                                                                     | 
+------------------------------------------------------------------------------------+ 
| Estimated Per-Host Requirements: Memory = 48.00MB VCores = 1                       | 
| WARNING: The following tables are missing relevant table and/or column statistics. |
| my_db.customers                                                                    | 
| 01:EXCHANGE [UNPARTITIONED]                                                        | 
| 00:SCAN HDFS [my_db.customers]                                                     | 
| partitions = 1/1 files = 6 size = 148B                                             | 
+------------------------------------------------------------------------------------+ 
Fetched 7 row(s) in 0.17s

轮廓

profile命令显示有关最近查询低级信息。该命令用于查询的诊断和性能调整。以下是配置文件命令的示例。在这种情况下,profile命令返回解释查询的低级信息。

[quickstart.cloudera:21000] > profile;

Query Runtime Profile: 
Query (id=164b1294a1049189:a67598a6699e3ab6): 

   Summary: 
      Session ID: e74927207cd752b5:65ca61e630ad3ad
      Session Type: BEESWAX 
      Start Time: 2016-04-17 23:49:26.08148000 End Time: 2016-04-17 23:49:26.2404000 
      Query Type: EXPLAIN 
      Query State: FINISHED 
      Query Status: OK 
      Impala Version: impalad version 2.3.0-cdh5.5.0 RELEASE (build 0c891d77280e2129b) 
      User: cloudera 
      Connected User: cloudera 
      Delegated User: 
      Network Address:10.0.2.15:43870 
      Default Db: my_db 
      Sql Statement: explain select * from sample 
      Coordinator: quickstart.cloudera:22000 
      : 0ns 
      Query Timeline: 167.304ms 
         - Start execution: 41.292us (41.292us) - Planning finished: 56.42ms (56.386ms) 
         - Rows available: 58.247ms (1.819ms) 
         - First row fetched: 160.72ms (101.824ms) 
         - Unregister query: 166.325ms (6.253ms)
         
   ImpalaServer: 
      - ClientFetchWaitTimer: 107.969ms 
      - RowMaterializationTimer: 0ns

表和数据库特定选项

下表列出了 Impala 中的表和数据特定选项。

先生编号 命令与解释
1

改变

alter命令用于更改 Impala 中表的结构和名称。

2

描述

Impala 的describe命令给出了表的元数据。它包含列及其数据类型等信息。描述命令有desc作为快捷方式。

3

降低

drop命令用于从 Impala 中删除构造,其中构造可以是表、视图或数据库函数。

4

插入

Impala 的插入命令用于

  • 将数据(列)追加到表中。
  • 覆盖现有表的数据。
  • 覆盖现有表的数据。
5

选择

select语句用于对特定数据集执行所需的操作。它指定要在其上完成某些操作的数据集。您可以打印或存储(在文件中)select 语句的结果。

6

展示

Impala的show语句用于显示表、数据库、表等各种构造的元存储

7

使用

Impala 的use语句用于将当前上下文更改为所需的数据库。

Impala - 查询语言基础知识

Impala 数据类型

下表描述了 Impala 数据类型。

先生编号 数据类型和描述
1

BIGINT

该数据类型存储数值,该数据类型的范围是-9223372036854775808到9223372036854775807。该数据类型用于create table和alter table语句。

2

布尔值

该数据类型仅存储truefalse值,用于创建表语句的列定义中。

3

字符

该数据类型是定长存储,用空格填充,最大可以存储255的长度。

4

十进制

此数据类型用于存储十进制值,并用于 create table 和 alter table 语句。

5

双倍的

该数据类型用于存储正或负 4.94065645841246544e-324d -1.79769313486231570e+308 范围内的浮点值。

6

漂浮

此数据类型用于存储正或负 1.40129846432481707e-45 .. 3.40282346638528860e+38 范围内的单精度浮点值数据类型。

7

INT

该数据类型用于存储范围为-2147483648到2147483647的4字节整数。

8

小智

该数据类型用于存储最大范围为-32768到32767的2字节整数。

9

细绳

这用于存储字符串值。

10

时间戳

该数据类型用于表示某个时间点。

11

天音

该数据类型用于存储 1 字节整数值,最大范围为 -128 到 127。

12

VARCHAR

该数据类型用于存储最大长度为 65,535 的可变长度字符。

13

大批

这是一种复杂的数据类型,用于存储可变数量的有序元素。

14

地图

这是一种复杂的数据类型,用于存储可变数量的键值对。

15

结构体

这是一种复杂的数据类型,用于表示单个项目的多个字段。

Impala 中的评论

Impala 中的注释与 SQL 中的注释类似。一般来说,编程语言中有两种类型的注释,即单行注释和多行注释。

单行注释- 后面跟有“—”的每一行都被视为 Impala 中的注释。以下是 Impala 中单行注释的示例。

-- Hello welcome to tutorials point.

多行注释- /**/之间的所有行在Impala 中都被视为多行注释。以下是 Impala 中的多行注释的示例。

/*
Hi this is an example
Of multiline comments in Impala
*/

Impala 中的运算符与 SQL 中的运算符类似。单击以下链接sql-operators 参考我们的 SQL 教程。

Impala - 创建数据库

在 Impala 中,数据库是一种在其命名空间内保存相关表、视图和函数的构造。在HDFS中表示为目录树;它包含表分区和数据文件。本章介绍如何在 Impala 中创建数据库。

创建数据库语句

CREATE DATABASE 语句用于在 Impala 中创建新数据库。

句法

以下是CREATE DATABASE语句的语法。

CREATE DATABASE IF NOT EXISTS database_name;

这里,IF NOT EXISTS是一个可选子句。如果我们使用此子句,则仅当不存在具有相同名称的现有数据库时,才会创建具有给定名称的数据库。

例子

以下是创建数据库语句的示例。在此示例中,我们创建了一个名为my_database 的数据库。

[quickstart.cloudera:21000] > CREATE DATABASE IF NOT EXISTS my_database;

在cloudera impala-shell中执行上述查询时,您将得到以下输出。

Query: create DATABASE my_database 

Fetched 0 row(s) in 0.21s

确认

SHOW DATABASES查询给出了 Impala 中的数据库列表,因此您可以使用SHOW DATABASES 语句验证数据库是否已创建。在这里您可以在列表中观察到新创建的数据库my_db 。

[quickstart.cloudera:21000] > show databases; 

Query: show databases
+-----------------------------------------------+
| name                                          | 
+-----------------------------------------------+ 
| _impala_builtins                              |
| default                                       | 
|  my_db                                        | 
+-----------------------------------------------+
Fetched 3 row(s) in 0.20s 
[quickstart.cloudera:21000] >

HDFS路径

为了在HDFS文件系统中创建数据库,您需要指定要创建数据库的位置。

CREATE DATABASE IF NOT EXISTS database_name LOCATION hdfs_path;

使用 Hue 浏览器创建数据库

打开 Impala 查询编辑器并在其中键入CREATE DATABASE语句。然后,单击执行按钮,如下图所示。

执行按钮

执行查询后,将光标轻轻移动到下拉菜单的顶部,您将看到一个刷新符号。如果单击刷新符号,数据库列表将被刷新,并且最近的更改将应用​​到其中。

刷新符号

确认

单击编辑器左侧“数据库”标题下的下拉框。在那里您可以看到系统中的数据库列表。在这里您可以观察新创建的数据库my_db,如下所示。

确认

如果仔细观察,可以看到列表中只有一个数据库,即my_db和默认数据库。

Impala - 删除数据库

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

句法

以下是DROP DATABASE语句的语法。

DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT | 
CASCADE] [LOCATION hdfs_path];

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

例子

以下是DROP DATABASE语句的示例。假设您在 Impala 中有一个名为example_database 的数据库。

而且,如果您使用SHOW DATABASES语句验证数据库列表,您将观察其中的名称。

[quickstart.cloudera:21000] > SHOW DATABASES;

Query: show DATABASES
+-----------------------+ 
| name                  | 
+-----------------------+ 
| _impala_builtins      | 
| default               | 
| my_db                 | 
| sample_database       | 
+-----------------------+ 
Fetched 4 row(s) in 0.11s

现在,您可以使用DROP DATABASE 语句删除该数据库,如下所示。

 < DROP DATABASE IF EXISTS sample_database;

这将删除指定的数据库并给出以下输出。

Query: drop DATABASE IF EXISTS sample_database;

确认

您可以使用SHOW DATABASES语句验证给定数据库是否已删除。在这里您可以观察到名为sample_database的数据库已从数据库列表中删除。

[quickstart.cloudera:21000] > SHOW DATABASES;

Query: show DATABASES 
+----------------------+ 
| name                 | 
+----------------------+ 
| _impala_builtins     | 
| default              | 
| my_db                | 
+----------------------+ 
Fetched 3 row(s) in 0.10s 
[quickstart.cloudera:21000] >

级联

一般来说,删除数据库需要手动删除其中的所有表。如果使用级联,Impala 会在删除指定数据库之前先删除该数据库中的表。

例子

假设Impala中有一个名为sample的数据库,它包含两个表,即studenttest。如果您尝试直接删除此数据库,您将收到如下所示的错误。

[quickstart.cloudera:21000] > DROP database sample;
Query: drop database sample 
ERROR: 
ImpalaRuntimeException: Error making 'dropDatabase' RPC to Hive Metastore: 
CAUSED BY: InvalidOperationException: Database sample is not empty. One or more 
tables exist.

使用cascade,您可以直接删除该数据库(无需手动删除其内容),如下所示。

[quickstart.cloudera:21000] > DROP database sample cascade; 
Query: drop database sample cascade

注意- 您无法删除 Impala 中的“当前数据库”。因此,在删除数据库之前,您需要确保当前上下文设置为除要删除的数据库之外的数据库。

使用 Hue 浏览器删除数据库

打开 Impala 查询编辑器并在其中键入DELETE DATABASE语句,然后单击执行按钮,如下所示。假设有三个数据库,即my_db、my_databasesample_database以及默认数据库。这里我们删除名为 my_database 的数据库。

删除数据库

执行查询后,将光标轻轻移动到下拉菜单的顶部。然后,您会发现一个刷新符号,如下面的屏幕截图所示。如果单击刷新符号,数据库列表将被刷新,并且最近所做的更改将应用​​到其中。

数据库列表

确认

单击编辑器左侧“数据库”标题下的下拉菜单。在那里,您可以看到系统中的数据库列表。在这里您可以观察新创建的数据库my_db,如下所示。

落下

如果仔细观察,可以看到列表中只有一个数据库,即my_db和默认数据库。

Impala - 选择数据库

连接到 Impala 后,需要从可用数据库中选择一个。Impala的USE DATABASE语句用于将当前会话切换到另一个数据库。

句法

以下是USE语句的语法。

USE db_name;

例子

以下是USE 语句的示例。首先,让我们创建一个名为sample_database的数据库,如下所示。

> CREATE DATABASE IF NOT EXISTS sample_database;

这将创建一个新数据库并为您提供以下输出。

Query: create DATABASE IF NOT EXISTS my_db2

Fetched 0 row(s) in 2.73s

如果使用SHOW DATABASES语句验证数据库列表,您可以观察其中新创建的数据库的名称。

> SHOW DATABASES;

Query: show DATABASES 
+-----------------------+ 
| name                  | 
+-----------------------+ 
| _impala_builtins      | 
| default               | 
| my_db                 | 
| sample_database       | 
+-----------------------+ 
Fetched 4 row(s) in 0.11s

现在,让我们使用USE语句将会话切换到新创建的数据库 (sample_database),如下所示。

> USE sample_database;

这会将当前上下文更改为sample_database并显示一条消息,如下所示。

Query: use sample_database

使用 Hue 浏览器选择数据库

在 Impala查询编辑器的左侧,您将找到一个下拉菜单,如下图所示。

选择数据库

如果单击下拉菜单,您将找到 Impala 中所有数据库的列表,如下所示。

选择数据库下拉列表

只需选择需要将当前上下文更改为的数据库即可。

Impala - 创建表语句

CREATE TABLE语句用于在 Impala 中所需的数据库中创建一个新表。创建基本表涉及命名表并定义其列以及每列的数据类型。

句法

以下是CREATE TABLE语句的语法。这里,IF NOT EXISTS是一个可选子句。如果我们使用此子句,则仅当指定数据库中不存在具有相同名称的现有表时,才会创建具有给定名称的表。

create table IF NOT EXISTS database_name.table_name (
   column1 data_type,
   column2 data_type,
   column3 data_type,
   ………
   columnN data_type
);

CREATE TABLE 是指示数据库系统创建新表的关键字。表的唯一名称或标识符位于 CREATE TABLE 语句之后。您可以选择指定database_nametable_name

例子

以下是创建表语句的示例。在此示例中,我们在数据库my_db中创建了一个名为Student的表。

[quickstart.cloudera:21000] > CREATE TABLE IF NOT EXISTS my_db.student
   (name STRING, age INT, contact INT );

执行上述语句时,将创建一个具有指定名称的表,并显示以下输出。

Query: create table student (name STRING, age INT, phone INT) 

Fetched 0 row(s) in 0.48s

确认

show Tables查询给出 Impala 当前数据库中的表列表。因此,您可以使用Show Tables语句验证表是否已创建。

首先,您需要将上下文切换到所需表所在的数据库,如下所示。

[quickstart.cloudera:21000] > use my_db; 
Query: use my_db

然后,如果使用show rows查询获取表列表,则可以观察其中名为Student的表,如下所示。

[quickstart.cloudera:21000] > show tables;

Query: show tables 
+-----------+ 
| name      | 
+-----------+ 
| student   | 
+-----------+ 
Fetched 1 row(s) in 0.10s 

HDFS路径

为了在 HDFS 文件系统中创建数据库,您需要指定要创建数据库的位置,如下所示。

CREATE DATABASE IF NOT EXISTS database_name LOCATION hdfs_path;

使用 Hue 浏览器创建数据库

打开 impala 查询编辑器并在其中键入CREATE Table语句。然后单击执行按钮,如下图所示。

创建数据库

执行查询后,将光标轻轻移动到下拉菜单的顶部,您将看到一个刷新符号。如果单击刷新符号,数据库列表将被刷新,并且最近所做的更改将应用​​到其中。

创建数据库下拉列表

确认

单击编辑器左侧“数据库”标题下的下拉菜单。在那里您可以看到数据库列表。选择数据库my_db,如下所示。

创建数据库验证

选择数据库my_db后,您可以看到其中的表列表,如下所示。在这里您可以找到新创建的学生表,如下所示。

创建数据库我的数据库

Impala - 插入语句

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

句法

INSERT语句有两种基本语法,如下所示 -

插入表名(列 1、列 2、列 3、...列 N)

值(值1、值2、值3、...值N);

这里,column1、column2、...columnN 是表中要插入数据的列的名称。

您还可以在不指定列名称的情况下添加值,但为此,您需要确保值的顺序与表中列的顺序相同,如下所示。

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

CREATE TABLE 是告诉数据库系统创建一个新表的关键字。表的唯一名称或标识符位于 CREATE TABLE 语句之后。您可以选择指定database_nametable_name

例子

假设我们在 Impala 中创建了一个名为Student的表,如下所示。

create table employee (Id INT, name STRING, age INT,address STRING, salary BIGINT);

以下是在名为employee的表中创建记录的示例。

[quickstart.cloudera:21000] > insert into employee 
(ID,NAME,AGE,ADDRESS,SALARY)VALUES (1, 'Ramesh', 32, 'Ahmedabad', 20000 );

执行上述语句时,一条记录将插入到名为employee的表中,并显示以下消息。

Query: insert into employee (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Ramesh',
   32, 'Ahmedabad', 20000 ) 
Inserted 1 row(s) in 1.32s

您可以插入另一条记录而不指定列名称,如下所示。

[quickstart.cloudera:21000] > 插入员工值 (2, 'Khilan', 25,
   “德里”,15000);

执行上述语句时,一条记录将插入到名为employee的表中,并显示以下消息。

Query: insert into employee values (2, 'Khilan', 25, 'Delhi', 15000 ) 
Inserted 1 row(s) in 0.31s

您可以在员工表中再插入几条记录,如下所示。

Insert into employee values (3, 'kaushik', 23, 'Kota', 30000 );

Insert into employee values (4, 'Chaitali', 25, 'Mumbai', 35000 );

Insert into employee values (5, 'Hardik', 27, 'Bhopal', 40000 );

Insert into employee values (6, 'Komal', 22, 'MP', 32000 );

插入值后, Impala 中的员工表将如下所示。

+----+----------+-----+-----------+--------+
| id | name     | age | address   | salary |
+----+----------+-----+-----------+--------+
| 1  | Ramesh   | 32  | Ahmedabad | 20000  |
| 2  | Khilan   | 25  | Delhi     | 15000  |
| 5  | Hardik   | 27  | Bhopal    | 40000  |
| 4  | Chaitali | 25  | Mumbai    | 35000  |
| 3  | kaushik  | 23  | Kota      | 30000  |
| 6  | Komal    | 22  | MP        | 32000  |
+----+----------+-----+-----------+--------+

覆盖表中的数据

我们可以使用 overwrite 子句覆盖表的记录。被覆盖的记录将从表中永久删除。以下是使用覆盖子句的语法。

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

例子

以下是使用子句overwrite的示例。

[quickstart.cloudera:21000] > Insert overwrite employee values (1, 'Ram', 26, 
   'Vishakhapatnam', 37000 );

执行上述查询时,这将使用显示以下消息的指定记录覆盖表数据。

Query: insert overwrite employee values (1, 'Ram', 26, 'Vishakhapatnam', 37000 ) 
Inserted 1 row(s) in 0.31s

在验证该表时,您可以观察到表员工的所有记录都被新记录覆盖,如下所示。

+----+------+-----+---------------+--------+
| id | name | age | address       | salary |
+----+------+-----+---------------+--------+
| 1  | Ram  | 26  | Vishakhapatnam| 37000  |
+----+------+-----+---------------+--------+

使用 Hue 浏览器插入数据

打开 Impala 查询编辑器并在其中输入插入语句。然后单击执行按钮,如下图所示。

插入数据

执行查询/语句后,该记录将添加到表中。

Impala - 选择语句

Impala SELECT语句用于从数据库中的一个或多个表中获取数据。该查询以表的形式返回数据。

句法

以下是 Impala select语句的语法。

SELECT column1, column2, columnN from table_name;

这里,column1、column2...是要获取其值的表的字段。如果您想获取该字段中的所有可用字段,则可以使用以下语法 -

SELECT * FROM table_name;

例子

假设我们在 Impala 中有一个名为customer的表,其中包含以下数据 -

ID    NAME       AGE    ADDRESS      SALARY
---   -------    ---    ----------   -------
1     Ramesh     32     Ahmedabad    20000
2     Khilan     25     Delhi        15000
3     Hardik     27     Bhopal       40000
4     Chaitali   25     Mumbai       35000
5     kaushik    23     Kota         30000
6     Komal      22     Mp           32000

您可以使用select语句获取客户表中所有记录的id、nameage,如下所示 -

[quickstart.cloudera:21000] > select id, name, age from customers;

执行上述查询时,Impala 会从指定表中获取所有记录的 id、name、age 并显示它们,如下所示。

Query: select id,name,age from customers

+----+----------+-----+
| id | name     | age |
| 1  | Ramesh   | 32  |
| 2  | Khilan   | 25  |
| 3  | Hardik   | 27  |
| 4  | Chaitali | 25  |
| 5  | kaushik  | 23  |
| 6  | Komal    | 22  |
+----+----------+-----+

Fetched 6 row(s) in 0.66s

您还可以使用选择查询从客户表中获取所有记录,如下所示。

[quickstart.cloudera:21000] > select name, age from customers; 
Query: select * from customers

执行上述查询时,Impala 会获取并显示指定表中的所有记录,如下所示。

+----+----------+-----+-----------+--------+
| id | name     | age | address   | salary |
+----+----------+-----+-----------+--------+
| 1  | Ramesh   | 32  | Ahmedabad | 20000  |
| 2  | Khilan   | 25  | Delhi     | 15000  |
| 3  | Hardik   | 27  | Bhopal    | 40000  |
| 4  | Chaitali | 25  | Mumbai    | 35000  |
| 5  | kaushik  | 23  | Kota      | 30000  |
| 6  | Komal    | 22  | MP        | 32000  |
+----+----------+-----+-----------+--------+

Fetched 6 row(s) in 0.66s

使用 Hue 获取记录

打开 Impala 查询编辑器并在其中输入select语句。然后单击执行按钮,如下图所示。

获取记录

执行查询后,如果向下滚动并选择“结果”选项卡,您可以看到指定表的记录列表,如下所示。

获取记录结果

Impala - 描述语句

Impala中的describe语句用于给出表的描述。该语句的结果包含有关表的信息,例如列名及其数据类型。

句法

以下是 Impala描述语句的语法。

Describe table_name;

例子

例如,假设我们在 Impala 中有一个名为customer的表,其中包含以下数据 -

ID    NAME     AGE    ADDRESS     SALARY
--- --------- ----- ----------- -----------
1   Ramesh     32    Ahmedabad    20000
2   Khilan     25    Delhi        15000
3   Hardik     27    Bhopal       40000
4   Chaitali   25    Mumbai       35000
5   kaushik    23    Kota         30000
6   Komal      22    Mp           32000

您可以使用描述语句获取客户表的描述,如下所示 -

[quickstart.cloudera:21000] > describe customer;

执行上述查询时,Impala 会获取指定表的元数据并显示出来,如下所示。

Query: describe customer
 
+---------+--------+---------+ 
| name    | type   | comment | 
+---------+--------+---------+ 
| id      | int    |         |                    
| name    | string |         | 
| age     | int    |         | 
| address | string |         | 
| salary  | bigint |         |
+---------+--------+---------+ 

Fetched 5 row(s) in 0.51s

使用色调描述记录

打开 Impala 查询编辑器并在其中输入描述语句,然后单击执行按钮,如以下屏幕截图所示。

描述记录

执行查询后,如果向下滚动并选择“结果”选项卡,您可以看到表的元数据,如下所示。

结果选项卡

Impala - 更改表

Impala 中的 Alter table 语句用于对给定表执行更改。使用此语句,我们可以添加、删除或修改现有表中的列,还可以重命名它。

本章通过语法和示例解释了各种类型的 alter 语句。首先假设我们在Impala的my_db数据库中有一个名为customers的表,数据如下

ID   NAME     AGE   ADDRESS    SALARY
--- --------- ----- ----------- --------
1   Ramesh    32    Ahmedabad   20000
2   Khilan    25    Delhi       15000
3   Hardik    27    Bhopal      40000
4   Chaitali  25    Mumbai      35000
5   kaushik   23    Kota        30000
6   Komal     22    Mp          32000

而且,如果您获取数据库my_db中的表列表,您可以在其中找到客户表,如下所示。

[quickstart.cloudera:21000] > show tables;

Query: show tables 
+-----------+ 
| name      | 
+-----------+ 
| customers | 
| employee  | 
| student   | 
| student1  | 
+-----------+

更改表的名称

句法

ALTER TABLE重命名现有表的基本语法如下 -

ALTER TABLE [old_db_name.]old_table_name RENAME TO [new_db_name.]new_table_name

例子

以下是使用alter语句更改表名称的示例。这里我们将表customers的名称更改为users。

[quickstart.cloudera:21000] > ALTER TABLE my_db.customers RENAME TO my_db.users;

执行上述查询后,Impala 根据需要更改表的名称,并显示以下消息。

Query: alter TABLE my_db.customers RENAME TO my_db.users

您可以使用showtables语句验证当前数据库中的表列表。您可以找到名为users而不是customers 的表。

Query: show tables 
+----------+ 
| name     | 
+----------+ 
| employee | 
| student  | 
| student1 | 
| users    | 
+----------+ 
Fetched 4 row(s) in 0.10s

向表中添加列

句法

ALTER TABLE将列添加到现有表的基本语法如下 -

ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...])

例子

以下查询是演示如何向现有表添加列的示例。这里,我们向users表添加两列 account_no 和 Phone_number (均为 bigint 数据类型)。

[quickstart.cloudera:21000] > ALTER TABLE users ADD COLUMNS (account_no BIGINT, 
phone_no BIGINT);

执行上述查询时,它会将指定的列添加到名为Student的表中,并显示以下消息。

Query: alter TABLE users ADD COLUMNS (account_no BIGINT, phone_no BIGINT)

如果您验证表users的架构,您可以在其中找到新添加的列,如下所示。

quickstart.cloudera:21000] > describe users;
 
Query: describe users 
+------------+--------+---------+ 
| name       | type   | comment | 
+------------+--------+---------+ 
| id         | int    |         | 
| name       | string |         | 
| age        | int    |         |
| address    | string |         | 
| salary     | bigint |         | 
| account_no | bigint |         | 
| phone_no   | bigint |         | 
+------------+--------+---------+ 
Fetched 7 row(s) in 0.20s

从表中删除列

句法

ALTER TABLE 到现有表中DROP COLUMN的基本语法如下 -

ALTER TABLE name DROP [COLUMN] column_name

例子

以下查询是从现有表中删除列的示例。这里我们删除名为account_no的列。

[quickstart.cloudera:21000] > ALTER TABLE users DROP account_no;

执行上述查询时,Impala 删除名为 account_no 的列,并显示以下消息。

Query: alter TABLE users DROP account_no

如果您验证表users的架构,您将无法找到名为account_no的列,因为该列已被删除。

[quickstart.cloudera:21000] > 描述用户;

查询:描述用户
+----------+--------+---------+
| 名称 | 类型 | 评论 |
+----------+--------+---------+
| 编号 | 整数 | |
| 名称 | 字符串| |
| 年龄 | 整数 | |
| 地址 | 字符串| |
| 薪资| 大整数 | |
| 电话号码 | 大整数 | |
+----------+--------+---------+
在 0.11 秒内获取 6 行

更改列的名称和类型

句法

ALTER TABLE更改现有表中列的名称和数据类型的基本语法如下 -

ALTER TABLE name CHANGE column_name new_name new_type

例子

以下是使用 alter 语句更改列的名称和数据类型的示例。在这里,我们将 phone_no 列的名称更改为 email,并将其数据类型更改为string

[quickstart.cloudera:21000] > ALTER TABLE users CHANGE phone_no e_mail string;

执行上述查询时,Impala 会执行指定的更改,并显示以下消息。

Query: alter TABLE users CHANGE phone_no e_mail string

您可以使用describe语句验证表users的元数据。您可以观察到 Impala 已对指定列进行了所需的更改。

[quickstart.cloudera:21000] > describe users; 
Query: describe users 
+----------+--------+---------+ 
| name     | type   | comment | 
+----------+--------+---------+ 
| id       | int    |         | 
| name     | string |         | 
| age      | int    |         | 
| address  | string |         | 
| salary   | bigint |         | 
| phone_no | bigint |         |
+----------+--------+---------+ 
Fetched 6 row(s) in 0.11s

使用 Hue 更改表格

打开 Impala 查询编辑器并在其中键入alter语句,然后单击执行按钮,如以下屏幕截图所示。

修改表格

执行上述查询时,它将把customers表的名称更改为users。以同样的方式,我们可以执行所有的更改查询。

Impala - 删除一个表

Impala drop table语句用于删除 Impala 中的现有表。该语句还会删除内表的底层HDFS文件

注意- 使用此命令时必须小心,因为一旦删除表,表中的所有可用信息也将永远丢失。

句法

以下是DROP TABLE语句的语法。这里,IF EXISTS是一个可选子句。如果我们使用此子句,则仅删除具有给定名称的表(如果该表存在)。否则,不会进行任何操作。

DROP table database_name.table_name;

如果尝试删除不存在 IF EXISTS 子句的表,则会生成错误。您可以选择指定database_nametable_name

例子

让我们首先验证数据库my_db中的表列表,如下所示。

[quickstart.cloudera:21000] > show tables;

Query: show tables 
+------------+ 
| name       | 
+------------+ 
| customers  | 
| employee   | 
| student    | 
+------------+ 
Fetched 3 row(s) in 0.11s

从上面的结果可以观察到数据库my_db包含3张表

以下是删除表语句的示例。在此示例中,我们将从数据库my_db中删除名为Student的表。

[quickstart.cloudera:21000] > drop table if exists my_db.student;

执行上述查询时,将删除具有指定名称的表,并显示以下输出。