복붙노트

[HADOOP] 쉘 스크립트를 사용하여 HiveQL 쿼리의 결과를 CSV로 출력하려면 어떻게합니까?

HADOOP

쉘 스크립트를 사용하여 HiveQL 쿼리의 결과를 CSV로 출력하려면 어떻게합니까?

가급적 순차적으로보다는 병렬로 여러 개의 하이브 쿼리를 실행하고 각 쿼리의 출력을 CSV 파일에 저장하고 싶습니다. 예를 들어, csv1에서 query1을 출력하고, csv2에서 query2를 출력합니다. 다음 영업일 동안 분석 할 출력을 갖는 작업을 끝낸 후에 이러한 쿼리를 실행합니다. 나는 bash 쉘 스크립트를 사용하는데 관심이있다. 그 이유는 cron 태스크를 설정하여 특정 시간대에 실행할 수 있기 때문이다.

HiveQL 쿼리의 결과를 한 번에 하나의 쿼리로 CSV 파일에 저장하는 방법을 알고 있습니다. 나는 다음과 같은 것으로 그렇게한다.

hive -e 
"SELECT * FROM db.table;" 
" | tr "\t" "," > example.csv;

위의 문제는 프로세스가 완료되고 수동으로 다음 쿼리를 시작할 때를 모니터링해야한다는 것입니다. 여러 개의 쿼리를 순서대로 실행하는 방법도 알고 있습니다.

hive -f hivequeries.hql

이 두 가지 방법을 결합 할 수있는 방법이 있습니까? 내 목표를 달성하는 더 똑똑한 방법이 있습니까?

처음부터 코드를 작성하기에 충분히 배쉬를 알지 못하기 때문에 코드 응답이 선호됩니다.

이 질문은 또 다른 질문의 변형입니다 : HiveQL 쿼리의 결과를 CSV로 어떻게 출력합니까?

해결법

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

    1.쉘 스크립트에서 병렬 작업을 실행하고 모니터 할 수 있습니다.

    쉘 스크립트에서 병렬 작업을 실행하고 모니터 할 수 있습니다.

    #!/bin/bash
    
    #Run parallel processes and wait for their completion
    
    #Add loop here or add more calls
    hive -e "SELECT * FROM db.table1;" | tr "\t" "," > example1.csv &
    hive -e "SELECT * FROM db.table2;" | tr "\t" "," > example2.csv &
    hive -e "SELECT * FROM db.table3;" | tr "\t" "," > example3.csv &
    
    #Note the ampersand in above commands says to create parallel process
    #You can wrap hive call in a function an do some logging in it, etc
    #And call a function as parallel process in the same way
    #Modify this script to fit your needs
    
    #Now wait for all processes to complete
    
    #Failed processes count
    FAILED=0
    
    for job in `jobs -p`
    do
       echo "job=$job"
       wait $job || let "FAILED+=1"
    done   
    
    #Final status check
    if [ "$FAILED" != "0" ]; then
        echo "Execution FAILED!  ($FAILED)"
        #Do something here, log or send messege, etc
        exit 1
    fi
    
    #Normal exit
    #Do something else here
    exit 0
    

    XARGS, GNU 병렬을 사용하는 다른 방법으로 쉘에서 병렬 프로세스를 실행하고 많은 리소스를 사용할 수 있습니다. https://www.slashroot.in/how-run-multiple-commands-parallel-linux 및 https://thoughtsimproved.wordpress.com/2015/05/18/parellel-processing-in-bash/도 참조하십시오.

  2. ==============================

    2.GNU Parallel에서는 다음과 같이 보입니다 :

    GNU Parallel에서는 다음과 같이 보입니다 :

    doit() {
      id="$1"
      hive -e "SELECT * FROM db.table$id;" | tr "\t" "," > example"$id".csv
    }
    export -f doit
    parallel --bar doit ::: 1 2 3 4
    

    검색어가 동일한 템플릿을 공유하지 않으면 다음을 수행 할 수 있습니다.

    queries.txt:
    SELECT * FROM db.table1;
    SELECT id,name FROM db.person;
    ... other queries ...
    
    cat queries.txt | parallel --bar 'hive -e {} | tr "\t" "," > example{#}.csv'
    

    기본 사항을 배우려면 https://doi.org/10.5281/zenodo.1146014의 1 장 + 2 장을 읽은 후 15 분을, 병렬로 더 많은 작업을 실행하는 방법에 대해서는 7 장을 읽으십시오.

  3. from https://stackoverflow.com/questions/53755508/how-do-i-output-the-results-of-a-hiveql-query-to-csv-using-a-shell-script by cc-by-sa and MIT license