Impala - 内部表、外部表、分区表的使用详解(附样例)
作者:hangge | 2024-10-22 09:07
Impala 中的 DDL 和 DML 语句和 Hive 中的用法基本上是一样的,并且 Impala 中也支持内部表、外部表和分区表,下面我将通过样例进行演示。
(3)接着进入 impala-shell 客户端:
(4)使用 load data 命令加载数据:
(5)查询表中的数据:
(3)最后,查询外部表中的数据:
(3)然后再使用 alter 的方式在 impala 中添加分区:
(4)添加后查询表中的分区信息:
(5)最后分别查询下表中所有数据,以及指定分区的数据:
一、内部表的使用
1,创建内部表
下面命令创建一张名为 inner_t1 的内部表:
注意:Impala 中日期类型不支持 Date,只支持 Timestamp。Hive 中这两种日期类型都支持。
create table inner_t1( id int, name string, age int, birthday timestamp )row format delimited fields terminated by '\t' lines terminated by '\n';
2,查看表信息
(1)下面命令查看 inner_t1 表中的字段信息:
desc inner_t1;
(2)下面命令则可以查看详细建表语句:
show create table inner_t1;
3,加载数据到表中
(1)首先我们准备一个数据文件 inner_t1.dat,字段分隔符使用制表符,文件内容如下:
(2)然后将此数据文件上传至 hdfs 中。
提示:因为 impala 中在使用 load data 命令加载数据时不支持 local 参数,只能指定 hdfs 路径。
hdfs dfs -put inner_t1.dat /
(3)接着进入 impala-shell 客户端:
impala-shell
(4)使用 load data 命令加载数据:
下面命令执行时可能会报错,提示 impala 针对/目录没有写权限。这是因为 Impala 是使用 impala 用户操作 hdfs,所以没有权限,可以参考我之前写的文章进行解决:
load data inpath 'hdfs://192.168.121.130:8020/inner_t1.dat' into table inner_t1;
(5)查询表中的数据:
注意:impala 中第一次查询一个表的时候会有点慢,后续查询就快了。
select * from inner_t1;
4,查看数据存储位置
(1)上面数据导入后我们可以到 HDFS 中验证一下表中的数据文件:
(2)而 Impala 中的元数据会存储在 Hive 的 Metastore 中,所以我们到 Hive 对应的 MySQL 中查看一下表信息。首先使用工具连接到服务器的 Mysql,由于我使用的时 CDH 环境,其自带的 Mysql 密码是 cloudera:
(3)查看表 tbls 中的数据:
5,与 Hive 的性能对比
(1)我们在 impala 中基于上面创建的表执行一个 group by 功能,可以发现在 impala 中执行是很快的,只需要 0.4 秒左右。
select count(*),age from inner_t1 group by age;
(2)而在 Hive 中执行同样操作,可以发现在 hive 中执行就比较慢了,大致需要 20 秒。可以看出二者之间的性能差距非常明显。
select count(*),age from inner_t1 group by age;
二、外部表的使用
1,创建外部表
下面命令创建一张名为 external_t1 的外部表:
create external table external_t1( id int, name string, age int, birthday timestamp )row format delimited fields terminated by '\t' lines terminated by '\n' location '/external_t1';
2,加载数据到表中
(1)表需要加载的数据文件为 external_t1.dat,字段分隔符使用制表符,文件内容如下:
(2)然后直接使用 hdfs 的 put 命令将数据文件上传到指定目录中,当然使用 load data 命令也可以。
hdfs dfs -put external_t1.dat /external_t1
(3)最后,查询外部表中的数据:
select * from external_t1;
三、分区表的使用
1,创建分区表
下面命令创建一张外部分区表 external_partition_t1:
提示:分区表也可以分为外部分区表和内部分区表,在这里我们以外部分区表为例进行演示。
create external table external_partition_t1( id int, name string, age int, birthday timestamp )partitioned by(dt string) row format delimited fields terminated by '\t' lines terminated by '\n' location '/external_partition_t1';
2,加载数据到表中
(1)如果我们直接使用 load data 向分区中加载数据是会报错的,它会提示分区不存在。(而 Hive 中这样执行是可以的。)
load data inpath 'hdfs://192.168.121.130:8020/inner_t1.dat' into table external_partition_t1 partition(dt='20240701');
(2)正确做法是先到 HDFS 里面创建分区表需要的分区目录,并且上传数据文件:
hdfs dfs -mkdir -p /external_partition_t1/20240701 hdfs dfs -mkdir -p /external_partition_t1/20240702 hdfs dfs -put external_t1.dat /external_partition_t1/20240701 hdfs dfs -put external_t1.dat /external_partition_t1/20240702
(3)然后再使用 alter 的方式在 impala 中添加分区:
alter table external_partition_t1 add partition(dt='20240701') location '/external_partition_t1/20240701'; alter table external_partition_t1 add partition(dt='20240702') location '/external_partition_t1/20240702';
show partitions external_partition_t1;
(5)最后分别查询下表中所有数据,以及指定分区的数据:
select * from external_partition_t1; select * from external_partition_t1 where dt='20240701';
全部评论(0)