Hive 쿼리 결과를 CSV 파일에 저장하려고합니다. 명령이 다음과 같아야한다고 생각했습니다.
insert overwrite directory '/home/output.csv' select books from table;
실행하면 성공적으로 완료되었다고 표시되지만 파일을 찾을 수 없습니다. 이 파일을 어떻게 찾습니까? 아니면 다른 방법으로 데이터를 추출해야합니까?
답변:
INSERT OVERWRITE
Hive에서 데이터를 가져 오는 데 사용할 수 있지만 특정 경우에 가장 적합한 방법은 아닐 수 있습니다. 먼저 무엇을하는지 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;
도움이 되었기를 바랍니다.
CSV 파일을 원하면 다음과 같이 Lukas의 솔루션을 수정할 수 있습니다 (Linux 상자에 있다고 가정).
hive -e 'select books from table' | sed 's/[[:space:]]\+/,/g' > /home/lvermeer/temp.csv
비슷한 솔루션을 찾고 있었지만 여기에 언급 된 솔루션은 작동하지 않습니다. 내 데이터에는 공백 (공백, 줄 바꿈, 탭) 문자 및 쉼표의 모든 변형이 있습니다.
열 데이터 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를 만들었습니다. 이것이이 솔루션을 찾는 사람들에게 도움이되기를 바랍니다.
이것은 HiveQL의 결과를 출력하는 데 가장 친숙한 CSV 방식입니다.
데이터 형식을 지정하기 위해 grep 또는 sed 명령이 필요하지 않습니다. 대신 hive가이를 지원하고 outputformat의 추가 태그를 추가하기 만하면됩니다.
hive --outputformat=csv2 -e 'select * from <table_name> limit 20' > /path/toStore/data/results.csv
나는 비슷한 문제가 있었고 이것이 내가 그것을 해결할 수 있었던 방법입니다.
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"
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
쿼리를 시작한 후 다음 단계를 더 다룹니다.
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
이 쉘 명령 output.txt
은 열 헤더없이 csv로 출력 형식을 인쇄합니다 .
$ hive --outputformat=csv2 -f 'hivedatascript.hql' --hiveconf hive.cli.print.header=false > output.txt
다음 명령을 사용하십시오.
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