使用 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 查询非常慢

尽量不在 SQL 查询中硬编码日期范围(Python、SQL 服务器)

如何在每个月的列中获取最大星期六日期,而无需硬编码

Highcharts 日期时间本地化

hive6:字符串和日期的转换常用函数

在 HIVE SQL 中将字符串转换为时间