본문 바로가기
동굴 속 정보

Hive에서 데이터 가져오기

by 도시형닌자 2020. 7. 6.

[ 데이터 가져오기 ]

데이터를 들고 오는 행위를 Data Import라고 한다.

import라는 용어는 수입이라는 용어도 있지만 가져오기라는 의미도 있다.

 

머신러닝에 사용하는 데이터는 어딘가에 저장되어 있다.

이러한 데이터를 들고 오기 위해서는 항상 삽질이 동반된다.

 

Hive에서 데이터를 가져오던

Spark를 통해서 데이터를 가져오던

RDBMS를 통해서 가져오던

API를 통해서 가져오던

일단 가져와야지 데이터를 전처리하고 학습할 수 있다.

 

데이터를 가져오는 방법을 알아야 다음 단계로 넘어갈 수 있다.

간단하지만, 삽질이 동반되는 코드이므로 한 개씩 정리해 본다.

 

 

 

 

[ Hive에서 데이터 가져오기 ]

import pandas as pd
from sqlalchemy.engine import create_engine
from sqlalchemy.pool import NullPool

def create_engine_for_hive(sql_contents):
	url = '127.0.0.1'
	queue = 'default' #hive queue name
	engine = create_engine(
			'hive://' + url + ':10000',
			connect_args={
				'auth': 'NOSASL',
				'configuration': {
					'mapreduce.job.queuename': queue
				}
			},
			echo=False,
			poolclass=NullPool
		)
	return pd.read_sql(sql, engine)

sql_contents = "SELECT name, gender, age from customer_infomation"
contents = create_engine_for_hive(sql_contents)
print(contents.head())

Hive에서 데이터를 가져오면 Pandas를 통해 Dataframe으로 저장한다.

Hive에 연결하기 위해서는 sqlalchemy에서 create_engine을 import 한다.

어딘가 DB에 연결할 때 create_engine이 유용하므로 사용방법을 익히는 게 좋다.

 

create_engine에서 사용하는 connect_args라는 변수가 있다.

이 변수에는 Dict 형태의 값을 넣을 수 있다.

Key, Value 형태로 권한이라던가, DB 이름, 인코딩 같은 것을 넣을 수 있다.

 

echo=True이면 create_engine으로 동작하는 명령문을 출력한다.

비효율적이므로 연결이 완료된 상태에서는 echo=False 한다.

 

poolclass에는 NullPool이 사용된다.

pool은 차후에 발생할 데이터베이스 연결을 캐싱하는 방법이다.

이 방법은 비번한 데이터베이스 요청이 발생하는 서비스에서 사용하면 좋다.

매번 연결을 생성하는 건 비용이 많아지기 때문이다.

근대 우리는 데이터를 한번 불러오고 또 불러오는 행위를 지속하지 않는다.

그래서 NullPool을 통해서 데이터를 불러온다.

 

sql_contents에 SQL문을 넣고 create_engine_for_hive라는 함수를 호출한다.

hive에 연결이 되고 read_sql이 sql을 실행하고 dataframe으로 반환한다.

데이터의 양에 따라서 실행시간에 차이가 생기겠지만 완벽하게 가져오게 된다.