2012-03-08 91 views
6

我已经和Hive一起玩了好几天了,但我仍然很难分区。我怎样才能将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分区上找不到任何好的文档。我发现相关的问题,如:

如果我打开我的日志与蜂巢外部表,我不能用时间划分,因为它不是好的格式( Feb < => 02)。即使它格式良好,我如何将字符串“10/02/2012:00:00:00 -0800”转换为多个目录“/ 2012/02/10/00”?

我最终可以使用猪脚本将我的原始日志转换为配置单元表,但此时我应该使用猪而不是配置单元来做我的报告。

回答

5

如果我理解正确,那么您将目录日志中4级文件夹中的文件。在这种情况下,您将表定义为外部路径为“日志”,并由4个虚拟字段进行分区:年,月,日,月,小时。

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要求,我补充说,在创建表后的说明,蜂房需要通知关于创建的分区。只要Flume或其他进程创建新分区,就需要重复执行此操作。请参阅我对Create external with Partition问题的回答。

+0

所以我会创建表看起来像?我会做一个查询来使用这些分区? – zzarbi 2012-03-09 04:39:27

+0

在答案中查看我的编辑。 – Olaf 2012-03-09 15:06:21

+0

我将不得不测试,我会尽快回复您 – zzarbi 2012-03-10 00:14:34