我正在运行如下所示的配置单元查询。
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是我的第一选择列(转换为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子句中再次Im转换数据时,这可能会导致TB级表的性能问题。
如何在where子句中使用计算列?
答案 0 :(得分:1)
表日期为UTC,参数为IST,则可以将参数转换为UTC:
SELECT from_utc_timestamp(arrival_date, "IST") AS `Date`
FROM table_name
WHERE arrival_date BETWEEN to_utc_timestamp('2018-12-01 00:00:00', "IST")
AND to_utc_timestamp('2018-12-02 00:00:00', "IST");
最好的方法是,如果可能,分别计算参数,并通过UTC传递日期。例如,使用shell并使用参数调用hive脚本。
例如在shell中执行
date_start_IST="2018-12-01 00:00:00"
date_end_IST="2018-12-02 00:00:00"
date_start_UTC=$( export TZ='GMT' && date -d 'TZ="Asia/Kolkata" '"$date_start_IST" +"%F %H:%M:%S" )
date_end_UTC=$( export TZ='GMT' && date -d 'TZ="Asia/Kolkata" '"$date_end_IST" +"%F %H:%M:%S" )
echo "$date_start_UTC, $date_end_UTC"
# prints 2018-11-30 18:30:00, 2018-12-01 18:30:00
#call Hive script:
hive -hiveconf date_start_UTC="$date_start_UTC" -hiveconf date_end_UTC="$date_end_UTC" -f your_script.hql
在脚本your_script.hql中:
SELECT from_utc_timestamp(arrival_date, "IST") AS `Date`
FROM table_name
WHERE arrival_date BETWEEN '${hivecong:date_start_UTC}'
AND '${hivecong:date_end_UTC}';
以这种方式,分区修剪将起作用(如果表按到达日期进行分区),因为没有函数被应用到谓词,并且优化器甚至可以在执行之前派生分区。
如果未分区且文件为ORC,则谓词下推将起作用。
如果未分区且不是ORC,则将进行完全扫描,无论谓词和列中的函数是否存在都没有关系。
答案 1 :(得分:0)
一种方法可以是子查询
select * from (SELECT from_utc_timestamp(arrival_date, "IST") AS `Date`
FROM table_name
) a where a.Date BETWEEN '2018-12-01 00:00:00'
AND '2018-12-02 00:00:00';