web-dev-qa-db-fra.com

Hive from_unixtime pendant millisecondes

Nous avons une colonne d'horodatage Epoch (BIGINT) stockée dans Hive. Nous voulons obtenir la date 'aaaa-MM-jj' pour cette époque. Le problème est que mon époque est en millisecondes, par exemple 1409535303522. Sélectionnez donc l'horodatage, from_unixtime (horodatage, 'aaaa-MM-jj') donne des résultats erronés pour la date car il attend Epoch en secondes.

J'ai donc essayé de le diviser par 1000. Mais ensuite, il est converti en Double et nous ne pouvons pas lui appliquer de fonction. Même CAST ne fonctionne pas lorsque j'essaie de convertir ce double en Bigint.

15
Sourabh Potnis

Résolu par la requête suivante:

select timestamp, from_unixtime(CAST(timestamp/1000 as BIGINT), 'yyyy-MM-dd') from Hadoop_V1_Main_text_archieved limit 10;
28
Sourabh Potnis

Dans la réponse d'origine, vous obtiendrez une chaîne, mais si vous souhaitez obtenir la date, vous devez appeler une distribution supplémentaire avec la date:

select 
    timestamp, 
    cast(from_unixtime(CAST(timestamp/1000 as BIGINT), 'yyyy-MM-dd') as date) as date_col 
from Hadoop_V1_Main_text_archieved 
limit 10;

Docs pour les dates de casting et les horodatages. Pour convertir une chaîne en date:

cast(string as date)
Si la chaîne est au format 'AAAA-MM-JJ', une valeur de date correspondant à cette année/mois/jour est renvoyée. Si la valeur de chaîne ne correspond pas à ce format, NULL est renvoyé.

Le type de date n'est disponible que depuis Hive> 0.12.0 Comme mentionné ici :

DATE (Remarque: disponible uniquement à partir de Hive 0.12.0)

3
Anton Protopopov

timestamp_ms est unixtime en millisecondes

SELECT from_unixtime (floor (CAST (timestamp_ms AS BIGINT)/1000), 'yyyy-MM-dd HH: mm: ss.SSS') as created_timestamp FROM table_name;

2