如何使用HIVE对表进行分区?

时间:2012-03-08 23:36:38

标签: hadoop mapreduce hive apache-pig

我已经和Hive玩了几天了但是我仍然很难分区。

我在Hadoop中记录了几天的Apache日志(组合格式)。它们以行文本格式存储,按日期划分(通过水槽): /日志/ YYYY / MM / DD / HH / *

示例:

/logs/2012/02/10/00/Part01xx (02/10/2012 12:00 am)
/logs/2012/02/10/00/Part02xx
/logs/2012/02/10/13/Part0xxx (02/10/2012 01:00 pm)

combined log文件中的日期遵循以下格式[10 / Feb / 2012:00:00:00 -0800]

如何在Hive中使用我的物理分区创建一个带有分区的外部表。我在Hive分区上找不到任何好的文档。我找到了相关的问题,如:

如果我将日志加载到带有Hive的外部表中,我无法按时间进行分区,因为它不是好的格式(2月< => 02)。即使它的格式良好,我如何将字符串“10/02/2012:00:00:00 -0800”转换为多个目录“/ 2012/02/10/00”?

我最终可以使用pig脚本将原始日志转换为hive表,但此时我应该使用pig而不是hive来进行报告。

1 个答案:

答案 0 :(得分:5)

如果我理解正确,您在目录日志中有4级文件夹中的文件。在这种情况下,您将表定义为外部路径'logs'并按4个虚拟字段分区:year,month,day_of_month,hour_of_day。

分区基本上是由Flume完成的。

编辑3/9:许多细节取决于Flume如何写文件。但总的来说,你的DDL应该是这样的:

CREATE TABLE table_name(fields...)
PARTITIONED BY(log_year STRING, log_month STRING, 
    log_day_of_month STRING, log_hour_of_day STRING)
format description
STORED AS TEXTFILE
LOCATION '/your user path/logs';

编辑3/15:根据zzarbi请求,我添加了一条注释,在创建表后,需要通知Hive有关创建的分区。只要Flume或其他进程创建新分区,就需要重复执行此操作。请参阅我对Create external with Partition问题的回答。