Impala -教程

Impala 教程本节包括演示如何在安装软件后开始使用 Impala 的教程方案。本教程重点关注有关加载数据的方法,因为如果表中包含一些数据并且您可以查询这些数据,则可以快速了解更高级的 Impala 功能。 注释:如果条件允许,教程会将您从“起点” 带到所需的 Impala 表和数据。在某些情况下,您可能需要从外部源下载其他文件,设置附加软件组件,修改命令或脚本以适合自己的配置,或替换您自己的示例数据。尝试这些教程课程之前,请先安装 Impala:如果您已设置 CDH 环境并且只需向其添加 Impala,请按照 Impala 安装 中描述的安装过程操作。如果您尚未配置 Hive,请确保还安装了 Hive 及其关联 metastore 数据库。要通过可用于试验然后丢弃的最小配置同时设置 Impala 及其所有先决条件,请设置 Cloudera QuickStart VM,其中包括 CentOS 6.3(64 位)上的 CDH 和 Impala。有关更多信息,请参阅 Cloudera QuickStart VM。继续阅读:入门教程高级教程入门教程这些教程演示使用 Impala 的基础知识。它们面向新用户,并尝试在任何新群集上使用 Impala,以确保主要组件运行正常。继续阅读:设置一些基本的 .csv 表令 Impala 表指向现有数据文件描述 Impala 表查询 Impala 表数据加载和查询示例设置一些基本的 .csv 表本方案说明如何创建一些适合新用户体验 Impala SQL 功能的非常小的表格。在这种情况下,TAB1 和 TAB2 以及 HDFS 的文件中的数据将被加载。TAB1 中的数据子集将被复制到 TAB3。使用您要查询的数据填充 HDFS。要开始本过程,请在 HDSF 中的用户目录下创建一个或多个新的子目录。每个表中的数据都将驻留在单独的子目录中。在适当情况下用您自己的用户名替换 cloudera。本示例使用 -p 选项和 mkdir 操作创建任何必要的父目录(如果它们尚不存在)。$ whoamicloudera$ hdfs dfs -ls /userFound 3 itemsdrwxr-xr-x - cloudera cloudera 0 2013-04-22 18:54 /user/clouderadrwxrwx--- - mapred mapred 0 2013-03-15 20:11 /user/historydrwxr-xr-x - hue supergroup 0 2013-03-15 20:10 /user/hive$ hdfs dfs -mkdir -p /user/cloudera/sample_data/tab1 /user/cloudera/sample_data/tab2此处是名为 TAB1 和 TAB2 的两个表的一些示例数据。将以下内容复制到您本地文件系统的 .csv 文件中:tab1.csv:1,true,123.123,2012-10-24 08:55:002,false,1243.5,2012-10-25 13:40:003,false,24453.325,2008-08-22 09:33:21.1234,false,243423.325,2007-05-12 22:32:21.334545,true,243.325,1953-04-22 09:11:33tab2.csv:1,true,12789.1232,false,1243.53,false,24453.3254,false,2423.32545,true,243.32560,false,243565423.32570,true,243.32580,false,243423.32590,true,243.325使用类似于下面的命令将每个 .csv 文件放置到单独的 HDFS 目录中, 这将使用 Impala Demo VM 中提供的路径:$ hdfs dfs -put tab1.csv /user/cloudera/sample_data/tab1$ hdfs dfs -ls /user/cloudera/sample_data/tab1Found 1 items-rw-r--r-- 1 cloudera cloudera 192 2013-04-02 20:08 /user/cloudera/sample_data/tab1/tab1.csv$ hdfs dfs -put tab2.csv /user/cloudera/sample_data/tab2$ hdfs dfs -ls /user/cloudera/sample_data/tab2Found 1 items-rw-r--r-- 1 cloudera cloudera 158 2013-04-02 20:09 /user/cloudera/sample_data/tab2/tab2.csv每个数据文件的名称并不重要。 事实上,在 Impala 首次检查数据目录的内容时, 它将考虑可组成表中数据的目录中的所有文件, 而不考虑有多少文件或已命名哪些文件。要了解您自己的 HDFS 文件系统中可用的路径和用于 各种目录和文件的权限,请发布 hdfs dfs -ls / 命令并按照您 自己的方式在结构树下 针对各种目录执行 -ls 操作。使用 impala-shell 命令以交互方式或通过 SQL 脚本创建表格。以下示例显示了三个表格的创建过程。示例为每个表格显示如何创建具有各种属性(例如布尔值或整数类型)的列。示例还包括可提供有关如何格式化数据的信息(例如以逗号分隔行)的命令,在导入 .csv 文件中的数据时,这将很有意义。在 .csv 文件已包含 HDFS 目录树中的数据时,指定包含相应的 .csv 文件的目录的位置。Impala 会考虑该目录中所有文件中的所有数据以表示表中的数据。DROP TABLE IF EXISTS tab1;-- The EXTERNAL clause means the data is located outside the central location-- for Impala data files and is preserved when the associated Impala table is dropped.-- We expect the data to already exist in the directory specified by the LOCATION clause.CREATE EXTERNAL TABLE tab1( id INT, col_1 BOOLEAN, col_2 DOUBLE, col_3 TIMESTAMP)ROW FORMAT DELIMITED FIELDS TERMINATED BY ','LOCATION '/user/cloudera/sample_data/tab1';DROP TABLE IF EXISTS tab2;-- TAB2 is an external table, similar to TAB1.CREATE EXTERNAL TABLE tab2( id INT, col_1 BOOLEAN, col_2 DOUBLE)ROW FORMAT DELIMITED FIELDS TERMINATED BY ','LOCATION '/user/cloudera/sample_data/tab2';DROP TABLE IF EXISTS tab3;-- Leaving out the EXTERNAL clause means the data will be managed-- in the central Impala data directory tree. Rather than reading-- existing data files when the table is created, we load the-- data after creating the table.CREATE TABLE tab3( id INT, col_1 BOOLEAN, col_2 DOUBLE, month INT, day INT)ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; 注释: 成功完成这些 CREATE TABLE 语句是一个重要的验证步骤,以确认通过 Hive metastore 和 HDFS 权限正确配置了一切内容。如果您在执行 CREATE TABLE 语句期间收到任何错误:请确保您严格按照 Impala 安装 中的安装说明操作。请确保 hive.metastore.warehouse.dir 属性指向 Impala 可以写入到的目录。所有权应该是 hive:hive,并且 impala 用户还应该是 hive 组中的一员。如果 Cloudera Manager 对话框和 Hive shell 中的 hive.metastore.warehouse.dir 的值不同,您可能需要为 Hive 指派运行 impalad 且具有“网关”角色的主机,并向这些主机部署客户端配置文件。令 Impala 表指向现有数据文件为 Impala 设置数据以便访问的一种简便方法是使用外部表,其中数据已存在于一组 HDFS 文件中,您只需令 Impala 表指向包含这些文件的目录。例如,您可以在 impala-shell 中运行具有类似于以下内容的 *.sql 文件,以创建可访问 Hive 使用的现有数据文件的 Impala 表。 注释:在以前的 beta Impala 发行版中,本教程中的示例依赖于 Hive CREATE TABLE 命令。CREATE TABLE 语句适用于 Impala 0.7 及更高版本,因此教程现在使用本地 Impala CREATE TABLE。以下示例设置引用 Impala Demo VM 随附的路径和示例数据的两个表格。由于历史原因,数据实际驻留在 /user/hive 下的 HDFS 目录树中,虽然该特定数据完全由 Impala 而非 Hive 来管理。在创建外部表时,指定包含一个或多个数据文件的目录,并且 Impala 查询该目录内的所有文件的组合内容。此处介绍如何检查 HDFS 文件系统中的目录和文件:$ hdfs dfs -ls /user/hive/tpcds/customerFound 1 items-rw-r--r-- 1 cloudera supergroup 13209372 2013-03-22 18:09 /user/hive/tpcds/customer/customer.dat$ hdfs dfs -cat /user/hive/tpcds/customer/customer.dat | more1|AAAAAAAABAAAAAAA|980124|7135|32946|2452238|2452208|Mr.|Javier|Lewis|Y|9|12|1936|CHILE||Javier.Lewis@VFAxlnZEvOx.org|2452508|2|AAAAAAAACAAAAAAA|819667|1461|31655|2452318|2452288|Dr.|Amy|Moses|Y|9|4|1966|TOGO||Amy.Moses@Ovk9KjHH.com|2452318|3|AAAAAAAADAAAAAAA|1473522|6247|48572|2449130|2449100|Miss|Latisha|Hamilton|N|18|9|1979|NIUE||Latisha.Hamilton@V.com|2452313|4|AAAAAAAAEAAAAAAA|1703214|3986|39558|2450030|2450000|Dr.|Michael|White|N|7|6|1983|MEXICO||Michael.White@i.org|2452361|5|AAAAAAAAFAAAAAAA|953372|4470|36368|2449438|2449408|Sir|Robert|Moran|N|8|5|1956|FIJI||Robert.Moran@Hh.edu|2452469|...此处是我们可以另存为 customer_setup.sql 的 SQL 脚本:---- store_sales fact table and surrounding dimension tables only--create database tpcds;use tpcds;drop table if exists customer;create external table customer( 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)row format delimited fields terminated by '|'location '/user/hive/tpcds/customer';drop table if exists customer_address;create external table customer_address( 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)row format delimited fields terminated by '|'location '/user/hive/tpcds/customer_address';我们将通过如下命令运行此脚本:impala-shell -i localhost -f customer_setup.sql 注释:目前,impala-shell 解释程序要求以交互方式输入的任何命令单独成行,因此如果您自己尝试这些命令,请将其保存到 .sql 文件并使用 -f 选项运行脚本,或者将每个命令编排成一行然后将其粘贴到 shell 中。描述 Impala 表现在您已更新 Impala 缓存的数据库元数据,因此可以确认预期表格是否可以由 Impala 访问并检查其中一个表的属性。我们在名为 default 的数据库中创建了这些表格。如果表格并未处在默认数据库内,我们将发布命令 use db_name 切换到该数据库,然后检查或查询其表格。我们还会通过预置数据库名称来确定表格名称,例如 default.customer 和 default.customer_name。[impala-host:21000] > show databasesQuery finished, fetching results ...defaultReturned 1 row(s) in 0.00s[impala-host:21000] > show tablesQuery finished, fetching results ...customercustomer_addressReturned 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 可根据您的配置协调跨单个节点或多个节点的查询执行操作,并且没有运行 MapReduce 作业以执行中间处理所需的开销。有很多种方法可以在 Impala 上执行查询:在交互模式下使用 impala-shell 命令:$ impala-shell -i impala-hostConnected to localhost:21000[impala-host:21000] > select count(*) from customer_address;50000Returned 1 row(s) in 0.37s传递文件中包含的一组命令:$ impala-shell -i impala-host -f myquery.sqlConnected to localhost:2100050000Returned 1 row(s) in 0.19s将单个命令传递到 impala-shell 命令中。系统将执行查询,返回结果,并且 shell 将退出。确保将命令引起来,最好用单引号,以避免字符的 shell 扩展,例如 *。$ impala-shell -i impala-host -q 'select count(*) from customer_address'Connected to localhost:2100050000Returned 1 row(s) in 0.29s数据加载和查询示例本节介绍如何创建一些示例表并将数据加载到其中。这些表然后可使用 Impala shell 进行查询。加载数据加载数据包括:建立数据集。以下示例使用 .csv 文件。创建要向其加载数据的表格。将数据加载到您创建的表格中。示例查询要运行这些示例查询,请创建 SQL 查询文件 query.sql,将各个查询复制并粘贴到查询文件中,然后使用 shell 运行查询文件。例如,要在 impala-host 上运行 query.sql,您可以使用以下命令:impala-shell.sh -i impala-host -f query.sql下面的示例和结果假设您已按照如上所述将示例数据加载到表中。示例:检查表内容让我们首先验证表中是否包含我们预计的数据。由于 Impala 通常处理包含数百万或数十亿行的表格,因此在检查未知大小的表格时,请包括 LIMIT 子句以避免最终查询中的大量不必要输出。(如果您的交互查询开始显示意外数据量,请在 impala-shell 中按 Ctrl-C 以取消查询。)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) subquery1WHERE subquery1.max_col2 = tab2.col_2;结果:+----+-------+-----------+| id | col_1 | col_2 |+----+-------+-----------+| 1 | true | 12789.123 || 3 | false | 24453.325 |+----+-------+-----------+示例:INSERT 查询INSERT OVERWRITE TABLE tab3SELECT 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 |+----+-------+---------+-------+-----+高级教程这些教程引导您了解高级方案或专用功能。继续阅读:将外部分区表附加到 HDFS 目录结构在 Impala 和 Hive 之间来回切换交叉联接和使用 CROSS JOIN 运算符的 Cartesian 产品将外部分区表附加到 HDFS 目录结构本教程说明如何在 HDFS 中设置目录树、将数据文件放到最低级别的子目录中,然后使用 Impala 外部表从其原始位置查询数据文件。本教程使用的表格采用 Web 日志数据,对年、月、日和主机均使用单独的子目录。为简单起见,我们将同一数据加载到各个分区以使用少量的 CSV 数据。首先,我们为 CSV 数据创建 Impala 分区表,并查看基础 HDFS 目录结构以了解可在 HDSF 中的其他位置重新创建的目录结构。列 field1、field2 和 field3 与 CSV 数据文件的内容对应。year、month、day 和 host 列全部表示为表结构内的子目录,而非 CSV 文件的一部分。我们对所有这些列均使用 STRING,以便可以生成一致的子目录名称,名称带有前导零以使长度一致。create database external_partitions;use external_partitions;create table logs (field1 string, field2 string, field3 string) partitioned by (year string, month string , day string, host string) row format delimited fields terminated by ',';insert into logs partition (year="2013", month="07", day="28", host="host1") values ("foo","foo","foo");insert into logs partition (year="2013", month="07", day="28", host="host2") values ("foo","foo","foo");insert into logs partition (year="2013", month="07", day="29", host="host1") values ("foo","foo","foo");insert into logs partition (year="2013", month="07", day="29", host="host2") values ("foo","foo","foo");insert into logs partition (year="2013", month="08", day="01", host="host1") values ("foo","foo","foo");返回 Linux shell,检查 HDFS 目录结构。 (您的 Impala 数据目录可能位于不同位置;由于历史原因, 它有时位于 HDFS 路径 /user/hive/warehouse 下。) 使用 hdfs dfs -ls 命令检查与各个分区列对应的嵌套子目录, 其中各个级别的单独子目录 (其名称中包含 =)表示各个分区列的不同值。 当到达最低级别的子目录时,使用 hdfs dfs -cat 命令 检查数据文件并在 Impala 中查看通过 INSERT 语句生成的 CSV 格式数据。$ hdfs dfs -ls /user/impala/warehouse/external_partitions.dbFound 1 itemsdrwxrwxrwt - impala hive 0 2013-08-07 12:24 /user/impala/warehouse/external_partitions.db/logs$ hdfs dfs -ls /user/impala/warehouse/external_partitions.db/logsFound 1 itemsdrwxr-xr-x - impala hive 0 2013-08-07 12:24 /user/impala/warehouse/external_partitions.db/logs/year=2013$ hdfs dfs -ls /user/impala/warehouse/external_partitions.db/logs/year=2013Found 2 itemsdrwxr-xr-x - impala hive 0 2013-08-07 12:23 /user/impala/warehouse/external_partitions.db/logs/year=2013/month=07drwxr-xr-x - impala hive 0 2013-08-07 12:24 /user/impala/warehouse/external_partitions.db/logs/year=2013/month=08$ hdfs dfs -ls /user/impala/warehouse/external_partitions.db/logs/year=2013/month=07Found 2 itemsdrwxr-xr-x - impala hive 0 2013-08-07 12:22 /user/impala/warehouse/external_partitions.db/logs/year=2013/month=07/day=28drwxr-xr-x - impala hive 0 2013-08-07 12:23 /user/impala/warehouse/external_partitions.db/logs/year=2013/month=07/day=29$ hdfs dfs -ls /user/impala/warehouse/external_partitions.db/logs/year=2013/month=07/day=28Found 2 itemsdrwxr-xr-x - impala hive 0 2013-08-07 12:21 /user/impala/warehouse/external_partitions.db/logs/year=2013/month=07/day=28/host=host1drwxr-xr-x - impala hive 0 2013-08-07 12:22 /user/impala/warehouse/external_partitions.db/logs/year=2013/month=07/day=28/host=host2$ hdfs dfs -ls /user/impala/warehouse/external_partitions.db/logs/year=2013/month=07/day=28/host=host1Found 1 items-rw-r--r-- 3 impala hive 12 2013-08-07 12:21 /user/impala/warehouse/external_partitions.db/logs/year=2013/month=07/day=28/host=host1/3981726974111751120--8907184999369517436_822630111_data.0$ hdfs dfs -cat /user/impala/warehouse/external_partitions.db/logs/year=2013/month=07/day=28/\host=host1/3981726974111751120--8 907184999369517436_822630111_data.0foo,foo,foo当仍在 Linux shell 中时,使用 hdfs dfs -mkdir 在 Impala 控制的 HDFS 目录树外 创建多个数据目录 (在本示例中为 /user/impala/warehouse,您的情况可能有所不同)。 根据您的配置,您可能需要以 有权写入到此 HDFS 目录树的用户身份登录;例如以 hdfs 用户身份 登录时此处显示的命令将运行。$ hdfs dfs -mkdir -p /user/impala/data/logs/year=2013/month=07/day=28/host=host1$ hdfs dfs -mkdir -p /user/impala/data/logs/year=2013/month=07/day=28/host=host2$ hdfs dfs -mkdir -p /user/impala/data/logs/year=2013/month=07/day=28/host=host1$ hdfs dfs -mkdir -p /user/impala/data/logs/year=2013/month=07/day=29/host=host1$ hdfs dfs -mkdir -p /user/impala/data/logs/year=2013/month=08/day=01/host=host1创建一个小 CSV 文件,其值不同于以前使用的 INSERT 语句中的值,然后在将用作 Impala 分区的每个子目录中放入一个副本。$ cat >dummy_log_databar,baz,bletch$ hdfs dfs -mkdir -p /user/impala/data/external_partitions/year=2013/month=08/day=01/host=host1$ hdfs dfs -mkdir -p /user/impala/data/external_partitions/year=2013/month=07/day=28/host=host1$ hdfs dfs -mkdir -p /user/impala/data/external_partitions/year=2013/month=07/day=28/host=host2$ hdfs dfs -mkdir -p /user/impala/data/external_partitions/year=2013/month=07/day=29/host=host1$ hdfs dfs -put dummy_log_data /user/impala/data/logs/year=2013/month=07/day=28/host=host1$ hdfs dfs -put dummy_log_data /user/impala/data/logs/year=2013/month=07/day=28/host=host2$ hdfs dfs -put dummy_log_data /user/impala/data/logs/year=2013/month=07/day=29/host=host1$ hdfs dfs -put dummy_log_data /user/impala/data/logs/year=2013/month=08/day=01/host=host1返回 impala-shell 解释程序,将原始的 Impala 管理表移到一边, 并创建新的外部 表,其 LOCATION 子句指向 我们已设置其下的所有分区子目录和数据文件的目录。use external_partitions;alter table logs rename to logs_original;create external table logs (field1 string, field2 string, field3 string) partitioned by (year string, month string, day string, host string) row format delimited fields terminated by ',' location '/user/impala/data/logs';由于分区子目录和数据文件在数据生命周期期间不停往返, 因此您必须在 Impala 识别分区包含的数据文件之前通过 ALTER TABLE 语句 确定每个分区。alter table logs add partition (year="2013",month="07",day="28",host="host1")alter table log_type add partition (year="2013",month="07",day="28",host="host2");alter table log_type add partition (year="2013",month="07",day="29",host="host1");alter table log_type add partition (year="2013",month="08",day="01",host="host1");我们为表格发布 REFRESH 语句,在手动添加、移除或更改数据文件时, 这始终是一个安全做法。 数据随后可供查询。 SELECT * 语句说明如何在从中复制数据的每个分区中 识别不重要的 CSV 文件中的数据。 虽然在此情况下只有几行数据,但我们仍在此测试查询中包括 LIMIT 子句,以防数据超过我们预期。refresh log_type;select * from log_type limit 100;+--------+--------+--------+------+-------+-----+-------+| field1 | field2 | field3 | year | month | day | host |+--------+--------+--------+------+-------+-----+-------+| bar | baz | bletch | 2013 | 07 | 28 | host1 || bar | baz | bletch | 2013 | 08 | 01 | host1 || bar | baz | bletch | 2013 | 07 | 29 | host1 || bar | baz | bletch | 2013 | 07 | 28 | host2 |+--------+--------+--------+------+-------+-----+-------+在 Impala 和 Hive 之间来回切换有时,您会发现切换到 Hive shell 执行某些数据加载或转换操作很方便,尤其对于 Impala 当前可以查询但无法写入的文件格式来说(如 RCFile、SequenceFile 和 Avro)。每当您通过 Hive 创建、放置或更改表格或其他种类的对象时,在您下次切换回 impala-shell 解释程序时,请发布一次性 INVALIDATE METADATA 语句以便 Impala 识别新的或已更改的对象。每当您通过 Hive(或者甚至通过手动 HDFS 操作,例如 hdfs 命令)加载、插入或更改现有表格中的数据时,在您下次切换回 impala-shell 解释程序时,请发布一次性 REFRESH table_name 语句以便 Impala 识别新的或已更改的数据。有关说明此过程如何针对 REFRESH 语句运行的示例,请查看在 Impala 中创建 RCFile 和 SequenceFile 表、通过 Hive 加载数据,然后通过 Impala 查询数据的示例。请参阅 对 Impala 表使用 RCFile 文件格式 和 对 Impala 表使用 SequenceFile 文件格式 了解这些示例。有关说明此过程如何针对 INVALIDATE METADATA 语句运行的示例,请查看在 Hive 中创建和加载 Avro 表,然后通过 Impala 查询数据的示例。请参阅 使用带 Impala 表的 Avro 文件格式 了解该示例。 注释:最初,Impala 不支持 UDF,但此功能在 Impala 1.2 之后的 Impala 版本中受支持。您最初通过 Hive 执行的一些 INSERT ... SELECT 转换现在可以通过 Impala 完成。请参阅 用户定义函数 (UDF) 了解详细信息。对于 Impala 1.2 之前的版本,需要在您连接到并发布查询的每个 Impala 节点上发布 REFRESH 和 INVALIDATE METADATA 语句。对于 Impala 1.2 及更高版本,当您在任何 Impala 节点上发布其中任一语句时,结果将传播至群集中的所有 Impala 节点,这使其成为 Hive 中每一轮 DDL 或 ETL 操作之后的真正一步式操作。交叉联接和使用 CROSS JOIN 运算符的 Cartesian 产品最初,Impala 限制联接查询,以便查询必须在联接运算符两侧的表列之间至少包括一个相等比较。对于通常由 Impala 处理的巨大表,可生成完整 Cartesian 产品作为结果集的任何代码错误的查询均会占用大量的群集资源。在 Impala 1.2.2 及更高版本中,当您在查询中使用 CROSS JOIN 运算符时此限制被取消。您仍无法从 SELECT * FROM t1 JOIN t2 之类的查询中移除所有 WHERE 子句以从两个表中生成所有行组合。但您可以使用 CROSS JOIN 运算符明确请求 Cartesian 之类的产品。此操作通常适用于规模较小的表,其中结果集仍适合存储在单个 Impala 节点的内存中。以下示例设置可在书中角色相互搏斗的一系列漫画书中使用的数据。首先,我们使用 equijoin 查询,这将只允许同一时间段和同一地球上的角色见面。[localhost:21000] > create table heroes (name string, era string, planet string);[localhost:21000] > create table villains (name string, era string, planet string);[localhost:21000] > insert into heroes values > ('Tesla','20th century','Earth'), > ('Pythagoras','Antiquity','Earth'), > ('Zopzar','Far Future','Mars');Inserted 3 rows in 2.28s[localhost:21000] > insert into villains values > ('Caligula','Antiquity','Earth'), > ('John Dillinger','20th century','Earth'), > ('Xibulor','Far Future','Venus');Inserted 3 rows in 1.93s[localhost:21000] > select concat(heroes.name,' vs. ',villains.name) as battle > from heroes join villains > where heroes.era = villains.era and heroes.planet = villains.planet;+--------------------------+| battle |+--------------------------+| Tesla vs. John Dillinger || Pythagoras vs. Caligula |+--------------------------+Returned 2 row(s) in 0.47s读者需要更多操作,因此我们添加了时空穿梭和太空旅行元素, 以便所有英雄都能见到任何反面角色。 在 Impala 1.2.2 之前,此类查询是不可能的,因为所有联接 必须引用两个表之间的匹配值:[localhost:21000] > -- Cartesian product not possible in Impala 1.1. > select concat(heroes.name,' vs. ',villains.name) as battle from heroes join villains;ERROR: NotImplementedException: Join between 'heroes' and 'villains' requires at least one conjunctive equality predicate between the two tables在 Impala 1.2.2 中,我们对查询稍作修改以使用 CROSS JOIN 而非 JOIN,现在结果集将包括所有组合:[localhost:21000] > -- Cartesian product available in Impala 1.2.2 with the CROSS JOIN syntax. > select concat(heroes.name,' vs. ',villains.name) as battle from heroes cross join villains;+-------------------------------+| battle |+-------------------------------+| Tesla vs. Caligula || Tesla vs. John Dillinger || Tesla vs. Xibulor || Pythagoras vs. Caligula || Pythagoras vs. John Dillinger || Pythagoras vs. Xibulor || Zopzar vs. Caligula || Zopzar vs. John Dillinger || Zopzar vs. Xibulor |+-------------------------------+Returned 9 row(s) in 0.33s这两个表中的行的完整组合也称为 Cartesian 产品。 此类结果集通常用于创建网格数据结构。 您也可以通过包括并未明确比较两个表之间的列 的 WHERE 子句来筛选结果集。 以下示例说明如何生成可在图表中使用的 年和季度的组合列表, 以及只包含选定季度的较短列表。[localhost:21000] > create table x_axis (x int);[localhost:21000] > create table y_axis (y int);[localhost:21000] > insert into x_axis values (1),(2),(3),(4);Inserted 4 rows in 2.14s[localhost:21000] > insert into y_axis values (2010),(2011),(2012),(2013),(2014);Inserted 5 rows in 1.32s[localhost:21000] > select y as year, x as quarter from x_axis cross join y_axis;+------+---------+| year | quarter |+------+---------+| 2010 | 1 || 2011 | 1 || 2012 | 1 || 2013 | 1 || 2014 | 1 || 2010 | 2 || 2011 | 2 || 2012 | 2 || 2013 | 2 || 2014 | 2 || 2010 | 3 || 2011 | 3 || 2012 | 3 || 2013 | 3 || 2014 | 3 || 2010 | 4 || 2011 | 4 || 2012 | 4 || 2013 | 4 || 2014 | 4 |+------+---------+Returned 20 row(s) in 0.38s[localhost:21000] > select y as year, x as quarter from x_axis cross join y_axis where x in (1,3);+------+---------+| year | quarter |+------+---------+| 2010 | 1 || 2011 | 1 || 2012 | 1 || 2013 | 1 || 2014 | 1 || 2010 | 3 || 2011 | 3 || 2012 | 3 || 2013 | 3 || 2014 | 3 |+------+---------+Returned 10 row(s) in 0.39s
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
手把手视频详细讲解项目开发全过程,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 课程简介 从零开始讲解大数据分布式计算的发展及Impala的应用场景,对比Hive、MapReduce、Spark等类似框架讲解内存式计算原理,基于Impala构建高性能交互式SQL分析平台 课程亮点 1,知识体系完备,从小白到大神各阶段读者均能学有所获。 2,生动形象,化繁为简,讲解通俗易懂。 3,结合工作实践及分析应用,培养解决实际问题的能力。 4,每一块知识点, 都有配套案例, 学习不再迷茫。 适用人群 1、对大数据感兴趣的在校生及应届毕业生。 2、对目前职业有进一步提升要求,希望从事大数据行业高薪工作的在职人员。 3、对大数据行业感兴趣的相关人员。 课程内容 第一章:内存式计算发展 1.分布式计算的发展 2.大数据分布式计算分类 3.Impala内存式计算诞生 第二章:Impala原理初探 1.Impala的设计思想 2.Impala与Hive之间的联系 3.Impala的分布式架构详解 4.Impala角色概念详解 第三章:基于Cloudera镜像部署分布式Impala 1.基于CDH5.14构建本地Yum镜像 2.企业级分布式Impala部署 3.企业级配置与Hadoop集成 4.企业级配置与Hive集成 5.主从架构及元数据服务管理 第四章:Impala企业实战开发案例 1.基于企业案例实现Impala集群管理 2.Impala最全SQL语法详解 3.实战开发Impala数据库与表管理 4.基于分析案例实现Impala数据管理 5.Impala与应用系统集成JDBC 第五章:Impala原理深入 1.Impala各角色功能详解 2.Impala任务提交原理 3.Impala元数据同步原理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值