web-dev-qa-db-fra.com

Chaîne de distribution de ruche pour dd-MM-yyyy

Comment puis-je convertir une chaîne au format 'jj-MM-aaaa' en type de date également au format 'jj-MM-aaaa' dans Hive?

Quelque chose dans le genre de:

CAST('12-03-2010' as date 'dd-mm-yyyy')
20
pele88

essayer:

from_unixtime(unix_timestamp('12-03-2010' , 'dd-MM-yyyy'))
32
Ardit

Si j'ai bien compris, vous essayez de convertir une chaîne représentant une date donnée en un autre type.

Note: (Comme l'a mentionné Samson Scharfrichter)

  • la représentation par défaut d'une date est ISO8601
  • une date est stockée en binaire (pas sous forme de chaîne)

Il y a plusieurs façons de le faire. Et vous êtes proche de la solution. Je voudrais utiliser le CAST (qui convertit en un DATE_TYPE):

SELECT cast('2018-06-05' as date); 

Résultat: 2018-06-05 DATE_TYPE

ou (selon votre modèle)

select cast(to_date(from_unixtime(unix_timestamp('05-06-2018', 'dd-MM-yyyy'))) as date)

Résultat: 2018-06-05 DATE_TYPE

Et si vous décidez de convertir ISO8601 en un type de date:

select cast(to_date(from_unixtime(unix_timestamp(regexp_replace('2018-06-05T08:02:59Z', 'T',' ')))) as date);

Résultat: 2018-06-05 DATE_TYPE

Hive a ses propres fonctions, j'ai écrit quelques exemples pour illustrer ces fonctions de date et de casting:

Exemples de fonctions de date et d'horodatage:

Convertir chaîne/horodatage/date en DATE

SELECT cast(date_format('2018-06-05 15:25:42.23','yyyy-MM-dd') as date); -- 2018-06-05 DATE_TYPE
SELECT cast(date_format(current_date(),'yyyy-MM-dd') as date); -- 2018-06-05 DATE_TYPE
SELECT cast(date_format(current_timestamp(),'yyyy-MM-dd') as date);  -- 2018-06-05 DATE_TYPE

Convertir chaîne/horodatage/date en BIGINT_TYPE

SELECT to_unix_timestamp('2018/06/05 15:25:42.23','yyyy/MM/dd HH:mm:ss'); -- 1528205142 BIGINT_TYPE
SELECT to_unix_timestamp(current_date(),'yyyy/MM/dd HH:mm:ss'); -- 1528205000 BIGINT_TYPE
SELECT to_unix_timestamp(current_timestamp(),'yyyy/MM/dd HH:mm:ss'); -- 1528205142 BIGINT_TYPE

Convertir chaîne/horodatage/date en chaîne

SELECT date_format('2018-06-05 15:25:42.23','yyyy-MM-dd'); -- 2018-06-05 STRING_TYPE
SELECT date_format(current_timestamp(),'yyyy-MM-dd'); -- 2018-06-05 STRING_TYPE
SELECT date_format(current_date(),'yyyy-MM-dd'); -- 2018-06-05 STRING_TYPE

Convertir BIGINT unixtime en chaîne

SELECT to_date(from_unixtime(unixtime,'yyyy/MM/dd HH:mm:ss')); -- 2018-06-05 STRING_TYPE

Conversion de chaîne en BIGINT unixtime

SELECT unix_timestamp('2018-06-05 15:25:42.23','yyyy-MM-dd') as TIMESTAMP; -- 1528149600 BIGINT_TYPE

Convertir une chaîne en TIMESTAMP

SELECT cast(unix_timestamp('2018-06-05 15:25:42.23','yyyy-MM-dd') as TIMESTAMP); -- 1528149600 TIMESTAMP_TYPE

Idempotent (String -> String)

SELECT from_unixtime(to_unix_timestamp('2018/06/05 15:25:42.23','yyyy/MM/dd HH:mm:ss')); -- 2018-06-05 15:25:42 STRING_TYPE

Idempotent (Date -> Date)

SELECT cast(current_date() as date); -- 2018-06-26 DATE_TYPE

Date actuelle/horodatage

SELECT current_date(); -- 2018-06-26 DATE_TYPE
SELECT current_timestamp(); -- 2018-06-26 14:03:38.285 TIMESTAMP_TYPE
10
KeyMaker00

Autant que vous puissiez, vous devez reformater votre chaîne au format ISO pour pouvoir la transcrire au format . Date :

cast(concat(substr(STR_DMY,7,4), '-',
            substr(STR_DMY,1,2), '-',
            substr(STR_DMY,4,2)
           )
     as date
     ) as DT

Pour afficher une date en tant que chaîne avec un format spécifique, c'est le autrement, sauf si vous avez Hive 1.2+ et pouvez utiliser date_format()

=> avez-vous consultez la documentation au fait?

5

Supposons que vous ayez une colonne 'birth_day' dans votre table au format chaîne. Utilisez la requête suivante pour filtrer à l'aide de birth_day.

date_Format(birth_day, 'yyyy-MM-dd')

Vous pouvez l'utiliser dans une requête de la manière suivante

select * from yourtable
where 
date_Format(birth_day, 'yyyy-MM-dd') = '2019-04-16';
1
Terminator17