web-dev-qa-db-fra.com

Comment soustraire un jour de la date du jour puis convertir en chaîne dans Hive

Voici le cas. J'essaie de créer une syntaxe de sélection pour obtenir les données du jour précédent (aujourd'hui, nous avons 21h10; par conséquent, je devrais avoir des données avec une date à 20,10. La requête fera partie du processus ETL dans Talend, donc je ne peux pas simplement faire where date = '2016-10-20') Le problème est que toutes les colonnes de la source de données sont en type VARCHAR ou STRING - date également. La source est sur Hive Hadoop.

Mon code:

select 
cast(to_date(from_unixtime(unix_timestamp(dzien ,'yyyyMMdd'), 'yyyy-MM-dd')) as date),
count(ns_utc) as ILOSC_ODSLON
from portal.portal_data 
where
portal_data.opl_ev_ty is null 
and portal_data.opl_ev_as is null
and cast(to_date(from_unixtime(unix_timestamp(dzien ,'yyyyMMdd'), 'yyyy-MM-dd')) as date) = CAST(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP()))as date) - interval '1' day

GROUP BY 
cast(to_date(from_unixtime(unix_timestamp(dzien ,'yyyyMMdd'), 'yyyy-MM-dd')) as date)

Avec ce code, la requête ne renvoie rien sauf le nom des colonnes. Le problème est probablement lié à cette partie = CAST(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP()))as date) - interval '1' day.

J'ai fait des tests. Quand j'exécute cette requête 

select CAST(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP()))as date) - interval '1' day

le résultat est 2016-10-20 00:00:00.0 et la partie 00: 00: 00.0 ruine probablement ma requête, car lorsque la requête principale est remplacée par la fonction = CAST(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP()))as date) - interval '1' day, je mets la condition = '2016-10-20' résultat est celui attendu.

Pouvez-vous s'il vous plaît me guider comment résoudre ce problème?

Au lieu de Hue, j'utilise SQL Workbench

3
Voystin

Le problème est la façon dont vous essayez de soustraire un jour à la date.

CAST(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP()-86400))as date) 
3
Rahul Sharma

une fois que vous avez analysé la date, utilisez la fonction date_sub disponible dans Hive

date_sub(string startdate, int days) 

date_sub('2008-12-31', 1) = '2008-12-30'

Vous pouvez même suivre le lien ci-dessous. 

https://www.qubole.com/resources/cheatsheet/Hive-function-cheat-sheet/

14
Achyuth

DATE_SUB est disponible dans Hive 2.1.0

date_sub(date/timestamp/string startdate, tinyint/smallint/int days)

Soustrait un nombre de jours pour commencer la date: date_sub ('2008-12-31', 1) = '2008-12-30'.

Avant Hive 2.1.0 (Hive-13248), le type de retour était une chaîne, car aucun type de date n'existait lors de la création de la méthode.

4
Sanjiv

cast (date_sub (CURRENT_DATE, 1) sous forme de chaîne)

0