데이터를 주고 받는 형식으로 요즘은 JSON이 거의 대세이다. 따라서, 로그파일 등에 내용도 JSON 형식으로 저장되는 케이스가 많다.
Hadoop에 저장된 JSON 형식의 데이터를 읽고, 쓰야할 경우가 생기며, 이를 위한 모듈 Json Serde 가 많이 공개되어 있다.
그 중에, 아래 github 공개된 소스를 활용한 예제를 공유하고자 한다.
JsonSerde – a read/write SerDe for JSON Data (Serialization/Deserialization module for Apache Hadoop Hive)
https://github.com/rcongiu/Hive-JSON-Serde
라이브러리 설치/사용
위 Github에서 가져와서 컴파일 하거나, 컴파일된 JAR(json-serde-1.1.4.jar) 파일을 hive가 설치된 서버에 저장($HIVE_HOME/lib)
해당 라이브러리를 사용하기 위해서는 2가지 방법이 있다.
1. hive에 접속시 jar를 add
hive> ADD JAR /home/daisy/hadoop/hive/lib/json-serde-1.1.4.jar;
2. $HIVE_HOME/conf/hive-site.xml 내 jar 설정
1 2 3 4 | <property> <name>hive.aux.jars.path< /name > <value> file : ////home/daisy/hadoop/hive/lib/json-serde-1 .1.4.jar< /value > < /property > |
위와 같이 설정후 hive server 재시작하면, 항상 로딩되어 add jar 할 필요가 없음.
HIVE Table/Data 생성
1. json 파일 형식
1 2 3 4 5 6 7 8 | { "statTime" : "20130710180059" , "bizCode" : "BOOK" , "saleInfo" :{ "bookName" : "book61" , "saleCount" :749 } } |
위 형식과 같은 json 파일의 샘플 파일 (sampledata.txt)
2. hive 테이블 생성
1 2 3 4 5 6 7 8 9 10 | CREATE TABLE IF NOT EXISTS bookStat ( statTime STRING, bizCode STRING, saleInfo STRUCT < bookName:STRING, saleCount: INT > )ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' STORED AS TEXTFILE |
3. 데이터 로딩
- 우선 HDFS에 샘플데이터 put
[daisy@daisy]$ hadoop fs -put sampledata.txt /user/daisy/testdata/sampledata.txt
- 생성한 테이블에 데이터 로딩
1 2 3 | hive> LOAD DATA INPATH '/user/daisy/testdata/sampledata.txt' OVERWRITE INTO TABLE bookStat; Table default.bookstat stats: [num_partitions: 0, num_files: 1, num_rows: 0, total_size: 1401, raw_data_size: 0] OK |
테이블 생성과 json 포맷의 데이터도 입력이 완료, HIVE 통해 필요한 분석을 하면 된다.
HiveQL로 Query 해보기
- 제대로 로딩 되었다면 전체 카운트가 3360건
1 2 3 4 5 6 | hive> SELECT COUNT (*) FROM bookStat; Total MapReduce CPU Time Spent: 3 seconds 80 msec OK 3360 Time taken: 34.116 seconds, Fetched: 1 row(s) hive> |
- JSON 포맷에서 bookName 읽어오기
1 2 3 4 5 6 7 8 9 10 11 12 13 | hive> SELECT saleInfo.bookName FROM bookStat WHERE statTime LIKE "2013071018%" ; OK book1 book59 book92 ... 중략 ... book72 book48 book56 book58 book32 Time taken: 19.687 seconds, Fetched: 60 row(s) hive> |
- 집계함수 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | hive> SELECT SUM (saleInfo.saleCount) FROM bookStat WHERE saleInfo.bookName= "book1" ; OK 12568 Time taken: 31.928 seconds, Fetched: 1 row(s) hive> hive> SELECT saleInfo.bookName as bn, SUM (saleInfo.saleCount) FROM bookStat GROUP BY saleInfo.bookName ORDER BY bn; OK book1 12568 book10 15725 book100 26414 book11 11281 book12 16848 book13 22085 ... 중략 ... book97 18610 book98 18732 book99 11041 Fetched: 100 row(s) hive> |