我已在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'
我不确定如何继续在外部表中进行分区。有人可以通过一步一步的描述来帮助吗?。
提前致谢!
答案 0 :(得分:26)
是的,您必须明确告诉Hive您的分区字段是什么。
考虑您有一个以下要创建外部表的HDFS目录。
/path/to/dataFile/
假设这个目录已经存储(分区)部门的数据,如下所示:
/path/to/dataFile/dept1
/path/to/dataFile/dept2
/path/to/dataFile/dept3
这些目录中的每一个都有一堆文件,其中包含每个文件 包含字段的实际逗号分隔数据,例如name,age,height。
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';
完成后,运行一次选择查询以验证数据是否已成功加载。
答案 1 :(得分:3)
<强> 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路径到表,它将在其下创建和存储分区。
希望这有帮助。
答案 2 :(得分:0)
按照以下步骤操作:
创建临时表/源表
create table source_table(name string,age int,height int) row format delimited by ',';
在文件中使用您的分隔符,而不是&#39;,&#39;;
将数据加载到源表
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中的一种表,其中数据不会移动到配置单元仓库。这意味着即使U删除了表,数据仍然存在,您将始终获得最新数据,而Managed表则不然。
答案 3 :(得分:0)
正确的方法。
创建表并提到它已分区。
创建外部表1(名称字符串,age int,height int) 由(age int)划分 存储为****(您的格式) 位置'path / to / dataFile / in / HDFS';
现在,您必须刷新配置单元metastore中的分区。
msck修复表table1
这将负责将所有分区加载到配置单元metastore中。
您可以在过程中随时使用msck修复表来更新元存储。