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

hive中创建外部分区表测试

使用路径中没有列名的分区创建 Hive 外部表?

Hive中创建S3的外部表

使用镶木地板文件作为存储在 Hive 中创建外部表后获取 NULL

在配置单元中创建外部表时更改默认位置

hive外部表分区