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

Ano*_*ain 10 hadoop hbase hive mapreduce bigdata

我已在hive 的内部表中成功创建并添加了动态分区.即通过使用以下步骤:

1创建了一个源表

从本地到源表的2个加载数据

3-创建了另一个包含分区的表 - partition_table

4-从源表中将数据插入此表,从而动态创建所有分区

我的问题是,如何在外部表中执行此操作?我读了这么多文章,但我很困惑,我是否必须指定已存在的分区的路径来为外部表创建分区?

示例:第1步:

create external table1 ( name string, age int, height int)
location 'path/to/dataFile/in/HDFS';
Run Code Online (Sandbox Code Playgroud)

第2步:

alter table table1 add partition(age) 
location 'path/to/already/existing/partition'
Run Code Online (Sandbox Code Playgroud)

我不知道如何在外部表中进行分区.有人可以通过一步一步的描述来帮助吗?

提前致谢!

小智 34

是的,您必须明确告诉Hive您的分区字段是什么.

假设您有一个以下要在其上创建外部表的HDFS目录.

/path/to/dataFile/
Run Code Online (Sandbox Code Playgroud)

假设此目录已经存储(分区)部门的数据,如下所示:

/path/to/dataFile/dept1
/path/to/dataFile/dept2
/path/to/dataFile/dept3
Run Code Online (Sandbox Code Playgroud)

这些目录中的每一个都有一堆文件,其中每个文件包含字段的实际逗号分隔数据,例如名称,年龄,高度.

e.g.
    /path/to/dataFile/dept1/file1.txt
    /path/to/dataFile/dept1/file2.txt
Run Code Online (Sandbox Code Playgroud)

现在让我们创建外部表:

步骤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/';
Run Code Online (Sandbox Code Playgroud)

步骤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';
Run Code Online (Sandbox Code Playgroud)

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

  • 感谢萨钦这么棒的解释!!还有一件事。这将是一个静态分区对吗?如何动态地做到这一点? (2认同)

pra*_*eep 5

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

希望这可以帮助。

  • 你的外部表table1的分区在哪里? (5认同)