2011-08-15 2 views
1

현재 Hive를 사용하여 보고서를 생성하는 HDFS 클러스터에 대한 데이터가 있습니다. 인프라가 폐업되는 과정에서 우리는 데이터에 대한 보고서를 생성하는 대신에 탭으로 구분 된 파일을 새 환경으로 가져 오는 대안을 생각해 내야합니다.SQL 쿼리를 unix sort, uniq 및 awk로 바꾸기

테이블에는 다음 필드가 있습니다. 우리가 하이브에서 실행하는 데 사용

  • 쿼리
  • 하여 IPAddress
  • LocationCode

우리의 원래 SQL 쿼리이었다 (물론 정확히 ..하지만 비슷한)

select 
COUNT(DISTINCT Query, IPAddress) as c1, 
LocationCode as c2, 
Query as c3 
from table 
group by Query, LocationCode 

I sort, uniq 및 awk와 같은 표준 유닉스/리눅스 도구를 사용하여 가장 효율적인 스크립트를 제공 할 수 있는지 궁금합니다. 위의 쿼리를 대신 할 수 있습니다.

스크립트 입력이 텍스트 파일의 디렉토리라고 가정합니다. dir은 약 2000 개의 파일을 포함합니다. 각 파일 형식의 탭으로 구분 된 기록의 임의의 숫자를 포함합니다 :

Query <TAB> LocationCode <TAB> IPAddress <NEWLINE> 
+0

파일 당 대략 몇 줄입니까? –

+0

@ 수천 명의 부부 .. 다를 수 있습니다. 가장 큰 파일 크기는 약 2MB로 450KB 정도입니다. –

+0

집계하는 필드 중 하나를 기준으로 그룹화 할 때 원본 쿼리가 이상하게 보입니다. 즉, 고유 한 개수는 'count (distinct IPAddress)'일 수 있습니다. 이 쿼리가 있어야합니까? –

답변

1

당신은 포함 정렬 된 파일이 있으면 모든 고유

Query <TAB> LocationCode <TAB> IPAddress <NEWLINE> 

당신은 할 수 :

awk -F '\t' 'NR == 1 {q=$1; l=$2; count=0} 
q == $1 && l == $2{count++} 
q != $1 || l != $2{printf "%s\t%s\t%d\n", q, l, count; q=$1; l=$2; count=1} 
END{printf "%s\t%s\t%d\n", q, l, count}' sorted_uniq_file 

을 얻으려면 이 sorted_uniq_file 순진한 방법이 될 수 있습니다 :

sort -u dir/* > sorted_uniq_file 

그러나 이것은 매우 길고 메모리를 많이 소비 할 수 있습니다.

더 빠른 옵션 (메모리 소비가 적음)은 가능한 한 빨리 중복을 제거하고, 먼저 정렬하고 나중에 병합 할 수 있습니다. 이것은, 정렬 된 파일의 임시 공간을 필요는 sorted라는 이름의 디렉토리를 사용하자 : 제한 종류의 솔루션은 위의 몇 가지 쉘에 충돌하는 경우

mkdir sorted; 
for f in dir/*; do 
    sort -u $f > sorted/$f 
done 
sort -mu sorted/* > sorted_uniq_file 
rm -rf sorted 

또는 (dir/*의 확장을, 또는 sorted/*의, 또는 sort의 매개 변수의 수) :

mkdir sorted; 
ls dir | while read f; do 
    sort -u dir/$f > sorted/$f 
done 
while [ `ls sorted | wc -l` -gt 1 ]; do 
    mkdir sorted_tmp 
    ls sorted | while read f1; do 
    if read f2; then 
     sort -mu sorted/$f1 sorted/$f2 > sorted_tmp/$f1 
    else 
     mv sorted/$f1 sorted_tmp 
    fi 
    done 
    rm -rf sorted 
    mv sorted_tmp sorted 
done 
mv sorted/* sorted_uniq_file 
rm -rf sorted 

위의 솔루션은 두 개 이상의 파일을 동시에 병합하도록 최적화 할 수 있습니다. 당신이 다른 방법으로 조회 할 플랫 파일 데이터의 무리가있는 경우

1

아닌 원래의 질문에 직접 대답 (당신이 이미 가지고있는),하지만 당신은 NoSQL 사용을 고려할 수 :

http://www.strozzi.it/cgi-bin/CSA/tw7/I/en_US/nosql/Home%20Page

이 NoSQL 프로젝트는 최근에 "NoSQL 데이터베이스"라고 불리는 것과는 완전히 다른 동물입니다. 대신,이 NoSQL은 Awk를 중심으로 Unix 도구를 묶어 형식이 지정된 텍스트 파일의 데이터베이스에 액세스하고 유지 관리하는 데 사용을 단순화합니다.테이블 조인과 같이 매끄러운 작업을 쉽게 수행 할 수 있습니다.