대용량 객체 임포트
대부분의 데이터베이스는 단일 필드에 대용량 데이터를 저장하는 기능을 제공한다. 이런 데이터가 텍스트인지 바이너리인지에 따라서 데이터베이스 테이블에서 CLOB 또는 BLOBb 컬럼으로 표현된다. 이런한 ‘대용량 객체’는 보통 데이터베이스 자체적으로 특별한 방식으로 처리된다.
목차
1. 로그 데이터 예
웹 기반의 위젯 구매 시스템에서 들어오는 다른 로그 데이터가 시스템에 있다고 가정.
1,15,120 Any St.,LosAngeles,CA,90210,2010-08-01
3,4,120 Any St.,Los Angeles,CA,90210,2010-08-01
2,5,400 Some PI.,Cupertino,CA,95014,2010-07-30
...
영업팀이 가장 집중해야 하는 지역을 알려주기 위해 우편번호를 기준으로 가장 매출이 높은 지역을 찾을 경우. 판매 로그와 widgets 테이블이 필요.
-- 데이터 하이브로 로드
-- 테이블 생성
CREATE TABLE sales(
widget_id INT,
qty INT,
street STRING,
city STRING,
state STRING,
zip INT,
sale_data STRING,
) ROW FORMAT DELIMITED FILEDS TERMINATED BY ',';
-- LOG 데이터 저장
LOAD DATA LOCAL TINPATH "sales.log" INTO TABLE sales;
스쿱은 기존 관계형 데이터 저장소의 테이블을 기반으로 하이브 테이블을 자동으로 생성할 수 있다.
# HDFS에 저장된 데이터를 하이브 테이블을 생성하고 로드
# 스쿱과 하이브의 기본 구분자는 서로 다르므로 구분자 지정 필수
sqoop create-hive-table\
--connect jdbc:mysql://localhost/hadoop \
--table widgets\
--fields-terminated-by ','
하이브에서 제공하는 자료형은 일반적인 SQL 시스템에 비해 매우 적다. SQL 타입과 완전히 대응되는 하이브 자료형은 많지 않고, import 를 위해 하이브 테이블을 정의할 때 Sqoop은 컬럼의 값을 저장할 수 있는 최선의 하이브 타입을 선택한다. 따라서 정확도는 다소 떨어질 수 있으며, 아래 로그는 해당 타입 문제 경고 이다.
yy/mm/dd h:m:s WARN hive.TableDefWriter:
Column 'column_name' had to be
cast to a less precise type in Hive
2. 로그 데이터 예 - Sqoop에서 Hive로 바로 import
HDFS에 저장된 데이터를 Hive로 로드하는 세 단계의 작업을 DB에서 바로 Hive로 Import 한 번의 작업으로 단계를 줄일 수 있다. Import를 수행할 때 Sqoop은 Hive 테이블을 생성한 후 데이터를 로드한다. Import를 처음 수행하는 것이라면 MySQL의 테이블 스키마를 기반으로 Hive에 widgets 테이블을 생성하는 명령을 실행할 수 있다.
sqoop import \
--connect jdbc:mysql://localhost/hadoop \
--table widgtes \
-m 1 \
--hive-import # 하이브로 데이터를 바로 로드하고, 원천 데이터베이스에 있는 해당 테이블의 스키마를 기반으로 하이브 스키마를 자동으로 추론하는 명령어
어떤 데이터 import 방식을 선택했는지에 상관없이 우편번호를 기준으로 가장 매출이 높은 지역을 찾는 데 widgets 데이터셋과 sales 데이터셋을 함께 사용할 수 잇다.
-- 나중을 위해 쿼리 결과 저장
CREATE TABLE zip_profits
AS
SELECT SUM(w.price * s.qty) AS sales_vol, S.ZIP FROM SALES s
JOIN widgets w ON (s.widget_id = w.id) GROUP BY s.zip;
...
Moving data to : hdfs://localhost/user/hive/warehouse/zip_profits
...