在 hive 的外部表中创建分区
Posted
技术标签:
【中文标题】在 hive 的外部表中创建分区【英文标题】:creating partition in external table in hive 【发布时间】:2015-09-15 07:39:42 【问题描述】:我已在 hive 的内部表中成功创建并添加了动态分区。即通过使用以下步骤:
1-创建源表
2-从本地加载数据到源表
3- 创建另一个带有分区的表 - partition_table
4- 将数据从源表插入到该表中,从而动态创建所有分区
我的问题是,如何在外部表中执行此操作?我阅读了很多关于此的文章,但我很困惑,我是否必须指定已经存在的分区的路径才能为外部表创建分区??
示例: 第 1 步:
create external table1 ( name string, age int, height int)
location 'path/to/dataFile/in/HDFS';
第 2 步:
alter table table1 add partition(age)
location 'path/to/already/existing/partition'
我不确定如何在外部表中进行分区。有人可以通过一步一步的描述来帮忙吗?
提前致谢!
【问题讨论】:
是的,你需要指定路径。 【参考方案1】:是的,你必须明确告诉 Hive 你的分区字段是什么。
假设您有一个要在其上创建外部表的以下 HDFS 目录。
/path/to/dataFile/
假设这个目录已经有数据存储(分区)部门明智如下:
/path/to/dataFile/dept1
/path/to/dataFile/dept2
/path/to/dataFile/dept3
每个目录都有一堆文件,其中每个文件 包含名称、年龄、身高等字段的实际逗号分隔数据。
e.g.
/path/to/dataFile/dept1/file1.txt
/path/to/dataFile/dept1/file2.txt
现在让我们在此创建外部表:
步骤 1. 创建外部表:
CREATE EXTERNAL TABLE testdb.table1(name string, age int, height int)
PARTITIONED BY (dept string)
ROW FORMAT DELIMITED
STORED AS TEXTFILE
LOCATION '/path/to/dataFile/';
第 2 步。添加分区:
ALTER TABLE testdb.table1 ADD PARTITION (dept='dept1') LOCATION '/path/to/dataFile/dept1';
ALTER TABLE testdb.table1 ADD PARTITION (dept='dept2') LOCATION '/path/to/dataFile/dept2';
ALTER TABLE testdb.table1 ADD PARTITION (dept='dept3') LOCATION '/path/to/dataFile/dept3';
完成,运行一次选择查询以验证数据是否加载成功。
【讨论】:
感谢萨钦的精彩解释!还有一件事。这将是一个静态分区吧?如何动态做到这一点? 我们可以执行步骤 2 的 msck 修复表吗?如果我们有太多分区。【参考方案2】:1.设置下面的属性
set hive.exec.dynamic.partition=true
set hive.exec.dynamic.partition.mode=nonstrict
2。创建外部分区表
create external table1 ( name string, age int, height int)
location 'path/to/dataFile/in/HDFS';
3.将数据从源表插入到分区表中。
基本上,过程是相同的。它只是您创建外部分区表并提供 HDFS 路径到它将在其下创建和存储分区的表。
希望这会有所帮助。
【讨论】:
这对 pradeep 有帮助!!奇迹般有效!!必须了解外部表中的静态和动态分区!!!干杯!! 你的外部表 table1 中的分区在哪里?【参考方案3】:正确的做法。
创建表并说明它是分区的。
创建外部表 1(名称字符串、年龄 int、身高 int) 由 (age int) 划分 存储为 ****(您的格式) 位置'路径/到/dataFile/in/HDFS';
现在您必须刷新 hive 元存储中的分区。
msck 修复表 table1
这将负责将所有分区加载到 hive 元存储中。
您可以在过程中的任何时候使用 msck 修复表来更新元存储。
【讨论】:
【参考方案4】:按照以下步骤操作:
创建临时表/源表
create table source_table(name string,age int,height int) row format delimited by ',';
在文件中使用你的分隔符而不是',';
将数据加载到源表中
load data local inpath 'path/to/dataFile/in/HDFS';
创建带分区的外部表
create external table external_dynamic_partitions(name string,height int)
partitioned by (age int)
location 'path/to/dataFile/in/HDFS';
启用动态分区模式为非严格
set hive.exec.dynamic.partition.mode=nonstrict
使用源文件的分区将数据加载到外部表
insert into table external_dynamic partition(age)
select * from source_table;
就是这样。 您可以使用检查分区信息
show partitions external_dynamic;
您甚至可以检查它是否是外部表
describe formatted external_dynamic;
外部表是Hive中的一种表,数据不会被移动到hive仓库中。这意味着即使 U 删除表,数据仍然存在,您将始终获得最新数据,托管表并非如此。
【讨论】:
应该 source_table 是外部的,因为它是从本地文件加载的?以上是关于在 hive 的外部表中创建分区的主要内容,如果未能解决你的问题,请参考以下文章