복붙노트

[HADOOP] 하이브에서 sysdate -1 가져 오기

HADOOP

하이브에서 sysdate -1 가져 오기

어제 날짜가 항상 Hive를 의미하는 현재 날짜 -1을 얻는 방법이 있습니까? 그리고이 형식으로 20120805?

나는 어제 날짜에 대한 데이터를 얻기 위해 오늘과 같이 내 쿼리를 실행할 수있다. 8 월 6 일 -

select * from table1 where dt = '20120805';

그러나 date_sub 함수를 사용하여이 방법을 사용하여 어제의 날짜를 얻으려고하면 아래 테이블이 날짜 (dt) 열에 분할됩니다.

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

모든 파티션의 데이터를 찾고 있습니까? 왜? 검색어에 문제가 있습니까?

전체 테이블을 스캔하지 않도록 하위 쿼리에서 평가를 수행하려면 어떻게해야합니까?

해결법

  1. ==============================

    1.다음과 같이 시도해보십시오.

    다음과 같이 시도해보십시오.

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

    하이브가 전체 테이블을 스캔하지 않는다면이 방법이 효과적입니다. from_unixtime은 결정적이지 않으므로 하이브의 쿼리 플래너가 최적화되지 않습니다. 많은 경우 (예 : 로그 파일) 결정적 파티션 키를 지정하지 않으면 주어진 파티션 키가있는 행뿐만 아니라 전체 테이블을 스캔하므로 매우 큰 hadoop 작업이 시작될 수 있습니다.

    이것이 당신에게 중요하다면, 추가 옵션으로 하이브를 시작할 수 있습니다

    $ hive -hiveconf date_yesterday=20150331
    

    그리고 스크립트 또는 하이브 터미널에서

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

    변수의 이름은 중요하지 않으며 값도 중요하지 않습니다.이 경우 유닉스 명령을 사용하여 이전 날짜를 얻도록 설정할 수 있습니다. OP의 특정 경우

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

    2.MySQL에서 :

    MySQL에서 :

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

    sqlserver에서 :

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

    이 쿼리를 사용하십시오.

    SELECT FROM_UNIXTIME(UNIX_TIMESTAMP()-1*24*60*60,'%Y%m%d');
    
  3. ==============================

    3.DATE_SUB은 yyyy-MM-dd 형식의 날짜로 간주됩니다. 따라서 형식에 도달하기 위해 더 많은 형식 조작을 수행해야 할 수도 있습니다. 이 시도:

    DATE_SUB은 yyyy-MM-dd 형식의 날짜로 간주됩니다. 따라서 형식에 도달하기 위해 더 많은 형식 조작을 수행해야 할 수도 있습니다. 이 시도:

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

    4.이것을 사용하십시오 :

    이것을 사용하십시오 :

    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;
    

    그러면 파티션의 결정적인 결과 (문자열)가 제공됩니다.

    나는 그것이 매우 상세하다는 것을 안다.

  5. from https://stackoverflow.com/questions/11833701/get-the-sysdate-1-in-hive by cc-by-sa and MIT license