【问题标题】:creating partition in external table in hive在 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'

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

提前致谢!

【问题讨论】:

  • 是的,你需要指定路径。

标签: hadoop hive mapreduce hbase


【解决方案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. 创建表并说明它是分区的。

    创建外部表 1(名称字符串、年龄 int、身高 int) 由 (age int) 划分 存储为 ****(您的格式) 位置'路径/到/dataFile/in/HDFS';

  2. 现在您必须刷新 hive 元存储中的分区。

    msck 修复表 table1

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

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

【讨论】:

    【解决方案4】:

    按照以下步骤操作:

    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仓库中。这意味着即使 U 删除表,数据仍然存在,您将始终获得最新数据,托管表并非如此。

    【讨论】:

    • 应该 source_table 是外部的,因为它是从本地文件加载的?
    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 2013-07-26
    • 1970-01-01
    相关资源
    最近更新 更多