Ефективен начин за добавяне на месеци към цифров формат YMD?

В момента съм зает с малко SQL (както в Netezza, така и в HiveQL). Нашата компания често използва цифрови полета за дати (напр. 20150602 за дата, 20160400 за месец).

Трябва да добавя 6 месеца към една от тези дати и обикновено бих направил:

cast(to_char(add_months(to_date(A.date,'yyyyMMdd'),6),'yyyyMMdd') as int) 

Въпреки че това не е красиво, работи и не знам по-кратък или по-добър начин. Основният ми проблем е, че това е голяма таблица (12 милиарда реда) и преобразуването на дата не е точно бързо, а заявката, върху която работя, се убива поради твърде дълга работа. Има ли по-добър начин да направите това?


person BallzofFury    schedule 31.08.2017    source източник
comment
какъв е типът данни на тези полета? и на коя версия на Hive си?   -  person Vamsi Prabhala    schedule 31.08.2017
comment
Това не е Hive код   -  person David דודו Markovitz    schedule 31.08.2017
comment
@Dudu: Прав си, това е Netezza. Въпросът е все същият.   -  person BallzofFury    schedule 31.08.2017
comment
@Vamsi: Типът данни е int. Версията на Hive е 1.2.1000.2.5.3.0-37   -  person BallzofFury    schedule 31.08.2017
comment
Таговете, свързани с Hive, са премахнати. Ако искате да зададете въпрос, свързан с Hive, отворете нова публикация за него.   -  person David דודו Markovitz    schedule 31.08.2017
comment
SELECT DATEADD(M,6,'20160602') резултат 2016-12-02 00:00:00.000   -  person Jacob H    schedule 31.08.2017
comment
Какво имате предвид под преобразуването на дата не е бързо? Обикновено го намирам за доста бързо. Сменяте ли датата с АКТУАЛИЗАЦИЯ или CTAS?   -  person ScottMcG    schedule 31.08.2017
comment
@ScottMcG: Имам предвид, че е сравнително бавно, както при аритметиката с цели числа. Започвам да си мисля, че няма да мога да го преобразувам в дата, така че ще се опитам да разгледам някои други оптимизации по-рано в заявката.   -  person BallzofFury    schedule 31.08.2017
comment
Мисля, че си прав, че няма начин да се избегне преобразуването, изрично или неявно, но аз правя този вид преобразуване през цялото време и дори на стара двойна единична стойка това не е нещо, за което изобщо се притеснявам. Но контекстът също има значение. Искате ли да направите add_months като част от ETL или е част от BI заявка или...?   -  person ScottMcG    schedule 31.08.2017
comment
Правя генериране на функции за модел на машинно обучение. Нещата са там, че искам да присъединя една наистина голяма маса към друга въз основа на събития в рамките на 6 месеца от дадена дата. Присъединяването вероятно също е прилична част от забавянето tbh. Сега, след като го споменахте, ще бъде ли неравенството за свързване по дата по-бавно от свързване върху неравенство с цяло число?   -  person BallzofFury    schedule 31.08.2017
comment
Обзалагам се, че си прав. По-скоро свързването на неравенството ви забавя, отколкото какъвто и да е тип преобразуване. Netezza съхранява дати и цели числа под кориците като цели числа и те хешират/сравняват с подобна ефективност, така че това е добре. Задължителното присъединяване към вложен цикъл, което получавате при присъединяване към неравенство, ще бъде много по-бавно от оптималното/обичайно хеш присъединяване.   -  person ScottMcG    schedule 31.08.2017


Отговори (1)


Бих опитал да се присъединя към таблица с измерения на времето с тези колони (ВСИЧКИ int): MonthId StartDate EndDate 1 20150101 20150199 2 20150201 20150299 3 20150301 20150399 . . . 24 20161201 20161299

След това направете това, ако просто искате първия ден от месеца като резултат (ще ви е необходим различен график, ако искате да се присъедините - преобразувайте пълната дата, но този пример е по-лесен за писане на iPad и може да бъде разширен):

select 
  t2.startdate, 
  y.* 
from yourtable y
Join timetab t1
  on y.dateAsInt between t1.StartDate and t1.EndDate
Join t2 
  On t1.monthid=t2.monthid-6
person Lars G Olsen    schedule 31.08.2017