복붙노트

[HADOOP] HiveQL 쿼리의 결과를 CSV로 어떻게 출력합니까?

HADOOP

HiveQL 쿼리의 결과를 CSV로 어떻게 출력합니까?

우리는 하이브 쿼리의 결과를 CSV 파일에 저장하려고합니다. 명령이 이렇게 보일 것이라고 생각했습니다.

insert overwrite directory '/home/output.csv' select books from table;

내가 그것을 실행할 때 성공적으로 완료되었다고하지만 파일을 찾을 수는 없다고합니다. 이 파일을 찾으려면 어떻게해야합니까? 아니면 다른 방식으로 데이터를 추출해야합니까?

감사!

해결법

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

    1.Hive에서 데이터를 가져 오기 위해 INSERT OVERWRITE를 사용할 수도 있지만 특정 경우에 가장 적합한 방법은 아닙니다. 먼저 INSERT OVERWRITE가하는 일을 설명하고 Hive 테이블에서 tsv 파일을 가져 오는 데 사용하는 방법을 설명합니다.

    Hive에서 데이터를 가져 오기 위해 INSERT OVERWRITE를 사용할 수도 있지만 특정 경우에 가장 적합한 방법은 아닙니다. 먼저 INSERT OVERWRITE가하는 일을 설명하고 Hive 테이블에서 tsv 파일을 가져 오는 데 사용하는 방법을 설명합니다.

    설명서에 따르면 쿼리는 HDFS의 디렉토리에 데이터를 저장합니다. 형식은 CSV가 아닙니다.

    약간의 수정 (LOCAL 키워드 추가)은 데이터를 로컬 디렉토리에 저장합니다.

    INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' select books from table;
    

    비슷한 쿼리를 실행하면 결과는 다음과 같습니다.

    [lvermeer@hadoop temp]$ ll
    total 4
    -rwxr-xr-x 1 lvermeer users 811 Aug  9 09:21 000000_0
    [lvermeer@hadoop temp]$ head 000000_0 
    "row1""col1"1234"col3"1234FALSE
    "row2""col1"5678"col3"5678TRUE
    

    개인적으로, 나는 보통 이런 종류의 명령 행에서 Hive를 통해 내 쿼리를 직접 실행하고 다음과 같이 로컬 파일에 파이프한다.

    hive -e 'select books from table' > /home/lvermeer/temp.tsv
    

    그러면 탭으로 구분 된 파일을 사용할 수 있습니다. 그게 너에게 도움이되기를 희망한다.

    이 패치 -3682를 기반으로, Hive 0.11을 사용할 때 더 나은 솔루션을 사용할 수 있다고 의심하지만 직접 테스트 할 수는 없습니다. 새로운 구문은 다음을 허용해야합니다.

    INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' 
    ROW FORMAT DELIMITED 
    FIELDS TERMINATED BY ',' 
    select books from table;
    

    희망이 도움이됩니다.

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

    2.CSV 파일을 원할 경우 다음과 같이 Lukas의 솔루션을 수정할 수 있습니다 (Linux 상자에 있다고 가정).

    CSV 파일을 원할 경우 다음과 같이 Lukas의 솔루션을 수정할 수 있습니다 (Linux 상자에 있다고 가정).

    hive -e 'select books from table' | sed 's/[[:space:]]\+/,/g' > /home/lvermeer/temp.csv
    
  3. ==============================

    3.CREATE TABLE AS SELECT (CTAS) 문을 사용하여 HDFS에 쿼리 결과가 포함 된 파일로 디렉터리를 생성해야합니다. 그런 다음 HDFS에서 일반 디스크로 파일을 내보내고 단일 파일로 병합해야합니다.

    CREATE TABLE AS SELECT (CTAS) 문을 사용하여 HDFS에 쿼리 결과가 포함 된 파일로 디렉터리를 생성해야합니다. 그런 다음 HDFS에서 일반 디스크로 파일을 내보내고 단일 파일로 병합해야합니다.

    또한 '\ 001'(CSV로 구분)에서 파일을 변환 할 때 약간의 속임수를 써야 할 수도 있습니다. 사용자 정의 CSV SerDe를 사용하거나 추출 된 파일을 사후 처리 할 수 ​​있습니다.

  4. ==============================

    4.HUE를 사용한다면이 방법도 상당히 간단합니다. HUE의 Hive 편집기로 이동하여 하이브 쿼리를 실행 한 다음 결과 파일을 XLS 또는 CSV로 로컬로 저장하거나 결과 파일을 HDFS에 저장할 수 있습니다.

    HUE를 사용한다면이 방법도 상당히 간단합니다. HUE의 Hive 편집기로 이동하여 하이브 쿼리를 실행 한 다음 결과 파일을 XLS 또는 CSV로 로컬로 저장하거나 결과 파일을 HDFS에 저장할 수 있습니다.

  5. ==============================

    5.나는 비슷한 해결책을 찾고 있었지만 여기에 언급 된 것들은 효과가 없을 것이다. 내 데이터에는 공백 (공백 문자, 줄 바꿈, 탭) 문자 및 쉼표의 모든 변형이있었습니다.

    나는 비슷한 해결책을 찾고 있었지만 여기에 언급 된 것들은 효과가 없을 것이다. 내 데이터에는 공백 (공백 문자, 줄 바꿈, 탭) 문자 및 쉼표의 모든 변형이있었습니다.

    열 데이터 tsv를 안전하게 만들려면 다음과 같이 열 데이터의 모든 \ t 문자를 공백으로 바꾼 다음 명령 줄에서 python 코드를 실행하여 csv 파일을 생성합니다.

    hive -e 'tab_replaced_hql_query' |  python -c 'exec("import sys;import csv;reader = csv.reader(sys.stdin, dialect=csv.excel_tab);writer = csv.writer(sys.stdout, dialect=csv.excel)\nfor row in reader: writer.writerow(row)")'
    

    이것은 완벽하게 유효한 csv를 만들었습니다. 희망은이 솔루션을 찾고있는 사람들을 도울 수 있기를 바랍니다.

  6. ==============================

    6.하이브 문자열 함수 CONCAT_WS (문자열 구분 기호, 문자열 str1, 문자열 str2 ... strn)를 사용할 수 있습니다.

    하이브 문자열 함수 CONCAT_WS (문자열 구분 기호, 문자열 str1, 문자열 str2 ... strn)를 사용할 수 있습니다.

    예 :

    hive -e 'select CONCAT_WS(',',cola,colb,colc...,coln) from Mytable' > /home/user/Mycsv.csv
    
  7. ==============================

    7.이 예제에서와 같이 INSERT ... DIRECTORY ...를 사용할 수 있습니다.

    이 예제에서와 같이 INSERT ... DIRECTORY ...를 사용할 수 있습니다.

    INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees'
    SELECT name, salary, address
    FROM employees
    WHERE se.state = 'CA';
    

    OVERWRITE 및 LOCAL은 이전과 동일한 해석을하고 경로는 일반적인 규칙에 따라 해석됩니다. 호출 된 reduders의 수에 따라 하나 이상의 파일이 / tmp / ca_employees에 기록됩니다.

  8. ==============================

    8.나는 비슷한 문제를 겪었고 이것이 내가 어떻게 대처할 수 있었는지를 보여준다.

    나는 비슷한 문제를 겪었고 이것이 내가 어떻게 대처할 수 있었는지를 보여준다.

    1 단계 - 다음과 같이 Hive 테이블의 데이터를 다른 테이블에로드합니다.

    DROP TABLE IF EXISTS TestHiveTableCSV;
    CREATE TABLE TestHiveTableCSV 
    ROW FORMAT DELIMITED 
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n' AS
    SELECT Column List FROM TestHiveTable;
    

    2 단계 - Hive 창고의 블롭을 적절한 위치로 새 위치로 복사합니다.

    Start-AzureStorageBlobCopy
    -DestContext $destContext 
    -SrcContainer "Source Container"
    -SrcBlob "hive/warehouse/TestHiveTableCSV/000000_0"
    -DestContainer "Destination Container"
    -DestBlob "CSV/TestHiveTable.csv"
    
  9. ==============================

    9.기본 구분 기호는 "^ A"입니다. 파이썬 언어에서는 "\ x01"입니다.

    기본 구분 기호는 "^ A"입니다. 파이썬 언어에서는 "\ x01"입니다.

    구분 기호를 변경하려면 다음과 같이 SQL을 사용합니다.

    SELECT col1, delimiter, col2, delimiter, col3, ..., FROM table
    

    그런 다음 구분 기호 + "^ A"를 새로운 구분 기호로 간주하십시오.

  10. ==============================

    10.위의 Ray의 답변과 마찬가지로 Hortonworks 데이터 플랫폼의 Hive View 2.0을 사용하면 Hive 쿼리를 실행 한 다음 출력을 csv로 저장할 수도 있습니다.

    위의 Ray의 답변과 마찬가지로 Hortonworks 데이터 플랫폼의 Hive View 2.0을 사용하면 Hive 쿼리를 실행 한 다음 출력을 csv로 저장할 수도 있습니다.

  11. ==============================

    11.Windows에서이 작업을 수행하는 경우 Python 스크립트 hivehoney를 사용하여 테이블 데이터를 로컬 CSV 파일로 추출 할 수 있습니다.

    Windows에서이 작업을 수행하는 경우 Python 스크립트 hivehoney를 사용하여 테이블 데이터를 로컬 CSV 파일로 추출 할 수 있습니다.

    그것은 할 것이다 :

    다음과 같이 실행하십시오 :

    set PROXY_HOST=your_bastion_host
    
    set SERVICE_USER=you_func_user
    
    set LINUX_USER=your_SOID
    
    set LINUX_PWD=your_pwd
    
    python hh.py --query_file=query.sql
    
  12. ==============================

    12.다양한 옵션을 시도했지만, 이것은 Python Pandas를위한 가장 간단한 솔루션 중 하나입니다.

    다양한 옵션을 시도했지만, 이것은 Python Pandas를위한 가장 간단한 솔루션 중 하나입니다.

    hive -e 'select books from table' | grep "|" ' > temp.csv
    
    df=pd.read_csv("temp.csv",sep='|')
    

    tr "|" ","변환 "|" ~ ","

  13. ==============================

    13.쿼리를 시작한 후 다음 단계를 더 포함하면됩니다. 덮어 쓰기 로컬 디렉토리 '/ home / lvermeer / temp' 행 형식이 제한됨 ','에 의해 종료 된 필드 테이블에서 책을 선택하십시오;

    쿼리를 시작한 후 다음 단계를 더 포함하면됩니다. 덮어 쓰기 로컬 디렉토리 '/ home / lvermeer / temp' 행 형식이 제한됨 ','에 의해 종료 된 필드 테이블에서 책을 선택하십시오;

    내 경우, 임시 폴더 아래에 생성 된 데이터가 deflate 형식으로, 다음과 같이 보입니다.

    $ ls
    000000_0.deflate  
    000001_0.deflate  
    000002_0.deflate  
    000003_0.deflate  
    000004_0.deflate  
    000005_0.deflate  
    000006_0.deflate  
    000007_0.deflate
    

    수축 된 파일의 압축을 풀고 모든 것을 하나의 CSV 파일에 저장하는 명령은 다음과 같습니다.

    hadoop fs -text "file:///home/lvermeer/temp/*" > /home/lvermeer/result.csv
    
  14. ==============================

    14.

    hive  --outputformat=csv2 -e "select * from yourtable" > my_file.csv
    

    또는

    hive  --outputformat=csv2 -e "select * from yourtable" > [your_path]/file_name.csv
    

    tsv의 경우 위의 쿼리에서 csv를 tsv로 변경하고 쿼리를 실행하십시오.

  15. ==============================

    15.나는 이것에 늦을 지 모르지만 그 답을 도울 것입니다 :

    나는 이것에 늦을 지 모르지만 그 답을 도울 것입니다 :

    에코 "COL_NAME1 | COL_NAME2 | COL_NAME3 | COL_NAME4"> SAMPLE_Data.csv 하이브 -e ' distinct concat (COL_1, "|", COL_2, "|", COL_3, "|", COL_4) from table_Name where 절 필요하다면 ' >> SAMPLE_Data.csv

  16. ==============================

    16.이 셸 명령은 열 머리글없이 csv의 출력 형식을 output.txt로 인쇄합니다.

    이 셸 명령은 열 머리글없이 csv의 출력 형식을 output.txt로 인쇄합니다.

    $ hive --outputformat=csv2 -f 'hivedatascript.hql' --hiveconf hive.cli.print.header=false > output.txt
    
  17. from https://stackoverflow.com/questions/18129581/how-do-i-output-the-results-of-a-hiveql-query-to-csv by cc-by-sa and MIT license