当使用配置单元日期函数而不是硬编码的日期字符串时,配置单元查询性能很慢?

mklgxw1f  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(415)

我有一张交易表 table_A 每天都在更新。每天我都把新数据插入 table_A 来自外部 table_B 使用 file_date 字段从外部筛选必要的数据 table_B 插入 table_A . 但是,如果使用硬编码日期与使用配置单元日期函数,则性能会有巨大差异:

-- 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配置单元命令(即不能使用--hiveconf选项),因为我们使用的是第三方ui。

zi8p0yeb

zi8p0yeb1#

有时在filter子句中使用函数时分区修剪不起作用。如果在 Package 器shell脚本中计算变量并将其作为-hiveconf变量传递给配置单元,它将正常工作。例子:


# inside shell script

date_ingest=$(date -d '-1 day' +%Y-%m-%d)
hive -f your_script.hql -hiveconf date_ingest="$date_ingest"

然后在配置单元脚本中使用它作为 WHERE file_date ='${hiveconf:date_ingest}'

相关问题