基于 Hive 日期的分区

Hive date based partitions

我在 HDFS 上有以下形式的数据:-

/basedir/yyyymmdd/fixedname/files

其中 yyyymmdd 是日期文件夹,files 是目录中添加的文件列表。我在配置单元中需要一个 table 来从 yyyymmdd/fixedname 目录中获取数据。当我添加新日期时,这也应该有效。例如我在 2013 年 3 月 5 日添加了一些内容,因此当天添加的所有文件都将转到 20130305/fixedname 文件夹。 2013 年 3 月 6 日,所有文件将转到 20130306/fixedname 文件夹。

我如何更改配置单元 table 以从更改日期获取数据但固定其中的文件夹?

你有分区的table吗?假设您已经根据 日期 列对 table 进行了分区,并且您想要添加新数据。在这种情况下,您必须将数据添加到新目录并告诉 hive table(特别是元存储)它有一个使用 ALTER TABLE ADD PARTITION COMMAND.

的新分区

假设您尚未创建任何 table。在这种情况下,您将不得不 create a partitioned table and then insert the data into this table from queries。当您设置这两个标志时,魔法就会出现:

set hive.exec.dynamic.partition=yes
set hive.exec.dynamic.partition.mode = nonstrict;

这些标志允许动态分区(有关更多详细信息,请阅读 here)。

请记住,您将拥有如下目录:

/date=YYYYMMDD/fixedname/files

所以你必须告诉 Hive 以递归的方式将所有数据提取到子目录中。您应该设置以下标志 (here there is a better explanation)

SET mapred.input.dir.recursive=true;

最后,您将能够按日期进行查询,并从您在查询中指定的日期 (/date=YYYYMMDD/...) 获取子目录中的所有数据。

希望对您有所帮助。