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分区表的主要内容,如果未能解决你的问题,请参考以下文章