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

zza*_*rbi 6 hadoop hive mapreduce apache-pig

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

我已经在Hadoop中记录了Apache日志(组合格式)几个月.它们以行文本格式存储,按日期划分(通过水槽):/ logs/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)
Run Code Online (Sandbox Code Playgroud)

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

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

如果我在Hive的外部表中加载我的日志,我就无法分配时间,因为它不是好的格式(Feb <=> 02).即使它的格式良好,我如何将字符串"10/02/2012:00:00:00 -0800"转换为多个目录"/ 2012/02/10/00"?

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

Ola*_*laf 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';
Run Code Online (Sandbox Code Playgroud)

编辑3/15:根据zzarbi请求,我添加了一个注释,在创建表之后,需要通知Hive有关创建的分区.只要Flume或其他进程创建新分区,就需要重复执行此操作.请参阅我使用分区问题创建外部的答案.