在hive中创建外部表中的分区

时间:2015-09-15 07:39:43

标签: hadoop mapreduce hive hbase bigdata

我已在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'

我不确定如何继续在外部表中进行分区。有人可以通过一步一步的描述来帮助吗?。

提前致谢!

4 个答案:

答案 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)

按照以下步骤操作:

  1. 创建临时表/源表

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

    在文件中使用您的分隔符,而不是&#39;,&#39;;

  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;
    
  6. 那就是它。 您可以使用

    检查分区信息
    show partitions external_dynamic;
    

    您甚至可以使用

    检查它是否是外部表格
    describe formatted external_dynamic;
    

    外部表是Hive中的一种表,其中数据不会移动到配置单元仓库。这意味着即使U删除了表,数据仍然存在,您将始终获得最新数据,而Managed表则不然。

答案 3 :(得分:0)

正确的方法。

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

    创建外部表1(名称字符串,age int,height int) 由(age int)划分 存储为****(您的格式) 位置'path / to / dataFile / in / HDFS';

  2. 现在,您必须刷新配置单元metastore中的分区。

    msck修复表table1

这将负责将所有分区加载到配置单元metastore中。

您可以在过程中随时使用msck修复表来更新元存储。