Est-il vrai que Hive
et SparkSQL
ne prennent pas en charge le type de données de datetime
? De ma lecture des références, elles semblent ne supporter que date
et timestamp
. Le premier ne fait pas partie du temps (c'est-à-dire heure, minute et seconde); ce dernier a une haute précision (jusqu'à la milliseconde) mais n'est pas très lisible par l'homme (il nécessite toujours une conversion par from_unixtime()
ou date_format()
, et le résultat serait une chaîne, pas un type datetime
). En revanche, d'autres systèmes de base de données, tels que MySQL
, ont un type de données datetime
. (Par exemple, voir ce ref)Hive et SparkSQL ne prennent pas en charge le type datetime?
De bonnes suggestions/astuces pour contourner cette limitation?
Ce sont mes références:
Mise à jour: Sur la lisibilité humaine
Ici, je donne un exemple sur MySQL
pour illustrer mon point à propos lisibilité humaine:
-- MySQL code
select
cast(now() as date) as asDate, -- human readable
cast(now() as dateTime) as asDateTime, -- human readable
unix_timestamp(now()) as asUnixTimestamp, -- not H/R
cast(from_unixtime(unix_timestamp(now()))
as dateTime)
asDateTimeAgain -- cast into dateTime to make it H/R
L'écran serait ceci:
(Faites attention à la quatrième colonne asDateTimeAgain
, qui est lisible par l'homme)
+------------+---------------------+-----------------+---------------------+
| asDate | asDateTime | asUnixTimestamp | asDateTimeAgain |
+------------+---------------------+-----------------+---------------------+
| 2017-10-21 | 2017-10-21 22:37:15 | 1508625435 | 2017-10-21 22:37:15 |
+------------+---------------------+-----------------+---------------------+
1 row in set (0.00 sec)
Et la limitation n'est pas seulement lisibilité humaine. Une chaîne représentation de datetime
est lisible par un humain, mais il a perdu la propriété de datetime
et exigera conversion plus en arrière dans datatime
pour le traitement de date/heure, tels que min()
, max()
et capturer les valeurs dans java.util.Date
-- Hive/SparkSQL code
select
current_date asDate,
unix_timestamp() asUnixTimestamp,
from_unixtime(unix_timestamp(),
'yyyy-MM-dd HH:mm:ss') asString
la sortie serait celui-ci où la troisième colonne est une chaîne et non un type datetime
------------------------------------------------------
| asDate | asUnixTimestamp | asString |
| ---------- | --------------- | ------------------- |
| 2017-10-21 | 1508625586 | 2017-10-21 22:39:46 |
------------------------------------------------------
Merci pour la réponse! J'ai mis à jour ma question pour clarifier ce que je veux dire par «lisibilité humaine». S'il vous plaît vérifier et commenter. – leeyuiwah
En fait, mon problème peut être lié à un autre problème. Si vous le pouvez, jetez aussi un coup d'oeil à mon autre question: https://stackoverflow.com/questions/46869005/hive-sparksql-how-to-convert-a-unix-timestamp-into-a-timestamp-not- string Merci beaucoup! – leeyuiwah
@leeyuiwah. . . Hive a tendance à être assez flexible sur les conversions entre les chaînes et les formats internes. –