Почему исключение разделов не происходит для этого запроса?
У меня есть таблица улья, которая разделена на год, месяц, день и час. Мне нужно выполнить запрос к нему, чтобы получить данные за последние 7 дней. Это в Hive 0.14.0.2.2.4.2-2
, Мой запрос в настоящее время выглядит так:
SELECT COUNT(column_name) from table_name
where year >= year(date_sub(from_unixtime(unix_timestamp()), 7))
AND month >= month(date_sub(from_unixtime(unix_timestamp()), 7))
AND day >= day(date_sub(from_unixtime(unix_timestamp()), 7));
Это занимает очень много времени. Когда я заменяю фактические числа на вышеприведенные, скажем что-то вроде:
SELECT COUNT(column_name) from table_name
where year >= 2017
AND month >= 2
AND day >= 13
это заканчивается через несколько минут. Есть ли способ изменить приведенный выше скрипт так, чтобы он включал только цифры в запросе вместо функций?
Я пытался с помощью set
лайк:
set yearLimit = year(date_sub(from_unixtime(unix_timestamp()), 7));
SELECT COUNT(column_name) from table_name
where year >= ${hiveconf:yearLimit}
AND month >= month(date_sub(from_unixtime(unix_timestamp()), 7))
AND day >= day(date_sub(from_unixtime(unix_timestamp()), 7));
но это не решает проблему.
1 ответ
Решение
select count (column_name)
from table_name
where year >= year (date_sub (current_date,7))
and month >= month (date_sub (current_date,7))
and day >= day (date_sub (current_date,7))
;
Что пошло не так с оригинальным запросом?
UNIX_TIMESTAMP ()
Получает текущую метку времени Unix в секундах. Эта функция не является детерминированной, и ее значение не является фиксированным для объема выполнения запроса, поэтому препятствует правильной оптимизации запросов - с 2.0 она устарела в пользу константы CURRENT_TIMESTAMP.
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
(Я только немного изменил документацию :-))
Поскольку значения unix_timestamp() могут изменяться во время выполнения, выражение должно оцениваться для каждой строки, что предотвращает удаление разделов.
Зачем использовать SET
не работал?
set
это не что иное, как механизм замены текста.
Ничего не вычисляется во время set
,
Единственное, что происходит, - это то, что переменным присваивается текст.
Перед выполнением запроса переменные-заполнители (${hiveconf:...}
) заменяются назначенным текстом.
Только тогда запрос анализируется и выполняется.
hive> set a=sele;
hive> set b=ct 1+;
hive> set c=1;
hive> ${hiveconf:a}${hiveconf:b}${hiveconf:c};
OK
2
демонстрация
create table table_name (column_name int) partitioned by (year int,month int,day int);
set hive.exec.dynamic.partition.mode=nonstrict;
insert into table_name partition (year,month,day)
select pos
,year(dt)
,month(dt)
,day(dt)
from (select pe.pos
,date_sub (current_date,pe.pos) as dt
from (select 1) x
lateral view posexplode (split (space (99),' ')) pe
) t
;
explain dependency
select count (column_name)
from table_name
where year >= year (date_sub (from_unixtime (unix_timestamp ()),7))
and month >= month (date_sub (from_unixtime (unix_timestamp ()),7))
and day >= day (date_sub (from_unixtime (unix_timestamp ()),7))
;
{"input_partitions":[{"partitionName":"по умолчанию @ table_name @ год =2016/ месяц = 11 / день =14"},{"partitionName":"по умолчанию @ table_name @ год =2016/ месяц = 11 / день =15"},{"partitionName":" по умолчанию @ table_name @ год =2016/ месяц = 11 / день =16"},{"partitionName":" по умолчанию @ table_name @ год =2016/ месяц = 11 / день =17"},{"partitionName":"по умолчанию @ table_name @ год =2016/ месяц = 11 / день =18"},{"partitionName":"по умолчанию @ table_name @ год =2016/ месяц = 11 / день =19"},{"partitionName":"по умолчанию @ table_name @ год =2016/ месяц = 11 / день = 20"}, { "partitionName": "по умолчанию @ table_name @ год =2016/ месяц = 11 / день = 21"}, {" partitionName ":" по умолчанию @ table_name @ год =2016/ месяц = 11 / день = 22 "}, {" partitionName ":" по умолчанию @ table_name @ год =2016/ месяц = 11 / день =23"},{"partitionName":"по умолчанию @ table_name @ год =2016/ месяц = 11 / день =24"},{"partitionName":"по умолчанию @ table_name @ год =2016/ месяц = 11 / день =25"},{"partitionName":" По умолчанию @ table_name @ год =2016/ месяц = 11 / день =26"},{"partitionName":" по умолчанию @ table_name @ год =2016/ месяц = 11 / день =27"},{"partitionName":" по умолчанию @ table_name @ год =2016/ месяц = 11 / день =28"},{" ра rtitionName ":" по умолчанию @ table_name @ год =2016/ месяц = 11 / день =29"},{"partitionName":" по умолчанию @ table_name @ год =2016/ месяц = 11 / день =30"},{"partitionName":"по умолчанию @ table_name @ год =2016/ месяц = 12 / день = 1"}, { "partitionName": "по умолчанию @ table_name @ год =2016/ месяц = 12 / день = 10"}, { "partitionName":" По умолчанию @ table_name @ год =2016/ месяц = 12 / день = 11 "}, {" partitionName ":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день = 12 "}, {" partitionName ":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день =13"},{"partitionName":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день = 14 "}, {" partitionName ":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день =15"},{"partitionName":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день =16"},{"partitionName":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день = 17 "}, {" partitionName ":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день = 18 "}, {" partitionName ":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день = 19 "}, {" partitionName ":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день = 2 "}, {" partitionName ":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день = 20 "}, {" partitionName ":" по умолчанию @ таблица _name @ год =2016/ месяц = 12 / день = 21 "}, {" partitionName ":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день = 22 "}, {" partitionName ":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день = 23 "}, {" partitionName ":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день = 24 "}, {" partitionName ":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день = 25 "}, {" partitionName ":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день =26"},{"partitionName":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день =27"},{"partitionName":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день =28"},{"partitionName":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день =29"},{"partitionName":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день =3"},{"partitionName":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день = 30 "}, {" partitionName ":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день =31"},{"partitionName":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день =4"},{"partitionName":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день =5"},{"partitionName":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день =6"},{"partitionName":"по умолчанию @ table_name @ год =2016/ месяц = 12 / день =7"},{"partitionName":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день =8"},{"partitionName":" по умолчанию @ table_name @ год =2016/ месяц = 12 / день =9"},{"partitionName":"по умолчанию @ table_name @ год =2017/ месяц = 1 / день = 1"}, { "partitionName": "по умолчанию @ table_name @ год =2017/ месяц = 1 / день = 10"}, { "partitionName": "по умолчанию @ table_name @ год =2017/ месяц = 1 / день = 11"}, { "partitionName": "по умолчанию @ table_name @ год =2017/ месяц = 1 / день = 12"}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 1 / день =13"},{"partitionName":" по умолчанию @ table_name @ год =2017/ месяц = 1 / день = 14 "}, {" partitionName": "по умолчанию @ table_name @ год =2017/ месяц = 1 / день = 15"}, { "partitionName": "по умолчанию @ table_name @ год =2017/ месяц = 1 / день = 16"}, { "partitionName":" По умолчанию @ table_name @ год =2017/ месяц = 1 / день = 17 "}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 1 / день = 18 "}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 1 / день = 19 "}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 1 / день = 2 "}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 1 / день = 20 "}, {" partitionName ":" по умолчанию @ table_name @ у Ухо =2017/ месяц = 1 / день = 21 "}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 1 / день = 22 "}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 1 / день = 23 "}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 1 / день = 24 "}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 1 / день = 25 "}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 1 / день =26"},{"partitionName":" по умолчанию @ table_name @ год =2017/ месяц = 1 / день =27"},{"partitionName":" по умолчанию @ table_name @ год =2017/ месяц = 1 / день =28"},{"partitionName":" по умолчанию @ table_name @ год =2017/ месяц = 1 / день =29"},{"partitionName":" по умолчанию @ table_name @ год =2017/ месяц = 1 / день =3"},{"partitionName":" по умолчанию @ table_name @ год =2017/ месяц = 1 / день = 30 "}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 1 / день =31"},{"partitionName":" по умолчанию @ table_name @ год =2017/ месяц = 1 / день = 4" }, { "partitionName": "по умолчанию @ table_name @ год =2017/ месяц = 1 / день = 5"}, { "partitionName": "по умолчанию @ table_name @ год =2017/ месяц = 1 / день = 6"}, { "partitionName": "по умолчанию @ table_name @ год =2017/ месяц = 1 / день = 7"}, { "partitionName": "г EFAULT @ table_name @ год =2017/ месяц = 1 / день =8"},{"partitionName":" по умолчанию @ table_name @ год =2017/ месяц = 1 / день = 9 "}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 2 / день = 1 "}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 2 / день = 10 "}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 2 / день = 11 "}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 2 / день = 12 "}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 2 / день =13"},{"partitionName":" по умолчанию @ table_name @ год =2017/ месяц = 2 / день = 14 "}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 2 / день =15"},{"partitionName":" по умолчанию @ table_name @ год =2017/ месяц = 2 / день =16"},{"partitionName":" по умолчанию @ table_name @ год =2017/ месяц = 2 / день = 17 "}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 2 / день = 18 "}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 2 / день = 19 "}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 2 / день = 2 "}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 2 / день = 20 "}, {" partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 2 / день = 21" }, { "PartitionName": "по умолчанию @ table_name @ год =2017/ месяц = 2 / день = 3"}, { "partitionName": "по умолчанию @ table_name @ год =2017/ месяц = 2 / день = 4"}, { "partitionName": "по умолчанию @ table_name @ год =2017/ месяц = 2 / день = 5"}, { "partitionName": "по умолчанию @ table_name @ год =2017/ месяц = 2 / день = 6"}, { "partitionName ":" по умолчанию @ table_name @ год =2017/ месяц = 2 / день =7"},{"partitionName":" по умолчанию @ table_name @ год =2017/ месяц = 2 / день = 8 "}, {" partitionName ": "по умолчанию @ table_name @ год =2017/ месяц = 2 / день = 9"}], "input_tables": [{ "имя_таблица": "по умолчанию @ table_name", "TABLETYPE":"MANAGED_TABLE"}]}
explain dependency
select count (column_name)
from table_name
where year >= year (date_sub (current_date,7))
and month >= month (date_sub (current_date,7))
and day >= day (date_sub (current_date,7))
;
{"input_partitions":[{"partitionName":"по умолчанию @ table_name @ год =2017/ месяц = 2 / день =14"},{"partitionName":"по умолчанию @ table_name @ год =2017/ месяц = 2 / день =15"},{"partitionName":" по умолчанию @ table_name @ год =2017/ месяц = 2 / день =16"},{"partitionName":" по умолчанию @ table_name @ год =2017/ месяц = 2 / день =17"},{"partitionName":"по умолчанию @ table_name @ год =2017/ месяц = 2 / день =18"},{"partitionName":"по умолчанию @ table_name @ год =2017/ месяц = 2 / день =19"},{"partitionName":"по умолчанию @ table_name @ год =2017/ месяц = 2 / день = 20"}, { "partitionName": "по умолчанию @ table_name @ год =2017/ месяц = 2 / день = 21"}]," input_tables ": [{" имя_таблица ":" по умолчанию @ table_name", "TABLETYPE":"MANAGED_TABLE"}]}