Impala实战 第2章 Impala入门示例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/myvanguard/article/details/86630763

第2章 Impala入门示例

Impala的使用过程:数据加载,数据查询.分区表,外部分区表.笛卡尔连接及更新元数据

2.1数据加载

将数据加载到Impala当中,一共有两种途径:

  • 使用外部表。将数据文件拷贝到HDFS上,然后建立一张Impala外部表
  • 通过INSERT插入数据。

1.准备数据
本步骤需要将放在本地文件系统上的数据文件上传到HDFS的指定位置上。
tab1.csv

1, true,123.123,2012-10-2408:55:00
2, false,1243.5,2012-10-2513:40:00
3, false,24453.325,2008-08-22 09:33:21.123
4, false,243423,325,2007-05-12 22:32:21.33454
5, true,243.325,1953-04-22 09:11:33

查看原始HDFS上impala的默认目录:
为这两个文件分别建立单独的目录:
将本地文件系统的数据文件上传到HDFS上
执行创建表的操作

CREATE EXTERNAL TABLE tab1(
id INT,
co11 BOOLEAN,
co12 DOUBLE,
CO13 TIMESTAMP
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATTION '/user/impala/tabl';

EXTERNAL关键字表示外部表
LOCATION关键字指定HDFS上对应位置的数据文件
ROW FORMAT DELIMITED子句中指定数据文件使用逗号分隔
使用DESCRIBE table_name语句查看已经创建过的表的定义信息

3.加载数据
对于表tabl,tab2,由于他们是外部表,所以我们只需要通过表定义与数据文件的位置关联起来即可,不需要额外的数据加载过程。

insert OVERWRITE TABLE tab3 
SELECT 
id,col_1,col_2,MONTH(co1_3), DAYOFMONTH(CO1_3)
FROM tab1 
WHERE YEAR(co1_3)=2012

Impala不具备传统数据库的ACID属性,插入数据后不需要做COMMIT操作。

2.2数据查询

Impala支持大部分传统数据库支持的聚集,关联,子查询等操作。
1.聚集和关联操作

select tabl.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

2.带有子查询的聚集和关联操作

select tab2.* 
FROM tab2,
(
	SELECT tabl.col_1, MAX(tab2.col_2) AS max_col2
	FROM tab2, tab1 
	WHERE tabl.id =tab2.id GROUP BY col1
) subqueryl 
WHERE subqueryl.max col2=tab2.col 2

2.3分区表

Impala的分区表也会将某个分区的数据单独存放

--使用year,month,day,host作为分区列,数据文件以逗号分隔
create table_logs(fieldl 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");

drop table_logs分区表删除之后,对应的目录及文件也一并被级联删除。

2.4外部分区表

与普通分区表类似,我们首先需要在HDFS上创建对应的目录结构,并将数据文件put 到对应的位置,然后通过CREATE TABLE语句指向我们创建的HDFS目录就可以了。

create external table_logs (fieldl 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'

手动为该分区表添加分区, 添加分区时需要指定该分区列的具体键值。

alter table_logs add partition
(year="2013", month="07", day="28", host="host1");
drop table_logs;

其实对于外部表通过DROP TABLE命令仅仅是删除标的定义而已。
删除之后对应的数据文件的目录及数据文件仍然存。

2.5笛卡尔连接

在Impala老版本中,如果想对两张表进行关联,必须至少要指定一个等值连接条件,否则就会报错。
自Impala1.2.2起我们可以通过将JOIN替换为CROSS JOIN来显示的指定连接操作符进行笛卡尔连接操作。
通过制定CROSSJOIN作为查询操作符,可以正常进行笛卡尔连接操作。

select x.x,y.y from dim_year x cross join dim_quarter y;

2.6更新元数据

对于某些类型的Impala支持的不太好的文件格式,Impala只能对其进行查询操作,无法向其中写入数据。如果我们要向其中写入数据,就必须通过Hive来进行。

对于通过Hive创建,删除,修改或者其他类型的操作,Impala都无法自动识别到Hive中元数据的变更情况。

如果想让Impala识别到这些变化,首先要做的操作就是INVALIDATE METADATA,该语句将会使所有的Impala元数据失效并重新从元数据库同步元数据。

对于通过Hive加载,插入,改变的数据操作,或者通过hdfs命令进行数据文件变更操作,Impala都无法自动识别数据的变更情况。如果想让Impala识别到这些变化,在连接到impala-shell后,首先要做的操作就是REFRESH table_name,该语句会让Impala识别到数据的变更情况。

invalidate metadata;
refresh tab1;

猜你喜欢

转载自blog.csdn.net/myvanguard/article/details/86630763
今日推荐