繁体   English   中英

在配置单元的外部表中创建分区

[英]creating partition in external table in hive

我已经成功地在 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'

我不确定如何在外部表中进行分区。 有人可以通过逐步描述相同的内容来提供帮助吗?

提前致谢!

是的,您必须明确告诉 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';

完成,运行一次选择查询以验证数据是否成功加载。

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 路径,它将在该路径下创建和存储分区。

希望这可以帮助。

正确的做法。

  1. 创建表并提及它已分区。

    创建由 (age int) 分区的外部 table1 ( name string, age int, height int) 存储为 ****(您的格式) 位置 'path/to/dataFile/in/HDFS';

  2. 现在您必须刷新 hive Metastore 中的分区。

    msck修复表table1

这将负责将所有分区加载到 hive 元存储中。

您可以在过程中的任何时候使用 msck 修复表来更新 Metastore。

请按照以下步骤操作:

  1. 创建临时表/源表

    create table source_table(name string,age int,height int) row format delimited by ',';

    使用文件中的分隔符而不是 ',';

  2. 加载数据到源表

    load data local inpath 'path/to/dataFile/in/HDFS';
  3. 创建带分区的外部表

    create external table external_dynamic_partitions(name string,height int) partitioned by (age int) location 'path/to/dataFile/in/HDFS';
  4. 启用动态分区模式为非严格

    set hive.exec.dynamic.partition.mode=nonstrict
  5. 使用源文件中的分区将数据加载到外部表

    insert into table external_dynamic partition(age) select * from source_table;

就是这样。 您可以使用检查分区信息

show partitions external_dynamic;

您甚至可以检查它是否是外部表或未使用

describe formatted external_dynamic;

外部表是 Hive 中的一种表,其中数据不会移动到 Hive 仓库。 这意味着即使您删除了表,数据仍然存在并且您将始终获得最新的数据,而托管表则不是这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM