HiveQL 쿼리 결과를 CSV로 출력하려면 어떻게해야합니까?


81

Hive 쿼리 결과를 CSV 파일에 저장하려고합니다. 명령이 다음과 같아야한다고 생각했습니다.

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

실행하면 성공적으로 완료되었다고 표시되지만 파일을 찾을 수 없습니다. 이 파일을 어떻게 찾습니까? 아니면 다른 방법으로 데이터를 추출해야합니까?

답변:


146

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

매뉴얼 에 따르면 쿼리는 HDFS의 디렉토리에 데이터를 저장합니다. 형식은 csv가 아닙니다.

파일 시스템에 기록 된 데이터는 ^ A로 구분 된 열과 줄 바꿈으로 구분 된 행이있는 텍스트로 직렬화됩니다. 기본 유형이 아닌 열이 있으면 해당 열이 JSON 형식으로 직렬화됩니다.

약간의 수정 ( 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
당신은 그것을 다른 접근 방식은 우리에게 잠재적으로 우리가 나중에 병합해야 디렉토리를 제공합니다 당신이 하나 개의 파일을 얻을 것이다 보장 배관, 또한 문제가 될 수있는 볼륨을 근사, 덮어 쓰기 로컬 및 배관 삽입 사이의 성능 차이를 알고있다
fd8s0

HDFS의 데이터를 시퀀스 파일 형식으로 내보낼 수 있습니까?
Nageswaran

1
나는 해결책 (패치 -3682)을 시도했고 어떤 이유로 출력 파일에 헤더가 포함되지 않았다는 점을 제외하고는 잘 작동했습니다. hive.cli.print.header = true로 설정했습니다. 내 .hiverc. 대신 헤더가 터미널에 인쇄되는 것이 가치가 있습니다 (분명히 원하는 것이 아닙니다).
Peter Cogan

@ lukas-vermeer, "INSERT OVERWRITE"메서드를 사용하여 테이블을 만들면 헤더 정보가 손실됩니다. 헤더 정보를 얻는 방법이 있습니까?
ML_Passion

안녕하세요 Lukas, 어떻게 쉘이 hadoop 파일 시스템에서 작동하도록 만들었습니까?
notilas

23

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

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

4
감사합니다. 나는 변형을 사용하고 있지만 매우 잘 작동합니다. 이것은 일부 사람들이 CSV로 생각하는 것과는 달리 쉼표로 구분 된 출력을 출력합니다. CSV는 일반적으로 데이터를 쉼표로 처리하기위한 일부 형식을 갖습니다 (예 : 큰 따옴표로 데이터를 감싸고 큰 따옴표가있는 데이터의 경우 큰 따옴표로 묶음). "--hiveconf hive.cli.print.header = True"매개 변수를 추가하면 출력에 헤더도 표시된다는 점을 언급 할 가치가 있습니다.
jatal

이것이 가장 깨끗한 솔루션입니다
Dutta

1
이것은 예를 들어 날짜와 시간 사이에 공백이있는 날짜 시간 문자열로 인해 실패했습니다.
williaster

@williaster sed 's / \ t \ + /, / g'이 문제에 도움이 될 것입니다.
Sudhakar Chavan

tsv에 쉼표가 포함 된 텍스트가있는 경우 작동하지 않습니다. (인용 부호로 둘러싸이지 않은 무고한 문자열 쉼표 구분자로 처리되기 때문에)
yahiaelgamal

4

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

또한 '\ 001'에서 CSV로 구분 된 파일을 변환하려면 몇 가지 트릭을 수행해야 할 수도 있습니다. 사용자 지정 CSV SerDe를 사용하거나 추출 된 파일을 후 처리 할 수 ​​있습니다.


이 접근 방식은 후속 oozie 파이프 라인 단계에서 출력을 사용하려는 경우 가장 좋습니다.
cerd

4

당신은 사용할 수 있습니다 INSERT... DIRECTORY이 예에서와 같이 ... :

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

OVERWRITE그리고 LOCAL이전과 같은 해석을 가지고 경로는 일반적인 규칙에 따라 해석됩니다. /tmp/ca_employees호출 된 감속기의 수에 따라 하나 이상의 파일이에 작성 됩니다.


3

HUE를 사용하는 경우 이것은 매우 간단합니다. HUE의 Hive 편집기로 이동하여 하이브 쿼리를 실행 한 다음 결과 파일을 로컬에 XLS 또는 CSV로 저장하거나 결과 파일을 HDFS에 저장할 수 있습니다.


3

비슷한 솔루션을 찾고 있었지만 여기에 언급 된 솔루션은 작동하지 않습니다. 내 데이터에는 공백 (공백, 줄 바꿈, 탭) 문자 및 쉼표의 모든 변형이 있습니다.

열 데이터 tsv를 안전하게 만들기 위해 다음과 같이 열 데이터의 모든 \ t 문자를 공백으로 바꾸고 명령 줄에서 파이썬 코드를 실행하여 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를 만들었습니다. 이것이이 솔루션을 찾는 사람들에게 도움이되기를 바랍니다.


1
2016 년인데도이 작업을 수행하려면 여전히 농구를해야합니까? 나는 shravster의 솔루션이 지금까지 가장 훌륭하고 우아한 솔루션이라는 것을 알았습니다.
Josh

열 데이터의 모든 \ t 문자를 어떻게 바 꾸었습니까? 쿼리에서 해결했거나 별도의보기를 만들었습니까?
Naresh S

@NareshS, 늦은 응답에 대해 죄송합니다. 또는 그 라인을 따라 뭔가 : <탭> 예, 열이 공백으로하거나 필수적인 경우 탭을 대체하기 위해 하이브으로 처리했다, 당신은 같은 대용품으로 대체 할 수
sisanared

@sisanared, 응답 해 주셔서 감사합니다. 모든 문자열 열에 대해 정규식 바꾸기를 사용해야하며 100보다 많은 열이있는 테이블이있는 경우 이것은 번거로울 것입니다. 이러한 경우에 대한 빠른 해결책이 있습니까
Naresh S

@NareshS, 불행히도 유일한 다른 해결책은 데이터를 파티션에 넣기 전에 정리하는 것입니다. 그렇지 않으면 탭 문자를 포함 할 수있는 모든 문자열 열에 대해 선택을 수행하는 동안 수행해야합니다
sisanared

3

하이브 문자열 기능을 사용할 수 있습니다. CONCAT_WS( string delimiter, string str1, string str2...strn )

예 :

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

3

이것은 HiveQL의 결과를 출력하는 데 가장 친숙한 CSV 방식입니다.
데이터 형식을 지정하기 위해 grep 또는 sed 명령이 필요하지 않습니다. 대신 hive가이를 지원하고 outputformat의 추가 태그를 추가하기 만하면됩니다.

hive --outputformat=csv2 -e 'select * from <table_name> limit 20' > /path/toStore/data/results.csv

2

나는 비슷한 문제가 있었고 이것이 내가 그것을 해결할 수 있었던 방법입니다.

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웨어 하우스에서 새 위치로 Blob을 복사했습니다.

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

2
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로 변경하고 쿼리를 실행하십시오.


1

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

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

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

그런 다음 delimiter + " ^A"를 새 구분 기호로 간주합니다.


1

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

hive -e 'select books from table' | grep "|" ' > temp.csv

df=pd.read_csv("temp.csv",sep='|')

tr "|" ",""|"를 변환 하는 데 사용할 수도 있습니다. ","


0

위의 Ray의 답변과 유사하게 Hortonworks Data Platform의 Hive View 2.0을 사용하면 Hive 쿼리를 실행 한 다음 출력을 csv로 저장할 수도 있습니다.


0

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

그것은 :

  1. 배스 천 호스트에 로그인합니다.
  2. pbrun.
  3. kinit.
  4. beeline (검색어 포함).
  5. beeline의 에코를 Windows의 파일에 저장합니다.

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

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

0

쿼리를 시작한 후 다음 단계를 더 다룹니다. INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' select books from table;

제 경우에는 임시 폴더 아래에 생성 된 데이터가 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

다음은 deflate 파일의 압축을 풀고 모든 것을 하나의 csv 파일에 넣는 명령입니다.

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

0

나는 이것에 늦을 수도 있지만 대답을 도울 것입니다.

echo "COL_NAME1 | COL_NAME2 | COL_NAME3 | COL_NAME4"> SAMPLE_Data.csv hive -e 'select distinct concat (COL_1, "|", COL_2, "|", COL_3, "|", COL_4) from table_Name where clause if required;' >> SAMPLE_Data.csv


0

이 쉘 명령 output.txt은 열 헤더없이 csv로 출력 형식을 인쇄합니다 .

$ hive --outputformat=csv2 -f 'hivedatascript.hql' --hiveconf hive.cli.print.header=false > output.txt

0

다음 명령을 사용하십시오.

hive -e "[database_name] 사용; [table_name] LIMIT 10에서 * 선택;" > /path/to/file/my_file_name.csv

나는 공격 유형과 각 유형의 수를 구성하고 결정하려는 세부 정보를 가진 거대한 데이터 세트 를 가지고있었습니다 . 실습에서 사용했던 (좀 더 자세한 내용이 포함 된) 예제는 다음과 같습니다.

hive -e "use DataAnalysis;
select attack_cat, 
case when attack_cat == 'Backdoor' then 'Backdoors' 
when length(attack_cat) == 0 then 'Normal' 
when attack_cat == 'Backdoors' then 'Backdoors' 
when attack_cat == 'Fuzzers' then 'Fuzzers' 
when attack_cat == 'Generic' then 'Generic' 
when attack_cat == 'Reconnaissance' then 'Reconnaissance' 
when attack_cat == 'Shellcode' then 'Shellcode' 
when attack_cat == 'Worms' then 'Worms' 
when attack_cat == 'Analysis' then 'Analysis' 
when attack_cat == 'DoS' then 'DoS' 
when attack_cat == 'Exploits' then 'Exploits' 
when trim(attack_cat) == 'Fuzzers' then 'Fuzzers' 
when trim(attack_cat) == 'Shellcode' then 'Shellcode' 
when trim(attack_cat) == 'Reconnaissance' then 'Reconnaissance' end,
count(*) from actualattacks group by attack_cat;">/root/data/output/results2.csv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.