我有一张交易表 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。
1条答案
按热度按时间zi8p0yeb1#
有时在filter子句中使用函数时分区修剪不起作用。如果在 Package 器shell脚本中计算变量并将其作为-hiveconf变量传递给配置单元,它将正常工作。例子:
然后在配置单元脚本中使用它作为
WHERE file_date ='${hiveconf:date_ingest}'