J'ai la représentation sous forme de chaîne suivante d'un horodatage dans ma table Hive:
20130502081559999
J'ai besoin de le convertir en une chaîne comme ceci:
2013-05-02 08:15:59
J'ai essayé de suivre ({code} >>> {result}):
from_unixtime(unix_timestamp('20130502081559999', 'yyyyMMddHHmmss')) >>> 2013-05-03 00:54:59
from_unixtime(unix_timestamp('20130502081559999', 'yyyyMMddHHmmssMS')) >>> 2013-09-02 08:15:59
from_unixtime(unix_timestamp('20130502081559999', 'yyyyMMddHHmmssMS')) >>> 2013-05-02 08:10:39
La conversion en horodatage puis en unixtime semble étrange, quelle est la bonne façon de procéder?
MODIFIER Je l'ai compris.
from_unixtime(unix_timestamp(substr('20130502081559999',1,14), 'yyyyMMddHHmmss')) >>> 2013-05-02 08:15:59
ou
from_unixtime(unix_timestamp('20130502081559999', 'yyyyMMddHHmmssSSS')) >>> 2013-05-02 08:15:59
Pourtant ... Y a-t-il une meilleure façon?
Vous ne savez pas ce que vous entendez par "meilleure façon", mais vous pouvez toujours écrire votre propre fonction pour gérer la conversion de date.
Il semble que votre format comporte trois chiffres en millisecondes. Je suppose que, selon le SimpleDateFormat , vous devez utiliser les éléments suivants:
from_unixtime(unix_timestamp('20130502081559999', 'yyyyMMddHHmmssSSS'))
J'espère que cela pourra aider.
Supposons que vous ayez un fichier d'entrée comme celui-ci
fichier: ///data/csv/temptable/temp.csv
1 2015-01-01
2 2015-10-10 12:00:00.232
3 2016-02-02
4 2015-09-12 23:08:07.124
Ensuite, vous pouvez également essayer cette approche:
create external table temptable(id string, datetime string) row format delimited fields terminated by '\t' stored as textfile LOCATION 'file:///data/csv/temptable';
create table mytime as select id, from_utc_timestamp(date_format(datetime,'yyyy-MM-dd HH:mm:ss.SSS'),'UTC') as datetime from temptable;