[hive] collect_set

hadoop 2016.04.30 00:49




SELECT문에서 GROUP BY 컬럼이 아닌 다른 컬럼을 사용해야 한다면, 

GROUP BY 절에 해당 컬럼을 사용하지 않고, 

collect_set라는 분석 함수를 사용한다. 


collect_set 함수는 중복 엘리먼트를 제거하는 객체 집합을 리턴한다.



예)


SELECT

    sex, COLLECT_LIST(sex), count(*)

FROM

    member

WHERE

    id > 1

GROUP BY

    sex;




Posted by 김용환 '김용환'



hadoop의 getmerge 명령어의 결과를 hadoop 파일 시스템에 저장하는 줄 알았는데, 알고 보니. local이었다.  ㅠ


getmerge 명령어는 part*로 나눠진 파일을 하나로 모아 로컬 파일 시스템에 저장한다.  




http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/FileSystemShell.html#getmerge


getmerge

Usage: hadoop fs -getmerge [-nl] <src> <localdst>

Takes a source directory and a destination file as input and concatenates files in src into the destination local file. Optionally -nl can be set to enable adding a newline character (LF) at the end of each file.

Examples:

  • hadoop fs -getmerge -nl /src /opt/output.txt
  • hadoop fs -getmerge -nl /src/file1.txt /src/file2.txt /output.txt

Exit Code:

Returns 0 on success and non-zero on error.




예제>


$ hdfs dfs -ls /tmp/test/20160418

Found 6 items


/tmp/test/_SUCCESS

/tmp/test/done

/tmp/test/part-m-00000

/tmp/test/part-m-00001

/tmp/test/part-m-00002

/tmp/test/part-m-00003




$ hdfs dfs -getmerge hdfs://google-hadoop장비이름/tmp/test/20160418  /tmp/1



로컬에 하나의 파일로 저장한 것을 확인한다.

$ ls  /tmp/1

/tmp/1

Posted by 김용환 '김용환'


하이브에서 COUNT와 DISTINCT를 동시에 사용할 때, 

하이브는 mapred.reduce.tasks = 20으로 설정 리듀스 개수를 무시하고 오직 하나의 리듀서만 사용한다. 


데이터가 클 때 병목이 발생한다. 



이 방식의 해결책은 서브쿼리를 사용한다.


예시) 


* COUNT와 DISTINCT를 동시에 쓰면 하나의 리듀스에서만 실행된다.

SELECT count(distinct age)  FROM member;


* 서브 쿼리를 사용하면, 리듀스 작업을 mapred.reduce.tasks로 설정한 값으로 동작한다. DISTINCT를 사용하여 하나 이상의 리듀서를 사용하여 상대적으로 작은 양의 데이터에 COUNT를 실행한다. 따라서 리듀서 병목이 사라진다.

SELECT count(*) FROM (SELECT distinct age FROM member) a;



'hadoop' 카테고리의 다른 글

[hive] collect_set  (0) 2016.04.30
[hadoop] getmerge 명령어  (0) 2016.04.21
[hive] count와 distinct 이슈  (0) 2016.04.20
[hive] group by 이후에 order by 개수 지정하기  (0) 2016.04.19
[hive] ALTER TABLE 예시  (0) 2016.04.19
[hive] alter table 시 주의 사항  (0) 2016.04.19
Posted by 김용환 '김용환'



hive에서 count를 사용하기 위해 group by 컬럼을 적용한 후 order by 컬럼을 사용할 때 사용할 팁이다.



특정 필드를 기반으로 group by 후, count 별 역순으로 확인할 때, 

order by 뒤에 들어갈 필드는 count(*)에 대한 앨리어스를 사용하면 잘된다.


select timezone, count(*) as count from request where date=20160401

 group by timezone order by count desc limit 30




'hadoop' 카테고리의 다른 글

[hadoop] getmerge 명령어  (0) 2016.04.21
[hive] count와 distinct 이슈  (0) 2016.04.20
[hive] group by 이후에 order by 개수 지정하기  (0) 2016.04.19
[hive] ALTER TABLE 예시  (0) 2016.04.19
[hive] alter table 시 주의 사항  (0) 2016.04.19
[hive] hive.cli.print.header  (0) 2016.04.19
Posted by 김용환 '김용환'






Hive의 ALTER TABLE 문은 많은 기능을 가진다.

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-AlterTable



단순한 컬럼 수정 뿐 아니라, 순서 변경, 추가, 완전 치환, 이름 변경 등의 기능을 가진다.



RENAME TO 절을 이용하여 이름을 변경한다. 



hive> CREATE TABLE users (`id` int, `location` string);

OK

hive> desc users;

OK

col_name data_type comment

id                   int

location             string




hive> ALTER TABLE users RENAME TO new_users;

OK

hive> desc new_users;

OK

col_name data_type comment

id                   int

location             string

Time taken: 0.036 seconds, Fetched: 2 row(s)




테이블 속성을 변경할 수 있다.


hive> ALTER TABLE users SET TBLPROPERTIES ('comment' = 'new user heros');

OK



컬럼을 추가할 수 있다.


hive> ALTER TABLE  users ADD COLUMNS (`work` string COMMENT 'comment');

OK

Time taken: 0.108 seconds

hive> desc users;

OK

col_name data_type comment

id                   int

location             string

work                 string               comment

Time taken: 0.104 seconds, Fetched: 3 row(s)





한 번에 다중 컬럼 추가 기능도 제공한다.


hive> ALTER TABLE  users ADD COLUMNS (`has_talk` string COMMENT 'checking whether user has talk', `json` string);

OK

Time taken: 0.041 seconds

hive> desc users;

OK

col_name data_type comment

id                   int

location             string

work                 string               comment

has_talk             string               checking whether user has talk

json                 string

Time taken: 0.036 seconds, Fetched: 5 row(s)





컬럼의 타입과 순서를 변경한다. 


hive> ALTER TABLE users CHANGE work work_name string AFTER json;

OK

Time taken: 0.047 seconds

hive> desc users;

OK

col_name data_type comment

id                   int

location             string

has_talk             string               checking whether user has talk

json                 string

work_name           string               comment

Time taken: 0.039 seconds, Fetched: 5 row(s)



컬럼을 삭제하기 위해 DROP 또는 DROP COLUMN 절을 사용하면 에러가 발생한다.

hive>ALTER TABLE users DROP COLUMN json;

error



따라서 DROP 대신 REPLACE 절을 이용하여 테이블 스키마를 수정한다.



hive> ALTER TABLE users REPLACE COLUMNS (`id` int, `location` string);

OK

Time taken: 0.071 seconds

hive> desc users;

OK

col_name data_type comment

id                   int

location             string

Time taken: 0.05 seconds, Fetched: 2 row(s)




Posted by 김용환 '김용환'



필드명과 주석에 쓰이는 문자열을 표시하는 기호가 다르다.


필드명은 `로 사용하고, 주석은 '로 사용한다.



hive> ALTER TABLE  users ADD COLUMNS (`json` string, `timezone` string COMMENT `timezone of user`);

mismatched input 'timezone of user' expecting StringLiteral near 'COMMENT' in column specification




hive> ALTER TABLE  users ADD COLUMNS (`json` string, `timezone` string COMMENT 'timezone of user');

OK


Posted by 김용환 '김용환'


hive에서 헤더가 안나올 때가 있다.



hive> select * from members


값만 나옴




헤더가 나오게 하려면,  아래 설정 값을 true로 설정한다.


hive> set hive.cli.print.header=true;




hive 실행시부터 select 결과에서 헤더를 보고 싶다면, .hiverc에 추가한다.


cat > ~/.hiverc

 set hive.cli.print.header=true;



Posted by 김용환 '김용환'


텍스트 파일에서 hive 테이블로 읽어들일 때, 구분자를 잘 사용하여, 데이터 타입에 맞게 잘 저장할 수 있다.




CREATE TABLE  ..



ROW FORMAT DELIMITED

FIELDS TERMINATED BY '|'

COLLECTION ITEMS TERMINATED BY ','

MAP KEYS TERMINATED BY ':';





데이터을 읽어 테이블로 생성할 때. LOAD DATA LOCAL INPATH 문을 사용한다.



LOAD DATA LOCAL INPATH '/home/www/data.txt' OVERWRITE INTO TABLE member;




Posted by 김용환 '김용환'



mac에서 hadoop, hive를 쉽게 쓰기 위한 방법을 링크한다.


1. hadoop 설치

https://getblueshift.com/setting-up-hadoop-2-4-and-pig-0-12-on-osx-locally/


(hadoop 2.7.1 설치)



./sbin/start-dfs.sh 하고 아래와 같은 에러가 발생했다.


There are 0 datanode(s) running and no node(s) are excluded in this operation.




 libexec/etc/hadoop/core-site.xml에 추가한다.


  <property>

        <name>hadoop.tmp.dir</name>

   <value>/app/hadoop/tmp</value>

   <description>A base for other temporary directories.</description>

</property>




디렉토리 생성 및 권한을 추가한다.


sudo mkdir -p /app/hadoop/tmp

sudo chown 사용자이름 /app/hadoop/tmp




그리고, 네임노드를 포맷한다.

bin/hadoop namenode -format

네임 노드를 포맷하지 않으면, 아래 에러가 발생한다.

ERROR org.apache.hadoop.hdfs.server.namenode.FSNamesystem: FSNamesystem initialization failed.

java.io.IOException: NameNode is not formatted.





2. hive 설치

https://noobergeek.wordpress.com/2013/11/09/simplest-way-to-install-and-configure-hive-for-mac-osx-lion/



(hive 1.2.7 설치)


Posted by 김용환 '김용환'

[hadoop] mkdir -p

hadoop 2016.04.18 15:06


하둡의 mkdir 명령어는 디렉토리를 생성한다.


hdfs dfs -mkdir /user/www/dump/



상위 디렉토리가 없으면, 'No such file or directory' 에러가 발생한다.


리눅스 머신에서 mkdir -p 명령어를 사용한 것처럼 -p 옵션을 추가해야 에러가 발생하지 않고, 하위 디렉토리까지 깔끔하게 만들어진다. 


hdfs dfs -mkdir -p /user/www/dump/



'hadoop' 카테고리의 다른 글

[hive] 데이터 타입에 맞게 구분자 활용하여 테이블 저장하기  (0) 2016.04.19
brew를 이용해서 hadoop, hive 설치하기  (0) 2016.04.19
[hadoop] mkdir -p  (0) 2016.04.18
[hive] database 만들기  (0) 2016.04.18
[hive] hive cli history  (0) 2016.04.17
[hive] HiveServer2  (0) 2016.04.16
Posted by 김용환 '김용환'