J'essaie de filtrer les données entre le 1er septembre 2010 et le 31 août 2013 dans une table Hive. La colonne contenant la date est au format chaîne (aaaa-mm-jj). Je peux utiliser month () et year () sur cette colonne. Mais comment puis-je les utiliser pour filtrer les données entre les dates ci-dessus? Tous les exemples/exemples de code seraient les bienvenus!
Le gros avantage du format de date yyyy-mm-dd
est qu’il n’est pas nécessaire d’extraire month()
et year()
, vous pouvez effectuer des comparaisons directement sur des chaînes:
SELECT *
FROM your_table
WHERE your_date_column >= '2010-09-01' AND your_date_column <= '2013-08-31';
Tout comme SQL, Hive prend en charge l’opérateur BETWEEN pour une déclaration plus concise:
SELECT *
FROM your_table
WHERE your_date_column BETWEEN '2010-09-01' AND '2013-08-31';
Hive a beaucoup de bonnes date pour analyser les UDF: https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-DateFunctions
Comme le suggère Nigel Tufnel, faire la comparaison de chaîne est probablement la solution la plus simple, bien que techniquement, elle soit peu sûre. Mais vous n'avez probablement pas à vous inquiéter de cela à moins que vos tables contiennent des données historiques sur l'âge médiéval (dates avec seulement 3 chiffres) ou des romans de science-fiction (dates avec plus de 4 ans).
Quoi qu’il en soit, si vous vous trouvez dans une situation où vous voudriez faire des comparaisons de date plus sophistiquées, ou si votre format de date n’est pas dans un ordre «du plus grand au plus petit», par exemple. la convention américaine "mm/jj/aaaa", vous pouvez utiliser unix_timestamp
avec deux arguments:
select *
from your_table
where unix_timestamp(your_date_column, 'yyyy-MM-dd') >= unix_timestamp('2010-09-01', 'yyyy-MM-dd')
and unix_timestamp(your_date_column, 'yyyy-MM-dd') <= unix_timestamp('2013-08-31', 'yyyy-MM-dd')
Pas besoin d'extraire le mois et l'année. Il suffit d'utiliser la fonction unix_timestamp (date String, format String).
Par exemple:
select yourdate_column
from your_table
where unix_timestamp(yourdate_column, 'yyyy-MM-dd') >= unix_timestamp('2014-06-02', 'yyyy-MM-dd')
and unix_timestamp(yourdate_column, 'yyyy-MM-dd') <= unix_timestamp('2014-07-02','yyyy-MM-dd')
order by yourdate_column limit 10;
Vous devez convertir le format de chaîne au format de date requis comme suit pour obtenir le résultat souhaité.
Hive> select * from salesdata01 where from_unixtime(unix_timestamp(Order_date, 'dd-MM-yyyy'),'yyyy-MM-dd') >= from_unixtime(unix_timestamp('2010-09-01', 'yyyy-MM-dd'),'yyyy-MM-dd') and from_unixtime(unix_timestamp(Order_date, 'dd-MM-yyyy'),'yyyy-MM-dd') <= from_unixtime(unix_timestamp('2011-09-01', 'yyyy-MM-dd'),'yyyy-MM-dd') limit 10;
OK
1 3 13-10-2010 Low 6.0 261.54 0.04 Regular Air -213.25 38.94
80 483 10-07-2011 High 30.0 4965.7593 0.08 Regular Air 1198.97 195.99
97 613 17-06-2011 High 12.0 93.54 0.03 Regular Air -54.04 7.3
98 613 17-06-2011 High 22.0 905.08 0.09 Regular Air 127.7 42.76
103 643 24-03-2011 High 21.0 2781.82 0.07 Express Air -695.26 138.14
127 807 23-11-2010 Medium 45.0 196.85 0.01 Regular Air -166.85 4.28
128 807 23-11-2010 Medium 32.0 124.56 0.04 Regular Air -14.33 3.95
160 995 30-05-2011 Medium 46.0 1815.49 0.03 Regular Air 782.91 39.89
229 1539 09-03-2011 Low 33.0 511.83 0.1 Regular Air -172.88 15.99
230 1539 09-03-2011 Low 38.0 184.99 0.05 Regular Air -144.55 4.89
Time taken: 0.166 seconds, Fetched: 10 row(s)
Hive> select * from salesdata01 where from_unixtime(unix_timestamp(Order_date, 'dd-MM-yyyy'),'yyyy-MM-dd') >= from_unixtime(unix_timestamp('2010-09-01', 'yyyy-MM-dd'),'yyyy-MM-dd') and from_unixtime(unix_timestamp(Order_date, 'dd-MM-yyyy'),'yyyy-MM-dd') <= from_unixtime(unix_timestamp('2010-12-01', 'yyyy-MM-dd'),'yyyy-MM-dd') limit 10;
OK
1 3 13-10-2010 Low 6.0 261.54 0.04 Regular Air -213.25 38.94
127 807 23-11-2010 Medium 45.0 196.85 0.01 Regular Air -166.85 4.28
128 807 23-11-2010 Medium 32.0 124.56 0.04 Regular Air -14.33 3.95
256 1792 08-11-2010 Low 28.0 370.48 0.04 Regular Air -5.45 13.48
381 2631 23-09-2010 Low 27.0 1078.49 0.08 Regular Air 252.66 40.96
656 4612 19-09-2010 Medium 9.0 89.55 0.06 Regular Air -375.64 4.48
769 5506 07-11-2010 Critical 22.0 129.62 0.05 Regular Air 4.41 5.88
1457 10499 16-11-2010 Not Specified 29.0 6250.936 0.01 Delivery Truck 31.21 262.11
1654 11911 10-11-2010 Critical 25.0 397.84 0.0 Regular Air -14.75 15.22
2323 16741 30-09-2010 Medium 6.0 157.97 0.01 Regular Air -42.38 22.84
Time taken: 0.17 seconds, Fetched: 10 row(s)
Si vous ne pouvez pas extraire la même chose avec des horodatages Unix, écrivez un fichier UDF Java pour Hive