2011-09-25 71 views
16

我运行蜂房071,处理现有数据是具有下列目录布局:
-TableName
- d =(例如2011-08-01)
- d = 2011-08-02
- d = 2011-08-03

...等
在每个日期下我有日期文件。
立即加载我使用蜂巢:动态分区添加到外部表

CREATE EXTERNAL TABLE table_name (i int) 
PARTITIONED BY (date String) 
LOCATION '${hiveconf:basepath}/TableName';** 

我想我的蜂巢脚本能够根据一些输入日期装入相关的分区天的数据,和数量。所以如果我通过日期= '2011-08-03'天= '7'
脚本应该加载以下分区 - d = 2011-08-03
- d = 2011-08 -04
- d = 2011-08-05
- d = 2011-08-06
- d = 2011-08-07
- d = 2011-08-08
- d = 2011-08 -09

我没有带发现的任何discent方式做到这一点前CEPT explicitlly运行:

ALTER TABLE table_name ADD PARTITION (d='2011-08-03'); 
ALTER TABLE table_name ADD PARTITION (d='2011-08-04'); 
ALTER TABLE table_name ADD PARTITION (d='2011-08-05'); 
ALTER TABLE table_name ADD PARTITION (d='2011-08-06'); 
ALTER TABLE table_name ADD PARTITION (d='2011-08-07'); 
ALTER TABLE table_name ADD PARTITION (d='2011-08-08'); 
ALTER TABLE table_name ADD PARTITION (d='2011-08-09'); 

,然后运行我的查询

select count(1) from table_name; 

然而这offcourse不按照日期和天数输入

自动化有什么办法,我可以定义到外部表根据日期范围或日期算术加载分区?

+0

你好!你能解决这个问题吗?如果是这样,你能分享你的解决方案吗?谢谢!! – eli

+0

正在与亚马逊EMR合作。它认为亚马逊实施了以下命令:“alter table X recover partitions”,它将所有子目录添加为分区。这部分解决了这个问题,使用“where d> start和d Tomer

+0

谢谢。我希望避免不得不恢复分区,因为它需要一段时间。 – eli

回答

0

分区是数据的物理分段 - 分区由目录系统维护,查询使用元数据来确定分区的位置。所以如果你可以使目录结构与查询匹配,它应该找到你想要的数据。例如:

select count(*) from table_name where (d >= '2011-08-03) and (d <= '2011-08-09'); 

但我不知道任何日期范围操作,否则,您必须先执行数学运算来创建查询模式。

你也可以创建外部表,并添加定义位置分区给他们。 这允许您根据需要碎化数据,并仍然使用分区方案优化查询。

-1

我在我的博客中解释了类似的情况:

1)您需要设置属性:

SET hive.exec.dynamic.partition=true; 
SET hive.exec.dynamic.partition.mode=nonstrict; 

2)创建一个外部临时表中加载输入文件数据到这个表。

3)创建主要生产外部表“production_order”与日期字段作为分配列之一。

4)从临时表中加载生产表,以便数据自动分配到分区中。

在下面的博客文章中解释了类似的概念。如果你想看到代码。

http://exploredatascience.blogspot.in/2014/06/dynamic-partitioning-with-hive.html

+0

这可能是使用生产用例分段的最差实现。他们在那里是为了一个目的。不要搞乱数据库 –

0

我不相信有任何内置的这蜂巢功能。你可以写一个插件。 Creating custom UDFs

可能不需要提及这一点,但是你有没有考虑过一个简单的bash脚本,它会把你的参数和管道命令配置成蜂巢?

Oozie工作流程将是另一种选择,但这可能是矫枉过正。 Oozie Hive Extension - 经过一番思考,我不认为Oozie会为此工作。

6

我有一个非常类似的问题,在迁移后,我不得不重新创建一个我拥有数据但不包含元数据的表。解决方案似乎是在重新创建表之后:

MSCK REPAIR TABLE table_name;

Explained here

这还提到,OP对自己的岗位评价的"alter table X recover partitions"MSCK REPAIR TABLE table_name;适用于非Amazon-EMR实现(我的情况是Cloudera)。

+0

谢谢你的洞察力。 :) –