hive:hive在使用外部表时是否支持分区和bucketing

7rfyedvj  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(383)

关于使用 PARTITIONED BY 或者 CLUSTERED BY 关键字创建配置单元表时,配置单元将创建与每个分区或存储桶相对应的单独文件。但对于外部表,这仍然有效。据我所知,与外部文件相对应的数据文件不是由配置单元管理的。因此,hive会创建与每个分区或bucket相对应的附加文件,并将相应的数据移到这些文件中。
编辑-添加详细信息。
《hadoop:权威指南》的几段摘录——《第17章:Hive》 CREATE TABLE logs (ts BIGINT, line STRING) PARTITIONED BY (dt STRING, country STRING); 当我们将数据加载到分区表中时,分区值是显式指定的: LOAD DATA LOCAL INPATH 'input/hive/partitions/file1' INTO TABLE logs PARTITION (dt='2001-01-01', country='GB'); 在文件系统级别,分区只是表目录的嵌套子目录。将更多文件加载到logs表后,目录结构可能如下所示:

上面的表显然是一个托管表,因此hive拥有数据的所有权,并像上面的树结构一样为每个分区创建了一个目录结构。
如果是外部表 CREATE EXTERNAL TABLE logs (ts BIGINT, line STRING) PARTITIONED BY (dt STRING, country STRING); 然后是同一组加载操作- LOAD DATA LOCAL INPATH 'input/hive/partitions/file1' INTO TABLE logs PARTITION (dt='2001-01-01', country='GB'); 配置单元将如何处理这些分区。对于没有分区的外部表,hive只需指向数据文件并通过解析数据文件获取任何查询结果。但是,如果将数据加载到分区的外部表中,分区是在哪里创建的。
希望在Hive仓库里?有人能支持或澄清这一点吗?

ql3eal8s

ql3eal8s1#

假设划分日期,因为这是一件常见的事情。

CREATE EXTERNAL TABLE mydatabase.mytable (
    var1   double
  , var2   INT
  , date   String
)
PARTITIONED BY (date String)
LOCATION '/user/location/wanted/';

然后添加所有分区;

ALTER TABLE mytable ADD PARTITION( date = '2017-07-27' );
ALTER TABLE mytable ADD PARTITION( date = '2017-07-28' );

以此类推。
最后,您可以在适当的位置添加数据。您将拥有一个外部分区文件。

5lhxktic

5lhxktic2#

有一个简单的方法可以做到这一点。首先创建外部配置单元表。

CREATE EXTERNAL TABLE database.table (
    id integer,
    name string
)
PARTITIONED BY (country String)
LOCATION 'xxxx';

接下来必须运行msck命令(metastore一致性检查)

msck repair table database.table

此命令将恢复路径中可用的所有分区并更新元存储。现在,如果对表运行查询,将检索来自所有分区的数据。

相关问题