Impala 查询Impala表


描述Impala表

现在您已经更新了Impala缓存的数据库元数据,您可以确认Impala可以访问预期的表并检查其中一个表的属性。我们在名为的数据库中创建了这些表default

如果表位于默认数据库之外的数据库中,我们将在检查或查询其表之前发出切换到该数据库的命令。我们还可以通过在数据库名称前面加上和来限定表的名称。

例如:defaultuse db_name default.customerdefault.customer_name

[impala-host:21000] > show databases
Query finished, fetching results ...
default
Returned 1 row(s) in 0.00s
[impala-host:21000] > show tables
Query finished, fetching results ...
customer
customer_address
Returned 2 row(s) in 0.00s
[impala-host:21000] > describe customer_address
+------------------+--------+---------+
| name             | type   | comment |
+------------------+--------+---------+
| ca_address_sk    | int    |         |
| ca_address_id    | string |         |
| ca_street_number | string |         |
| ca_street_name   | string |         |
| ca_street_type   | string |         |
| ca_suite_number  | string |         |
| ca_city          | string |         |
| ca_county        | string |         |
| ca_state         | string |         |
| ca_zip           | string |         |
| ca_country       | string |         |
| ca_gmt_offset    | float  |         |
| ca_location_type | string |         |
+------------------+--------+---------+
Returned 13 row(s) in 0.01

查询Impala表

您可以查询表中所包含的数据。Impala会根据您的配置协调跨单个节点或多个节点的查询执行。

有多种方式可以在Impala上执行查询命令:

impala-shell在交互模式下使用命令:

$ impala-shell -i impala-host
Connected to localhost:21000
[impala-host:21000] > select count(*) from customer_address;
50000
Returned 1 row(s) in 0.37s

传递包含在文件中的一组命令:

$ impala-shell -i impala-host -f myquery.sql
Connected to localhost:21000
50000
Returned 1 row(s) in 0.19s

将单个命令传递给impala-shell命令。执行查询,返回结果,shell退出。确保引用命令,最好使用单引号,以避免shell扩展诸如*

$ impala-shell -i impala-host -q 'select count(*) from customer_address'
Connected to localhost:21000
50000
Returned 1 row(s) in 0.29s

数据加载和查询示例

本节介绍如何创建一些示例表并将数据加载到表中。然后可以使用Impala shell查询这些表。

加载数据中

加载数据涉及:

  • 建立数据集。下面的示例使用.csv文件。
  • 创建要加载数据的表。
  • 将数据加载到您创建的表中。

示例查询

要运行这些示例查询,请创建一个SQL查询文件query.sql,将每个查询复制并粘贴到查询文件中,然后使用shell运行查询文件。例如,要在query.sql上运行impala-host,您可以使用以下命令:

query.sqlquery.sqlimpala-host
impala-shell.sh -i impala-host -f query.sql

下面的示例和结果假设您已将示例数据加载到上述表中。

示例:检查表格的内容

让我们首先验证表是否包含我们期望的数据。由于Impala经常处理包含数百万或数十亿行的表,因此在检查未知大小的表时,请包含该LIMIT子句以避免在最终查询中出现大量不必要的输出。(如果您的交互式查询开始显示意外的数据量,请按Ctrl-Cinimpala-shell取消查询。)

SELECT * FROM tab1;
SELECT * FROM tab2;
SELECT * FROM tab2 LIMIT 5;

结果:

+----+-------+------------+-------------------------------+
| id | col_1 | col_2      | col_3                         |
+----+-------+------------+-------------------------------+
| 1  | true  | 123.123    | 2012-10-24 08:55:00           |
| 2  | false | 1243.5     | 2012-10-25 13:40:00           |
| 3  | false | 24453.325  | 2008-08-22 09:33:21.123000000 |
| 4  | false | 243423.325 | 2007-05-12 22:32:21.334540000 |
| 5  | true  | 243.325    | 1953-04-22 09:11:33           |
+----+-------+------------+-------------------------------+
+----+-------+---------------+
| id | col_1 | col_2         |
+----+-------+---------------+
| 1  | true  | 12789.123     |
| 2  | false | 1243.5        |
| 3  | false | 24453.325     |
| 4  | false | 2423.3254     |
| 5  | true  | 243.325       |
| 60 | false | 243565423.325 |
| 70 | true  | 243.325       |
| 80 | false | 243423.325    |
| 90 | true  | 243.325       |
+----+-------+---------------+
+----+-------+-----------+
| id | col_1 | col_2     |
+----+-------+-----------+
| 1  | true  | 12789.123 |
| 2  | false | 1243.5    |
| 3  | false | 24453.325 |
| 4  | false | 2423.3254 |
| 5  | true  | 243.325   |
+----+-------+-----------+

示例:聚合和连接

SELECT tab1.col_1, MAX(tab2.col_2), MIN(tab2.col_2)
FROM tab2 JOIN tab1 USING (id)
GROUP BY col_1 ORDER BY 1 LIMIT 5;

结果:

+-------+-----------------+-----------------+
| col_1 | max(tab2.col_2) | min(tab2.col_2) |
+-------+-----------------+-----------------+
| false | 24453.325       | 1243.5          |
| true  | 12789.123       | 243.325         |
+-------+-----------------+-----------------+

示例:子查询、聚合和连接

SELECT tab2.*
FROM tab2,
(SELECT tab1.col_1, MAX(tab2.col_2) AS max_col2
 FROM tab2, tab1
 WHERE tab1.id = tab2.id
 GROUP BY col_1) subquery1
WHERE subquery1.max_col2 = tab2.col_2;

结果:

+----+-------+-----------+
| id | col_1 | col_2     |
+----+-------+-----------+
| 1  | true  | 12789.123 |
| 3  | false | 24453.325 |
+----+-------+-----------+

示例:插入查询

INSERT OVERWRITE TABLE tab3
SELECT id, col_1, col_2, MONTH(col_3), DAYOFMONTH(col_3)
FROM tab1 WHERE YEAR(col_3) = 2012;

查询TAB3以检查结果:

SELECT * FROM tab3;

结果:

+----+-------+---------+-------+-----+
| id | col_1 | col_2   | month | day |
+----+-------+---------+-------+-----+
| 1  | true  | 123.123 | 10    | 24  |
| 2  | false | 1243.5  | 10    | 25  |
+----+-------+---------+-------+-----+