返回 导航

大数据

hangge.com

Impala - 内部表、外部表、分区表的使用详解(附样例)

作者:hangge | 2024-10-22 09:07
      Impala 中的 DDLDML 语句和 Hive 中的用法基本上是一样的,并且 Impala 中也支持内部表、外部表和分区表,下面我将通过样例进行演示。

一、内部表的使用

1,创建内部表

下面命令创建一张名为 inner_t1 的内部表:
注意Impala 中日期类型不支持 Date,只支持 TimestampHive 中这两种日期类型都支持。
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 中的元数据会存储在 HiveMetastore 中,所以我们到 Hive 对应的 MySQL 中查看一下表信息。首先使用工具连接到服务器的 Mysql,由于我使用的时 CDH 环境,其自带的 Mysql 密码是 cloudera
注意:如果连接被拒绝则是因为 Mysql 没有开启远程连接的支持,具体解决办法可以参考我之前写的文章(点击查看

(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)然后直接使用 hdfsput 命令将数据文件上传到指定目录中,当然使用 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';

(4)添加后查询表中的分区信息:
show partitions external_partition_t1;

(5)最后分别查询下表中所有数据,以及指定分区的数据:
select * from external_partition_t1;
select * from external_partition_t1 where dt='20240701';
评论

全部评论(0)

回到顶部