在创建Hive表时使用PARTITIONED BY
或CLUSTERED 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表后,目录结构可能如下所示:
上表显然是一个托管表,因此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将简单地指向数据文件并通过解析数据文件来获取任何查询结果。但是,如果将数据加载到分区外部表中,则创建分区的位置。
希望完全在蜂巢仓库?有人可以支持或澄清这个吗?
答案 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
此命令将恢复路径中可用的所有分区并更新元存储。现在,如果您对表运行查询,将从所有分区中检索数据。