Hive - вычисляемые столбцы в предложении where - PullRequest
1 голос
/ 22 апреля 2019

Я выполняю запрос улья, который выглядит следующим образом.

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 снова конвертирую данные, это может привести к проблемам с производительностью таблиц размера в терабайтах.

Как я могу использовать вычисляемый столбец в предложении where?

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

Если дата таблицы указана в 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.Например, используя оболочку и вызовите скрипт куста с параметрами.

Например, выполните в оболочке:

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, тоэто будет полное сканирование , не имеет значения, будут ли это функции в предикатах и ​​столбцах или нет.

0 голосов
/ 22 апреля 2019

один подход может быть подзапросом

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';
...