Impala 入门实例


1 实例概述

本教程演示了一个入门级别的Impala实例。

当您第一次实现Impala实例时,您可以使用SHOW DATABASES 和SHOW TABLES语句来查看一般的对象类型。

此外,调用version()函数可以确认目前运行的Impala版本。(当您在查阅帮助文档或处理技术问题时,版本号十分重要。)

一个空的Impala实例不包含任何的表,但默认会有两个数据库:

  • default,当您不指定其他数据库时,新表将会创建在此处。
  • _impala_builtins,用于保存所有内置函数的系统数据库。

2 实例演示

以下示例显示了如何查看可用数据库以及每个数据库中的表。如果数据库或表的列表很长,您可以使用通配符根据名称定位特定的数据库或表。

$ impala-shell -i localhost --quiet
Starting Impala Shell without Kerberos authentication
Welcome to the Impala shell. Press TAB twice to see a list of available commands.
...
(Shell
      build version: Impala Shell v3.4.x (hash) built on
      date)
[localhost:21000] > select version();
+-------------------------------------------
| version()
+-------------------------------------------
| impalad version ...
| Built on ...
+-------------------------------------------
[localhost:21000] > show databases;
+--------------------------+
| name                     |
+--------------------------+
| _impala_builtins         |
| ctas                     |
| d1                       |
| d2                       |
| d3                       |
| default                  |
| explain_plans            |
| external_table           |
| file_formats             |
| tpc                      |
+--------------------------+
[localhost:21000] > select current_database();
+--------------------+
| current_database() |
+--------------------+
| default            |
+--------------------+
[localhost:21000] > show tables;
+-------+
| name  |
+-------+
| ex_t  |
| t1    |
+-------+
[localhost:21000] > show tables in d3;
[localhost:21000] > show tables in tpc;
+------------------------+
| name                   |
+------------------------+
| city                   |
| customer               |
| customer_address       |
| customer_demographics  |
| household_demographics |
| item                   |
| promotion              |
| store                  |
| store2                 |
| store_sales            |
| ticket_view            |
| time_dim               |
| tpc_tables             |
+------------------------+
[localhost:21000] > show tables in tpc like 'customer*';
+-----------------------+
| name                  |
+-----------------------+
| customer              |
| customer_address      |
| customer_demographics |
+-----------------------+

一旦您知道哪些表和数据库可用,您就可以使用该USE语句进入数据库 。要了解每个表的结构,请使用该DESCRIBE命令。一旦进入数据库,您就可以发出诸如INSERT之类的语句SELECT对特定表进行操作。

下面的示例探索了一个名为PC的数据库,我们在上一个示例中了解到其名称。它展示了如何根据搜索字符串过滤数据库中的表名、检查表的列以及运行查询以检查表数据的特征。

例如,对于不熟悉的表,您可能想知道行、列的数量以及其他属性,例如该列是否包含任何NULL值。从表中采样实际数据值时,LIMIT如果表包含的行或不同值多于您的预期,请使用子句来避免过度输出。

[localhost:21000] > use tpc;
[localhost:21000] > show tables like '*view*';
+-------------+
| name        |
+-------------+
| ticket_view |
+-------------+
[localhost:21000] > describe city;
+-------------+--------+---------+
| name        | type   | comment |
+-------------+--------+---------+
| id          | int    |         |
| name        | string |         |
| countrycode | string |         |
| district    | string |         |
| population  | int    |         |
+-------------+--------+---------+
[localhost:21000] > select count(*) from city;
+----------+
| count(*) |
+----------+
| 0        |
+----------+
[localhost:21000] > desc customer;
+------------------------+--------+---------+
| name                   | type   | comment |
+------------------------+--------+---------+
| c_customer_sk          | int    |         |
| c_customer_id          | string |         |
| c_current_cdemo_sk     | int    |         |
| c_current_hdemo_sk     | int    |         |
| c_current_addr_sk      | int    |         |
| c_first_shipto_date_sk | int    |         |
| c_first_sales_date_sk  | int    |         |
| c_salutation           | string |         |
| c_first_name           | string |         |
| c_last_name            | string |         |
| c_preferred_cust_flag  | string |         |
| c_birth_day            | int    |         |
| c_birth_month          | int    |         |
| c_birth_year           | int    |         |
| c_birth_country        | string |         |
| c_login                | string |         |
| c_email_address        | string |         |
| c_last_review_date     | string |         |
+------------------------+--------+---------+
[localhost:21000] > select count(*) from customer;
+----------+
| count(*) |
+----------+
| 100000   |
+----------+
[localhost:21000] > select count(distinct c_birth_month) from customer;
+-------------------------------+
| count(distinct c_birth_month) |
+-------------------------------+
| 12                            |
+-------------------------------+
[localhost:21000] > select count(*) from customer where c_email_address is null;
+----------+
| count(*) |
+----------+
| 0        |
+----------+
[localhost:21000] > select distinct c_salutation from customer limit 10;
+--------------+
| c_salutation |
+--------------+
| Mr.          |
| Ms.          |
| Dr.          |
|              |
| Miss         |
| Sir          |
| Mrs.         |
+--------------+

当您了解了只读时,您可以使用诸如CREATE DATABASE 和 之类的语句CREATE TABLE来设置您自己的数据库对象。

以下示例演示如何创建一个包含新表的新数据库。虽然最后一个例子在TPC数据库里面结束了,但是新的EXPERIMENTS数据库并没有嵌套在里面TPC;所有数据库都排列在一个顶级列表中。

[localhost:21000] > create database experiments;
[localhost:21000] > show databases;
+--------------------------+
| name                     |
+--------------------------+
| _impala_builtins         |
| ctas                     |
| d1                       |
| d2                       |
| d3                       |
| default                  |
| experiments              |
| explain_plans            |
| external_table           |
| file_formats             |
| tpc                      |
+--------------------------+
[localhost:21000] > show databases like 'exp*';
+---------------+
| name          |
+---------------+
| experiments   |
| explain_plans |
+---------------+

以下示例创建一个新表T1

为了说明一个常见的错误,它在错误的数据库中创建了这个表TPC,即上一个示例结束的数据库。该ALTER TABLE语句允许您将表移动到预期的数据库EXPERIMENTS,作为重命名操作的一部分。USE切换到新数据库时总是需要该语句,并且该 current_database()函数确认会话在哪个数据库中,以避免此类错误。

[localhost:21000] > create table t1 (x int);

[localhost:21000] > show tables;
+------------------------+
| name                   |
+------------------------+
| city                   |
| customer               |
| customer_address       |
| customer_demographics  |
| household_demographics |
| item                   |
| promotion              |
| store                  |
| store2                 |
| store_sales            |
| t1                     |
| ticket_view            |
| time_dim               |
| tpc_tables             |
+------------------------+
[localhost:21000] > select current_database();
+--------------------+
| current_database() |
+--------------------+
| tpc                |
+--------------------+
[localhost:21000] > alter table t1 rename to experiments.t1;
[localhost:21000] > use experiments;
[localhost:21000] > show tables;
+------+
| name |
+------+
| t1   |
+------+
[localhost:21000] > select current_database();
+--------------------+
| current_database() |
+--------------------+
| experiments        |
+--------------------+

基于您初次使用Impala,您可以使用只有几列几行和文本格式数据文件的表格。

注意:随着您逐渐过渡到更现实的场景,您将使用具有许多列的更复杂的表、分区等功能和Parquet等文件格式。在处理现实的数据量时,您将使用LOAD DATAINSERT ... SELECT语句引入数据以一次对数百万或数十亿行进行操作。

以下示例设置了几个包含几行的简单表,并执行涉及排序、聚合函数和连接的查询。

[localhost:21000] > insert into t1 values (1), (3), (2), (4);
[localhost:21000] > select x from t1 order by x desc;
+---+
| x |
+---+
| 4 |
| 3 |
| 2 |
| 1 |
+---+
[localhost:21000] > select min(x), max(x), sum(x), avg(x) from t1;
+--------+--------+--------+--------+
| min(x) | max(x) | sum(x) | avg(x) |
+--------+--------+--------+--------+
| 1      | 4      | 10     | 2.5    |
+--------+--------+--------+--------+

[localhost:21000] > create table t2 (id int, word string);
[localhost:21000] > insert into t2 values (1, "one"), (3, "three"), (5, 'five');
[localhost:21000] > select word from t1 join t2 on (t1.x = t2.id);
+-------+
| word  |
+-------+
| one   |
| three |
+-------+

完成本教程后,您现在应该知道:

  • 如何判断您的系统上运行的是哪个版本的Impala。
  • 如何在Impala实例中查找数据库名称,显示完整列表或搜索特定名称。
  • 如何在Impala数据库中查找表的名称,显示完整列表或搜索特定名称。
  • 如何在数据库之间切换并检查您当前所在的数据库。
  • 如何了解表的列名和类型。
  • 如何创建数据库和表、插入少量测试数据以及运行简单查询。