我正在运行配置单元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';**
我希望我的hive脚本能够根据一些输入日期和天数加载相关分区。所以如果我通过 date ='2011-08-03'和 days ='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
除了明确地运行之外,我没有发现任何异常的方式:
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;
然而,根据日期和日期输入
,这不是自动的我有什么方法可以根据日期范围或日期算术来定义外部表加载分区吗?
答案 0 :(得分:7)
我有一个非常类似的问题,在迁移之后,我必须重新创建一个表,我有数据,但没有元数据。在重新创建表后,解决方案似乎是:
MSCK REPAIR TABLE table_name;
这也提到了OP在自己的帖子上发表评论的"alter table X recover partitions"
。 MSCK REPAIR TABLE table_name;
适用于非Amazon-EMR实施(在我的案例中为Cloudera)。
答案 1 :(得分:0)
分区是数据的物理分段 - 其中分区由目录系统维护,查询使用元数据来确定分区的位置。因此,如果您可以使目录结构与查询匹配,它应该找到您想要的数据。例如:
select count(*) from table_name where (d >= '2011-08-03) and (d <= '2011-08-09');
但我不知道任何日期范围操作,否则,您必须先进行数学运算才能创建查询模式。
您还可以创建外部表,并为它们添加定义位置的分区。 这允许您根据需要粉碎数据,并仍然使用分区方案来优化查询。
答案 2 :(得分:0)
我不相信Hive中有任何内置功能。您可以编写插件。 Creating custom UDFs
可能不需要提及这一点,但您是否考虑过一个简单的bash脚本来获取您的参数并将命令传递给hive?
Oozie工作流程将是另一种选择,但这可能是过度的。 Oozie Hive Extension - 经过一番思考后我不认为Oozie会为此工作。
答案 3 :(得分:-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