web-dev-qa-db-fra.com

Comment convertir une chaîne en timestamp avec millisecondes dans Hive

J'ai une chaîne '20141014123456789' qui représente un horodatage avec des millisecondes que je dois convertir en horodatage dans Hive (0.13.0) sans perdre les millisecondes.

J'ai essayé cela mais unix_timestamp retourne un entier, alors je perds les millisecondes:

from_unixtime(unix_timestamp('20141014123456789', 'yyyyMMddHHmmssSSS'))      >> 2014-10-14 12:34:56    

Lancer une ficelle fonctionne:

cast('2014-10-14 12:34:56.789' as timestamp)      >> 2014-10-14 12:34:56.789

mais ma chaîne n'est pas sous cette forme.

Je pense que j'ai besoin de reformater ma chaîne de '20141014123456789' à '2014-10-14 12: 34: 56.789'. Mon défi est de savoir comment faire cela sans une concaténation désordonnée de sous-chaînes. 

6
David Ford

J'ai trouvé un moyen d'éviter la concaténation désordonnée de sous-chaînes en utilisant le code suivant:

select cast(regexp_replace('20141014123456789', 
                           '(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{3})',
                           '$1-$2-$3 $4:$5:$6.$7') as timestamp) 
8
David Ford

Je ne pense pas que cela puisse être fait sans être salissant. Parce que, selon la documentation de la fonction unix_timestamp (), il renvoie le temps en secondes et omettra donc la partie millisecondes. 

"Convertit la chaîne temporelle avec le modèle donné en horodatage Unix (en secondes) , renvoie 0 si échec: unix_timestamp ('2009-03-20', 'yyyy-MM-jj') = 1237532400. "

La meilleure option serait d’écrire un fichier UDF pour le gérer, c’est-à-dire éviter les concaténations compliquées. Cependant, la concaténation (bien que salissante) serait meilleure pour le travail.

0
Amar

le champ date était sous cette forme 2015-07-22T09: 00: 32.956443Z (stocké sous forme de chaîne). Je devais faire quelques manipulations de date. La commande suivante même si un peu de désordre fonctionnait bien pour moi :)

select cast(concat(concat(substr(date_created,1,10),' '),substr(date_created,12,15)) as timestamp) from tablename;

cela semble déroutant, mais c'est assez facile si vous le décomposez. extraire la date et l'heure avec des millisecondes et concaténer un espace entre les deux, puis concaténer le tout et le transformer en horodatage. maintenant, cela peut être utilisé pour des manipulations de date ou d'horodatage. 

0
Vini