2014-09-26 3 views
2

yyyyMMdd 형식으로 날짜별로 파티셔닝 된 테이블이 있습니다. 다음과 같은 간단한 쿼리를 수행하는 경우 :Hadoop Hive 쿼리 최적화

SELECT COUNT(*) FROM MyTable WHERE Date >= '20140924' 

그러면 3 일 동안 데이터를 검색합니다 (오늘은 26 일). 그러나 나는 항상 지난 3 개월보고 내 쿼리를하고 싶은, 그래서 문제는 이제 모든 파티션을 검사한다는 것입니다 나는이

SELECT COUNT(*) FROM MyTable 
WHERE date >= from_unixtime(unix_timestamp() - 259200, 'yyyyMMdd') 

처럼 물품. 그것보다 큰 후에 쿼리의 일부를 미리 계산할 수있는 방법이 있습니까?

답변

1

불행히도 Hive는이를 지원하지 않습니다. 저는 과거에 비슷한 문제에 직면 해 있었고 하이브 테이블은 지난 2 년간 파티션을 가지고있었습니다.

그러나 해결 방법 중 하나는 다른 변수에서이 날짜를 계산하고 하이브 쿼리의 변수로 사용하는 셸 스크립트에서이 하이브 쿼리를 실행할 수 있다는 것입니다. 예제 스크립트는 다음과 같습니다.

#!/bin/bash 

date=`date +"%Y%m%d" -d "-3 days"` 
hive -e "select count(*) from MyTable where date >= '$date'" 
+0

이것이 이상적이지는 않지만 아마도 가장 좋은 해결책 일 것입니다. 일반적으로 과거에 SQL을 작성했을 때이 같은 것들이하기 쉬운 다른 언어에서 항상 호출되었습니다. 하이브와 다를 이유가 없습니다. – MikeKulls

+0

또한 Hive 자체에서 조인 등을 사용하여 여러 가지 작업을 시도했지만 실제로는 아무 것도 해결하지 못했습니다 ... 그래서 셸을 사용할 수있는 모든 곳에서 쿼리를 실행하는 데 사용하려고 시도합니다 – Amar

0

한 가지 해결 방법은 계산 된 시간을 선택할 수있는 단일 행이있는 테이블을 만드는 것입니다.

CREATE TABLE dual (dummy STRING); 
INSERT INTO TABLE dual SELECT count(*) FROM dual; 

SELECT COUNT(*) FROM MyTable t1 
JOIN (
    SELECT from_unixtime(unix_timestamp() - 259200, 'yyyyMMdd') myDate 
    FROM dual LIMIT 1 
) t2 ON (t2.myDate = t1.Date) 
+0

시도했지만 그것은 여전히 ​​모든 파티션을 스캔하는 것으로 보입니다. 어쩌면 그것은 버전일까요? @ 하이킹을 사용하고 있습니다. 흥미로운 @MikeKulls 0.12 – MikeKulls

+0

재미있는 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 서브 테이블에서 날짜를 옮기면 모든 파티션을 검사 할 수 있는지 확인할 수 있습니까 예'SELECT COUNT (*) from MyTable WHERE date> = (from_unixtime (unix_timestamp 259200, 'yyyyMMdd') 이중 한계에서 1)' – FuzzyTree

+0

전혀 작동하지 않습니다. 나는'SELECT '근처에서 입력을 인식 할 수 없다. 나는 다양한 하위 쿼리를 시도해 보았습니다. 'SELECT'와 같이 간단합니다. 20140926 'AS DT FROM dual' – MikeKulls