使用 Hive 日期函数而不是硬编码日期字符串时,Hive 查询性能很慢?
Posted
技术标签:
【中文标题】使用 Hive 日期函数而不是硬编码日期字符串时,Hive 查询性能很慢?【英文标题】:Hive query performance is slow when using Hive date functions instead of hardcoded date strings? 【发布时间】:2016-12-08 20:20:16 【问题描述】:我有一个每天都会更新的事务表table_A
。每天我都会使用file_date
字段从外部table_B
将新数据插入table_A
,以过滤来自外部table_B
的必要数据以插入table_A
。但是,如果我使用硬编码日期与使用 Hive 日期函数相比,性能会有很大差异:
-- Fast version (~20 minutes)
SET date_ingest = '2016-12-07';
SET hive.exec.dynamic.partition.mode = nonstrict;
SET hive.exec.dynamic.partition = TRUE;
INSERT
INTO
TABLE
table_A PARTITION (FILE_DATE) SELECT
id, eventtime
,CONCAT_WS( '-' ,substr ( eventtime ,0 ,4 ) ,SUBSTRING( eventtime ,5 ,2 ) ,SUBSTRING( eventtime ,7 ,2 ) )
FROM
table_B
WHERE
file_date = $hiveconf:date_ingest
;
相比:
-- Slow version (~9 hours)
SET date_ingest = date_add(to_date(from_unixtime( unix_timestamp( ) )),-1);
SET hive.exec.dynamic.partition.mode = nonstrict;
SET hive.exec.dynamic.partition = TRUE;
INSERT
INTO
TABLE
table_A PARTITION (FILE_DATE) SELECT
id, eventtime
,CONCAT_WS( '-' ,substr ( eventtime ,0 ,4 ) ,SUBSTRING( eventtime ,5 ,2 ) ,SUBSTRING( eventtime ,7 ,2 ) )
FROM
table_B
WHERE
file_date = $hiveconf:date_ingest
;
有没有人遇到过类似的问题?您应该假设我无权访问 Unix hive 命令(即无法使用 --hiveconf 选项),因为我们使用的是第三方 UI。
【问题讨论】:
【参考方案1】:在过滤子句中使用函数时,有时分区修剪不起作用。如果您在包装器 shell 脚本中计算变量并将其作为 -hiveconf 变量传递给 Hive,它将正常工作。 示例:
#inside shell script
date_ingest=$(date -d '-1 day' +%Y-%m-%d)
hive -f your_script.hql -hiveconf date_ingest="$date_ingest"
然后在 Hive 脚本中使用 WHERE file_date ='$hiveconf:date_ingest'
【讨论】:
不幸的是,我们无法访问 Unix 命令行。我们正在使用第三方 UI。仍然不确定为什么这两种方法会在性能上产生巨大差异。 解释查询计划和比较计划,您就会知道。 我想做的是使用 Hive 日期函数,以便我可以安排每天运行查询(查询的第二个版本)。但目前,查询时间过长。就好像它正在阅读整张桌子。似乎有错误或我做错了什么。为什么我使用 Hive 日期函数或硬编码字符串会产生如此巨大的差异?以上是关于使用 Hive 日期函数而不是硬编码日期字符串时,Hive 查询性能很慢?的主要内容,如果未能解决你的问题,请参考以下文章
使用 current_date::date 而不是硬编码日期的 Postgres 查询非常慢