【发布时间】:2015-08-13 18:05:29
【问题描述】:
我有一个按日期分区的大型 Hive 表,我正在尝试设置一个 Oozie 工作流,该工作流在最近的分区上运行一个进程。每次 ETL 作业运行时都会创建一个新文件夹。目录结构如下:
/user/hive/warehouse/my_transactions/date=20150424
[...]
/user/hive/warehouse/my_transactions/date=20150811
/user/hive/warehouse/my_transactions/date=20150812
/user/hive/warehouse/my_transactions/date=20150813
在我的家庭/实验室集群上,运行 Hive 1.1.0-cdh5.4.4,我可以在子查询中使用 max 聚合函数来过滤最近几天的数据:
select
[...]
from my_transactions
inner join (select max(date) as max_date from my_transactions) max_date
on date = max_date
结果很快就返回了。
在我们的工作环境中,在具有更强大硬件的更大数据集上运行 Hive 0.13.0-mapr-1501,相同的查询尝试在多个阶段执行并最终抛出 java.lang.OutOfMemoryError: Java heap space。
如果我用文字替换子查询,即WHERE date = '20150813',而不是聚合和内部连接,它执行得非常快。对于聚合/子查询,它似乎不是使用分区来减少 IO 量,而是尝试扫描所有分区。
是否有更好的方法来编写此查询(例如,可能查询 Hive 元数据以获取分区列的 max(date))?
【问题讨论】: