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)
完成,运行一次选择查询以验证数据是否已成功加载.
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 路径,它将在该表下创建和存储分区。
希望这可以帮助。