2017-10-21 69 views
0

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:

  1. Hive Language Manual: Date/Time Types
  2. Hive Language Manual: Date Functions

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 | 
------------------------------------------------------ 

Répondre

0

(je fournirai la réponse moi-même ici)

Ne pas confondre avec timestamp "timestamp unix"

timestamp est réellement lisible par l'homme; tandis que "unix timestamp", étant le nombre de secondes/millisecondes depuis le 1er janvier 1970, est en effet pas très lisible par l'homme.

Cependant, nous pouvons utiliser cast() pour convertir ce dernier (via une fonction from_unixtime()) pour obtenir le premier.

-- Hive/SparkSQL code 
select 
    current_date     asDate,   -- human readable 
    unix_timestamp()    asUnixTimestamp, -- not human readable 
    from_unixtime(unix_timestamp()) asString,  -- human readable 
    cast(from_unixtime(unix_timestamp())    
    as date)      asDate2,   -- human readable 
    cast(from_unixtime(unix_timestamp())    
    as timestamp)     asTimestamp  -- human readable 

Résultat:

------------------------------------------------------------------------------------------- 
| asDate  | asUnixTimestamp | asString   | asDate2 | asTimestamp   | 
| ---------- | --------------- | ------------------- | ---------- | --------------------- | 
| 2017-10-22 | 1508687321  | 2017-10-22 15:48:41 | 2017-10-22 | 2017-10-22 15:48:41.0 | 
------------------------------------------------------------------------------------------- 
2

Timestamp fait ce que vous voulez. Je ne suis pas sûr de ce que vous entendez par "humain lisible". Toutes les bases de données stockent les dates et les heures dans un format interne, ce qui n'est pas du tout lié au format d'affichage. Et - à une approximation proche - les formats internes sont différents pour différentes bases de données. (Wikipedia a un amusement article sur certaines des différentes dates "0" utilisées par différents systèmes informatiques.)

Si vous voulez voir la valeur d'une manière particulière, formatez le résultat sous forme de chaîne. Hive a un ensemble complet de fonctions de chaîne pour gérer les valeurs timestamp, et il convertit facilement les littéraux de chaîne en horodatages, si nécessaire.

+0

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

+0

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

+0

@leeyuiwah. . . Hive a tendance à être assez flexible sur les conversions entre les chaînes et les formats internes. –