Impala分区表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Impala分区表相关的知识,希望对你有一定的参考价值。

参考技术A 摘要: Impala , 分区表 , hdfs

分区表就是将某个分区的数据的单独存放,当使用 where 语句是针对某个分区查询时,impala只会在该分区扫描,大大减少了从磁盘读取的数据量。

使用 partitioned by 指定分区字段, 分区字段不进入表字段 ,分区字段和表字段在建表语句中都需要指定 字段类型

往分区中插入数据,使用 partition(...) 关键字指定该条数据在分区字段的值,直接顺序指定values作为该条数据各字段的值。

查看插入数据后的分区表数据,分区字段也存在在表数据中

查看impala分区表在hdfs上存储结构,整个表名文件夹下首先是分区的第一列yaer,等于year的值作为下一级目录名

打开分区的第一个字段目录,下一级目录是分区的第二个字段month

打开第二个分区字段目录,第三个分区字段目录是day

最后是第四个分区目录

分区表也可以从现有的hdfs分区目录结构中直接创建,在impala中创建外部表再指向hdfs路径,然后手动添加每条数据的分区。
创建hdfs表名目录(external_partition_test)和子目录作为分区(p=?)

创建三个csv格式数据文件

将三个文件分别put到三个分区目录下

在impala中创建外部分区表

此时查询此表无数据,手动add每条数据的分区值

在手动增加分区值后可以进行查询操作

Impala - 替换表分区中的所有数据

【中文标题】Impala - 替换表分区中的所有数据【英文标题】:Impala - Replace all data in a table's partition 【发布时间】:2017-04-20 15:53:02 【问题描述】:

我有一个程序可以生成有关 Impala 表分区的所有数据。该程序将数据写入 HDFS 文本文件。

如何(物理上)移除之前属于该分区的所有数据,并将其替换为以 Parquet 格式转换的新 Text 文件中的数据?

如果我使用原始 HDFS API 物理删除组成分区的旧 Parquet 文件,它会干扰 Impala 吗?

【问题讨论】:

你的 impala 表是外部表吗? 可能是外部的,也可能是内部的。我有选择。 【参考方案1】:

为您的文本文件创建表格:

create external table stg_table (...) location '<your text file in hdfs>';

外部数据更改后,您必须刷新它:

refresh stg_table;

然后插入到你的目标表中

insert overwrite table target_table select * from stg_table;

如果您的目标表已分区,请执行以下操作:

insert overwrite table target_table partiton(<partition spec>) select * from stg_table;

关键字“覆盖”可以解决问题,它会覆盖表或分区。

【讨论】:

谢谢。有用。然而,“插入覆盖”语句需要时间。此外,我不确定操作是原子的。如果有关此分区的 Impala SQL 查询在“插入覆盖”运​​行期间到达会发生什么?有没有办法让这个“分区交换”过程原子化和更快。用于指定分区的 Parquet 文件位置的 ALTER 语句是什么? 如:“alter table p1 partition (month=1, day=1) set location '/usr/external_data/new_years_day';” 或者通过编程方式(使用 Hadoop FileSystem)删除 Impala 存储分区的 HDFS 文件夹,然后使用我的 Spark 作业生成的 Parquet 文件重新创建文件夹,最后执行:“alter table t1 recover分区”

以上是关于Impala分区表的主要内容,如果未能解决你的问题,请参考以下文章

IMPALA:基于未分区表创建新的分区表

Impala 如何支持分区?

由于 parquet 文件损坏,Impala 无法创建分区表

将数据加载到 impala 分区表中

Impala 分区查询运行缓慢

IMPALA - 如何获取范围分区大小