我正在运行一个配置单元查询,如下所示。
SELECT from_utc_timestamp(arrival_date, "IST") AS `Date`
FROM table_name
WHERE 1 BETWEEN '2018-12-01 00:00:00'
AND '2018-12-02 00:00:00';
这里1表示我的第一个select列(转换为ist时区)。但它没有返回任何行。
到货日期列示例数据:
select arrival_date from table_name;
2019-01-01 21:34:12
2019-01-04 06:12:46
然后我试了一下,
SELECT from_utc_timestamp(arrival_date, "IST") AS `Date`
FROM table_name
WHERE from_utc_timestamp(arrival_date, "IST")
BETWEEN '2018-12-01 00:00:00'
AND '2018-12-02 00:00:00';
现在我得到数据了。
但在where子句中,这可能会导致TB大小的表出现性能问题。
如何在where子句中使用计算列?
2条答案
按热度按时间yqyhoc1h1#
如果表日期是utc,参数是ist,则可以将参数转换为utc:
最好的方法是在可能的情况下单独计算参数,并传递utc中已有的日期。例如,使用shell并使用参数调用配置单元脚本。
例如,在shell中执行以下操作:
在脚本your\u script.hql中:
以这种方式,分区修剪将起作用(如果表是按到达日期分区的),因为没有函数应用于 predicate ,优化器甚至可以在执行之前派生分区。
如果它没有分区,并且文件是orc, predicate 下推将起作用。
如果它没有分区,也没有orc,那么它将是完全扫描,不管它是否是 predicate 和列中的函数。
pw136qt22#
一种方法可以是子查询