Hive:hive支持在使用外部表时进行分区和分段

时间:2017-06-27 13:55:05

标签: hadoop hive bigdata

在创建Hive表时使用PARTITIONED BYCLUSTERED BY关键字, hive会创建与每个分区或存储桶对应的单独文件。但对于外部表,这仍然有效。据我所知,对应于外部文件的数据文件不是由hive管理的。因此,hive会创建与每个分区或存储桶对应的其他文件,并将相应的数据移动到这些文件中。

编辑 - 添加详细信息 “Hadoop:权威指南” - “第17章:蜂巢”的摘录很少 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表后,目录结构可能如下所示:

PartitionedTable_HiveWarehouseDirectoryListing

上表显然是一个托管表,因此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将简单地指向数据文件并通过解析数据文件来获取任何查询结果。但是,如果将数据加载到分区外部表中,则创建分区的位置。

希望完全在蜂巢仓库?有人可以支持或澄清这个吗?

2 个答案:

答案 0 :(得分:0)

假设在日期进行分区,因为这是常见的事情。

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' );

等等。

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

答案 1 :(得分:0)

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

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

接下来,您必须运行MSCK命令(元存储一致性检查)

 msck repair table database.table

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