2012-08-06 18 views
5

Her zaman Hive yesterdays date anlamına gelir current date -1 almak için herhangi bir yolu var mı? Ve bu formatta - 20120805?Sysdate -1 ini al Kovanı

Bugün Aug 6th olduğu gibi yesterday's date ilişkin verileri almak için böyle benim sorguyu çalıştırabilirsiniz

-

select * from table1 where dt = '20120805'; 

Ama dünkü tarihi almak için date_sub function ile bu şekilde yapıyor çalıştı Aşağıdaki tablo üzerinde bölümlenmiş olarak date (dt) sütunu.

select * from table1 where dt = date_sub(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP(), 
'yyyyMMdd')) , 1)  limit 10; 

Tüm bölümlerdeki verileri mi arıyorsunuz? Niye ya? Sorgumda yanlış bir şey yapıyorum?

Taranan tüm tabloyu önlemek için değerlendirmeyi bir alt sorguda nasıl yapabilirim? MySQL

cevap

10

deneyin gibi bir şey:

select * from table1 
where dt >= from_unixtime(unix_timestamp()-1*60*60*24, 'yyyyMMdd'); 

Bu kovanın tüm tabloyu taradığını düşünmemeniz durumunda çalışır. from_unixtime belirleyici değildir, dolayısıyla Hive'deki sorgu planlayıcısı sizin için optimize olmaz. Pek çok durumda (örneğin, kütük dosyaları), deterministik bir bölüm anahtarı belirtilmemişse, çok büyük bir hadoop işinin başlaması, sadece verilen bölüm anahtarıyla değil, tüm tabloyu tarar. Bu sizin için önemli ise

, sen ek bir seçenek

$ hive -hiveconf date_yesterday=20150331 

ile Ve komut dosyası veya değişkenin adı önemli değil kovanı terminali kullanım

select * from table1 
where dt >= ${hiveconf:date_yesterday}; 

yılında kovanı başlatabilir Değeri ne de unix komutlarını kullanarak önceki tarihi elde etmek için bu durumda ayarlayabilirsiniz. DATE_SUB formatında yyyy-MM-dd tarih varsayar gibi OP

$ hive -hiveconf date_yesterday=$(date --date yesterday "+%Y%m%d") 
1

:

SQLSunucusu
select DATE_FORMAT(curdate()-1,'%Y%m%d'); 

:

SELECT convert(varchar,getDate()-1,112) 

kullanın bu sorgu:

SELECT FROM_UNIXTIME(UNIX_TIMESTAMP()-1*24*60*60,'%Y%m%d'); 
+0

Kovanda, kovanda aynı şeyi yapmak için açıkça sözü edilen soru nedir? – ferhan

+0

Cevabım düzeltildi.sorguyu dene. –

+2

Bu çalışmıyor. Ben sadece denedim ve geri bir şey alamıyorum, – ferhan

1

spesifik durumda görünüyor. Bu yüzden formatınıza ulaşmak için daha fazla format manipülasyonu yapmanız gerekebilir. Bu deneyin:

select * from table1 
where dt = FROM_UNIXTIME(
       UNIX_TIMESTAMP(
        DATE_SUB(
         FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd') 
        , 1) 
       ) 
      , 'yyyyMMdd')  limit 10; 
+0

'FROM_UNIXTIME (UNIX_TIMESTAMP(), 'yyyy-MM-dd')' 'current_date' ile değiştirilebilir –

0

bunu kullanın:

select * from table1 where dt = date_format(concat(year(date_sub(current_timestamp,1)),'-', month(date_sub(current_timestamp,1)), '-', day(date_sub(current_timestamp,1))), 'yyyyMMdd') limit 10; 

Bu

senin bölümünün bir deterministik sonucu (bir dize) verecektir.

Biliyorum bu süper ayrıntılı.