Hive는 명령이 많기 때문에 대부분의 기존 SQL 명령을 지원합니다. 가장 일반적으로 사용되는 Hive DDL (Data Definition Language, 데이터 정의 언어) 명령을 예제와 함께 알아 보겠습니다.

Beeline을 사용하여 Hive에 연결 된 상태에서 시작해야 한다.

Hive DDL database Commands


여러 Hive DDL 명령 중에서 가장 일반적으로 사용되는 DDL 명령에 대해 설명합니다. DDL 명령은 데이터베이스, 테이블을 생성(Create)하고, 테이블의 구조를 수정(modify)하고, 데이터베이스와 테이블을 삭제(drop)하는 데 사용됩니다.

Create Database

CREATE DATABASE IF NOT EXISTS speech_db;

데이터베이스가 이미 존재하는 경우 데이터베이스 db_name이 이미 존재한다는 오류가 표시됩니다. 데이터베이스를 생성하기 전에 이미 존재하는지 확인하려면 IF NOT EXISTS 절을 사용하십시오. LOCATION 절을 사용하여 데이터베이스의 위치를 변경할 수 있습니다.

기본적으로 Hive는 데이터베이스를웨어 하우스 위치 / user / hive / warehouse에 저장합니다. 아래 명령은 데이터베이스의 위치를 변경합니다.

CREATE DATABASE temp LOCATION '/user/hive/warehouse';

Show Databases

0: jdbc:hive2://> SHOW DATABASES;
OK
+-----------------------+
|     database_name     |
+-----------------------+
| aa                    |
| speech_db             |
+-----------------------+
51 rows selected (0.117 seconds)

Use Database

0: jdbc:hive2://>USE speech_db;

Describe Database

0: jdbc:hive2://>DESCRIBE DATABASE speech_db;
0: jdbc:hive2://>DESCRIBE SCHEMA speech_db; 
0: jdbc:hive2://>DESCRIBE DATABASE EXTENDED speech_db;
0: jdbc:hive2://>DESCRIBE SCHEMA EXTENDED speech_db;
0: jdbc:hive2://>DESCRIBE DATABASE speech_db;
+----------+----------+---------------------------------------------+-------------+-------------+-------------+
| db_name  | comment  |                  location                   | owner_name  | owner_type  | parameters  |
+----------+----------+---------------------------------------------+-------------+-------------+-------------+
| speech_db|          | hdfs://hadoop/user/speech_db.db             | hdfs        | USER        |             |
+----------+----------+---------------------------------------------+-------------+-------------+-------------+
1 row selected (0.07 seconds)
0: jdbc:hive2://>

Drop Database

jdbc:hive2://>DROP DATABASE speech_db;
jdbc:hive2://>DROP DATABASE speech_db CASCADE;
jdbc:hive2://>DROP DATABASE speech_db RESTRICT;

Hive DDL Table Commands


Hive는 Managed, External, Temporary and Transactional 테이블과 같은 다양한 유형의 테이블을 지원합니다. 여기서 예제를 간단하게 만들기 위해 Hive Managed 테이블을 생성하겠습니다.

Hive Managed 테이블은 Hive가 HDFS의 메타 데이터 및 실제 테이블 데이터 / 파일을 소유하고 관리하는 내부 테이블입니다.

Create Table

CREATE TABLE IF NOT EXISTS speech_db.user (
 id int,
 name string,
 age int,
 gender string )
 COMMENT 'Employee Table'
 ROW FORMAT DELIMITED
 FIELDS TERMINATED BY ',';

Show Tables

SHOW TABLES; // This shows all tables from the current database
SHOW TABLES in emp; // This shows all tables in the emp database
+--------------------+
|      tab_name      |
+--------------------+
| user.              |
+--------------------+
1 rows selected (0.067 seconds)
0: jdbc:hive2://>

Describe Table

DESCRIBE FORMATTED user;
DESCRIBE EXTENDED user;

Truncate Table

Truncate table은 테이블을 자르는 데 사용되며 이는 테이블의 모든 내용과 테이블의 구조를 삭제함을 의미합니다.

TRUNCATE TABLE speech_db;

Alter Table

ALTER TABLE user RENAME TO user2;

Drop Table

DROP TABLE user2;
DROP TABLE speech_db.user2;
DROP TABLE IF EXISTS user2 PURGE;

 

Hive는 Hadoop 용 데이터웨어 하우스 데이터베이스이며 모든 데이터베이스 및 테이블 데이터 파일은 기본적으로 /user/hive/warehouse HDFS 위치에 저장되며, 기타 Hadoop 호환 파일 시스템의 사용자 지정 위치에 Hive 데이터웨어 하우스 파일을 저장할 수도 있습니다.

 

Hive를 사용할 때, 2 개의 서로 다른 데이터 저장소에 대해 알아야합니다.

  • Hive Metastore
  • Hive Data warehouse Location (실제 테이블 데이터가 저장된 위치)

 

Hive Metastore


Hive Metastore는 데이터베이스 및 테이블에 대한 Meta 데이터를 저장하는 데 사용되며 기본적으로 Derby 데이터베이스를 사용합니다. 이것을 MySQL 및 Postgress 등과 같은 RDBMS 데이터베이스로 변경할 수 있습니다. 기본적으로 Metastore 데이터베이스 이름은 metastore_db입니다.

 

Hive Table Location (Hive Data warehouse)


Hive는 기본적 /user/hive/warehouse으로 HDFS 파일 시스템의 위치에 테이블 파일을 저장 합니다. Hive를 사용하기 전에 HDFS에서 이러한 디렉터리를 만들어야합니다.

 

이 위치에서 사용자가 만든 모든 데이터베이스의 디렉터리와 사용하는 테이블 이름이있는 하위 디렉터리를 찾을 수 있습니다.

 


 

1. 속성에서 스토리지 경로 가져 오기

위치가 다른 경우 hive.metastore.warehouse.dir속성 에서 경로를 가져올 수 있으며 Hive Beeline CLI터미널 에서 다음 명령을 실행하여 가져올 수 있습니다 .

set hive.metastore.warehouse.dir;
hive.metastore.warehouse.dir=/user/hive/warehouse

 

2. 구성 파일에서 스토리지 경로 가져 오기

$HIVE_HOME/conf/hive-site.xml파일 에서 hive.metastore.warehouse.dir 속성 값을 찾아 경로를 가져올 수도 있습니다.

 

3. Hive 명령 사용해서 경로 가져 오기

아래 명령을 실행하여 테이블의 하이브 스토리지 경로를 가져올 수도 있습니다.

hive -S -e "DESCRIBE FORMATTED table_name;" | grep 'Location' | awk '{ print $NF }'

테이블 위치는 SHOW CREATE TABLE하이브 터미널에서 명령을 실행하여 가져올 수도 있습니다 .

SHOW CREATE TABLE table_name;
(or)
DESCRIBE FORMATTED table_name;

 

4. Hive 테이블 파티션 위치

Hive에 파티션 된 테이블 이 있고 각 파티션 파일의 위치가 다른 경우 아래 명령을 사용하여 HDFS에서 각 파티션 파일 위치를 가져올 수 있습니다 .

DESCRIBE FORMATTED db_name.table_name PARTITION (name=value)

 

 


Reference

[1] https://cwiki.apache.org/confluence/display/Hive/Home#Home-HiveDocumentation

하이브는 다음과 같은 기본 데이터 유형 (primitive type) 과 복잡한 데이터 유형 (complex type)을 지원합니다. 이러한 데이터 유형은 테이블의 열(columns)과 연관이 있습니다.

data_type
  : primitive_type
  | array_type
  | map_type
  | struct_type
  | union_type  -- (Note: Available in Hive 0.7.0 and later)
 
primitive_type
  : TINYINT
  | SMALLINT
  | INT
  | BIGINT
  | BOOLEAN
  | FLOAT
  | DOUBLE
  | DOUBLE PRECISION -- (Note: Available in Hive 2.2.0 and later)
  | STRING
  | BINARY      -- (Note: Available in Hive 0.8.0 and later)
  | TIMESTAMP   -- (Note: Available in Hive 0.8.0 and later)
  | DECIMAL     -- (Note: Available in Hive 0.11.0 and later)
  | DECIMAL(precision, scale)  -- (Note: Available in Hive 0.13.0 and later)
  | DATE        -- (Note: Available in Hive 0.12.0 and later)
  | VARCHAR     -- (Note: Available in Hive 0.12.0 and later)
  | CHAR        -- (Note: Available in Hive 0.13.0 and later)
 
array_type
  : ARRAY < data_type >
 
map_type
  : MAP < primitive_type, data_type >
 
struct_type
  : STRUCT < col_name : data_type [COMMENT col_comment], ...>
 
union_type
   : UNIONTYPE < data_type, data_type, ... >  -- (Note: Available in Hive 0.7.0 and later)

Hive Misc Types (Boolean & Binary)


MISC TYPESDESCRIPTION
BOOLEANAccepts TRUE/FALSE values
BINARYOnly available starting with Hive 0.8.0

Hive Numeric Types


NUMERIC TYPESDESCRIPTION
TINYINT1-byte signed integer, from -128 to 127
SMALLINT2-byte signed integer, from -32,768 to 32,767
INT/INTEGER4-byte signed integer, from -2,147,483,648 to 2,147,483,647
BIGINT8-byte signed integer, from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
FLOAT4-byte single precision floating point number
DOUBLE8-byte double precision floating point number
DOUBLE PRECISIO NAlias for DOUBLE, only available starting with Hive 2.2.0
DECIMALIt accepts a precision of 38 digits.
NUMERICSame as DECIMAL type.

Hive String Types


STRING TYPESDESCRIPTION
STRINGThe string is an unbounded type. Not required to specify the lenght. It can accept max up to 32,767 bytes.
VARCHARVariable length of characters. It is bounded meaning you still need to specify the length like VARCHAR(10).
CHARFixed length of Characters. if you define char(10) and assigning 5 chars, the remaining 5 characters space will be wasted.

Hive Date & Time Types


DATE/TIME TYPESDESCRIPTION
TIMESTAMPAccepts Both Date and Time
DATEAccepts just Date
INTERVALInterval

Hive Complex Types (Array, Map, Struct)


  • Spark와 마찬가지로 Hive는 Array, Map, Struct 및 union을 포함하는 복잡한 데이터 유형도 지원합니다.
    • Array는 list of elements 을 저장하는 데 사용됩니다.
    • Map은 key / value pair를 저장하는 데 사용됩니다.
    • Struct는 부모 및 자식 연결을위한 것 입니다.

COMPLEX TYPESDESCRIPTION
ArraysARRAY<data_type>
MapsMAP<primitive_type, data_type>
StructsSTRUCT<col_name : data_type [COMMENT col_comment], ...>
UnionUNIONTYPE<data_type, data_type, …>Note: Only available starting with Hive 0.7.0.

이 글에선 하이브의 개념에 대해 살펴보겠습니다.

하이브란?


Apache Hive는 Hadoop을 위한 오픈 소스 데이터웨어하우스 솔루션입니다. 구조화 된 빅데이터를 처리하는 데 사용되며 HiveQL 쿼리를 실행하는 방법을 제공합니다.

기능 및 특징


  • 사용자가 SQL로 쿼리를 작성하면 그것을 자동으로 맵리듀스 작업으로 변경해주는 쿼리 엔진 역할 수행
  • RDBMS와 유사하게 데이터 요약, 임시 쿼리 및 대용량 데이터 분석이 가능하도록 설계된 데이터 분석 플랫폼
  • Hive의 SQL은 사용자 정의 함수 (UDF)와 같은 사용자 정의 분석을 수행하기 위해 자신의 기능을 통합 할 수있는 여러 위치를 사용자에게 제공합니다.
  • 실시간 시스템의 row-level 업데이트에는 사용되지 않습니다.
  • Java, Scala, C #, Python 및 더 많은 언어에서 연결하는 데 사용되는 Beeline 클라이언트를 제공합니다.

데이터 단위


Hive 데이터는 RDBMS와 거의 유사하게 다음과 같이 구성됩니다.

  • Database

    이름 공간은 테이블, 뷰, 파티션, 열 등에 대한 이름 충돌을 방지하기 위해 작동합니다. 데이터베이스를 사용하여 사용자 또는 사용자 그룹에 대한 보안을 강화할 수도 있습니다.

  • Table

    동일한 스키마를 갖는 동종 데이터 단위

  • Partition

    각 테이블은 데이터 저장 방법을 결정하는 하나 이상의 파티션 키를 가질 수 있습니다. 파티션 또한 사용자가 지정된 기준을 충족하는 행을 효율적으로 식별 할 수 있습니다. 

  • Bucket (or 클러스터)

    각 파티션의 데이터는 테이블의 일부 열에 대한 해시 함수 값에 따라 차례로 버킷으로 나뉩니다. 이는 데이터를 효율적으로 샘플링하는 데 사용할 수 있습니다.

음성 데이터 관련해서 맨날 까먹고 헷갈리는 간단한 내용에 대해 메모합니다.

만약 이런 질문이 있다면, 어떤식으로 계산할 수 있을까요?

16kH, 16 Bit인 Wave 파일들 여러개의 총 용량이 500GB 일 때, 해당 Wav 파일들의 총 몇시간인가?

우선 단위에 대해서 정리를 해보겠습니다.

1) 연산 단위
1 KByte = 1024 Byte
1 MByte = 1024 KByte
1 GByte = 1024 MByte

2) 샘플링 레이트 (Sampling Rate)
1 KHz = 1024 Hz (초당 1024 Byte)
16 KHz = 16 * 1024 Hz (초당 16 * 1024 Byte)

3) 비트 레이트 (Bit Rate)
16 Bit = 2 Byte

이제 16kH, 16 Bit인 Wave 1초짜리 용량이 어떻게 되는지 계산해보면 다음과 같습니다.

2 Byte (16 bit) X 16 * 1024 Byte ( 초당 16 * 1024 Hz) = 32 Kb / 1 sec

따라서 1 sec, 1 min, 1 hour 데이터 용량은 다음과 같습니다.

32 KB | 1 sec
1.92 MB = 32 kb X 60 | 1 min
115.2 MB = 1.92 Mb X 60 | 1 hour

결론적으로 답은?!

500 X 1024 MByte / 115.2 Mb (1H) = 4444 H = 185 일

 

음성인식을 위해 일반적으로 16kHz, 16-bit 인 Wave 파일을 많이 다루니, 

대략적으로 음성데이터는 1초에 32 KB, 1분에 2MB, 그리고 1 시간에 115 MB 사이즈 정도 된다고 외우고 있으면 좋을 듯 합니다!

블랙록의 투자를 분석하는 주요 팩터 6가지; 투자를 위한 새로운 렌즈

투자를 평가하기 위한 새로운 렌즈인 The Factor Box.

 

투자자들은 The Factor Box를 다양한 펀드에서 factor를 비교하고,

포트폴리오를 구축하고 리스크 매니지 먼트하는데 도움이 되는 툴로 사용할 수 있다.

 

 

  • Value (가치): stocks that are cheap relative to their fundamentals
  • Low Size (소형주): Smaller more nimble companies
  • Momentum (모멘텀): Stocks in an upswing
  • Quality (퀄리티): Companies with healthy balance sheets
  • Dividend Yield (고배당): Higher yielding companies
  • Low Volatility (저변동): Stocks that have collectively exhibited lower volatility

 

 

 


Reference

 

[1] www.ishares.com/us/resources/tools/factor-box

 

The Factor Box | iShares - BlackRock

 

www.ishares.com

 

5. F-Score

  • 조셉 피오트로스키 (Joseph Piotroski)가 2000년 논문에서 제안
  • 저 PBR 기업 중 고 퀄리티 기업에만 투자하고자 제안

F-score

  • 한 개 지표만 사용하지 않고, 주식별로 9개 항목을 검토해 각 사항이 맞으면 1점, 틀리면 0점을 부여

수익성

  • 전년 당기순이익: 0이상
  • 전년 영업현금흐름: 0이상
  • ROA: 전년 대비 증가
  • 전년 영업현금흐름: 순이익보다 높음

재무 건전성

  • 부채비율: 전년 대비 감소
  • 유동비율: 전년 대비 증가
  • 신규 주식 발행(유상증자): 전년 없음

효율성

  • 매출총이익률(=매출총이익/매출액): 전년 대비 증가
  • 자산회전율(=매출/자산): 전년 대비 증가

신 F-score

  • 9개가 아닌 3개의 지표만 사용하여, 맞으면 1점, 틀리면 9점을 부여

  • 신규 주식 발행(유상증자): 전년 없음
  • 전년 당기순이익: 0이상
  • 전년 영업현금흐름: 0이상

1. ROE (자기자본이익률; Return On Equity)

  • 당기순이익을 순자산(자기자본)으로 나눈 값
ROE=당기순이익순자산=시가총액순자산시가총액당기순이익=PBRPERROE = {당기순이익 \over 순자산} = {{시가총액 \over 순자산} \over {시가총액 \over 당기순이익} } = {PBR \over PER}
  • PBR과 PER을 알고 있으면 ROE를 계산할 수 있음
  • POE/PER > 3 일 경우, 투자가치가 있따고 판단하는 경우도 있음(브라운스톤공식)
  • PBR이 같아도 ROE와 PER에 따라 다른 의미를 가짐
    • 투입한 자기자본이 얼마만큼의 순이익을 냈는지를 나타내는 지표
    • ROE와 PER이 각각 (20%, 5배), (5%, 20배)인 두 기업이 있으면 PBR은 1로 같지만 ROE가 높고 PER이 낮은 기업이 현재 재무구조상 더 좋다고 볼 수 있음
  • 워렌 버핏이 중요하게 여기는 지표로 알려져 있음
  • 단독으로는 크게 유용한 지표는 아님

2. ROA (총자산수익률; Return On Assets)

  • 당기순이익을 자산총액으로 나눈 값
ROA=당기순이익자산총액ROA = {당기순이익 \over 자산총액}
  • 특정 기업이 자산을 얼마나 효율적으로 운영했는지 보여주는 지표
  • 일반적으로 ROE의 경우 업계 평균 ROE, 동종기업 ROE와 비교하여 기업 실적을 판단하는데 사용됨
  • 하지만 ROE로는 부채로 발생한 손익여부를 확인할 수 없기 때문에 부채 비중이 큰 업종에는 적합하지 않을 수 있음. 이 경우에는 ROE보다 ROA를 사용하는 것이 적합

3. GP/A

  • ROE, ROA와 달리 미래 수익 예측에 비교적 큰 도움이 되는 지표임
  • 노비 마르크스(Robert Novy Marx)가 제안
    • <The Other side of Value: The gross Profit-ability Premium>, 2013

GP/A=매출액매출원가자산총액=매출총이익자산총액GP/A = {매출액-매출원가 \over 자산총액} = {매출총이익 \over 자산총액}
  • 지표와 기업의 실제 수익성과 연관성이 떨어진다.
  • 영업이익이나 당기순이익보다는 GP(매출총이익)이 더 우수하다고 설명
    • 영업이익, 당기순이익은 투자자들이 관심 있게 살펴보는 지표인 만큼 회계 조작이 많음
    • GP/A는 변질될 가능성이 거의 없어, 기업의 수익성을 대표하는 우수한 지표라고 봄

4. ROC (자기자본이익률; Return on Capital)

  • 투자한 자본 대비 어느 정도의 수익을 냈는지 측정하는 지표
  • 순이익을 총자산으로 나눈 ROA와 비슷한 개념

ROC=EBIT(영업이익)투자자본=EBIT고정자산+유동자산유동부채ROC = {EBIT (영업이익) \over 투자자본} = {EBIT \over 고정자산+유동자산-유동부채}
  • 그린블라트가 선호한 지표

+ Recent posts