【问题标题】:Hive query performance is slow when using Hive date functions instead of hardcoded date strings?使用 Hive 日期函数而不是硬编码日期字符串时,Hive 查询性能很慢?
【发布时间】: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。

【问题讨论】:

    标签: performance hadoop hive query-optimization hiveql


    【解决方案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 日期函数或硬编码字符串会产生如此巨大的差异?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2016-07-08
    • 1970-01-01
    相关资源
    最近更新 更多