我已经用Hive玩了几天了,但我在分区方面仍然很困难。
几个月来,我一直在Hadoop中记录Apache日志(Combine格式)。它们以行文本格式存储,按日期分区(通过水槽):/日志/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)
组合日志文件中的日期遵循此格式[10/2012-02:00:00-0800]
如何在使用我的物理分区的配置单元中创建具有分区的外部表。我找不到任何关于Hive分区的好文档。我发现了相关问题,例如:
- 将数据从HDFS导入配置单元表
- 配置单元中的分隔列
如果我用Hive将日志加载到外部表中,我就无法随时间进行分区,因为这不是一种好的格式(Feb<=>02)。即使它的格式很好,我如何将字符串"10/02/2012:00:00-0800"转换为多个目录"/2012/02/10/00"?
我最终可以使用pig脚本将我的原始日志转换为hive表,但在这一点上,我应该只使用pig而不是hive来进行报告。
如果我理解正确的话,您在目录日志的4级深的文件夹中有文件。在这种情况下,您将表定义为外部,路径为"logs",并由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';
EDIT 3/15:根据zzarbi请求,我添加了一个注意事项,即在创建表后,需要通知Hive已创建的分区。只要Flume或其他进程创建新分区,就需要重复执行此操作。请参阅我对创建带有分区的外部问题的回答。