基于Hive日期的分区

时间:2015-07-18 03:05:42

标签: date hive partition

我在HDFS上有以下表格的数据: -

             public static int digit(int x)
                {
                   String str = Integer.toString(x);

                   for(int i =0;i <str.length()  ; i++)
                       {    
                            char str2 =str.charAt(i);
                            int num = Character.getNumericValue(str2);
                            num = num * num;

                       return num;
                        }
                }

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

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

1 个答案:

答案 0 :(得分:1)

你有分区表吗?我们假设您已经在日期列中创建了一个分区表,并且您想要添加新数据。在这种情况下,您必须将数据添加到新目录,并使用ALTER TABLE ADD PARTITION COMMAND告诉hive表(特别是对Metastore)它有一个新分区。

让我们说你还没有创建任何表。在这种情况下,您必须create a partitioned table然后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 /...)。

希望这会对你有所帮助。