대용량 데이터를 관계형 DB나 HDFS 파일로 저장해놓고 필요한 대상만 데이터 전처리, 샘플링해서 R에서 통계분석, 기계학습을 하는 경우가 많이 있습니다. 


이전 포스팅에서 R로 Hive와 PostgreSQL, MySQL 등에 DB connect 해서 사용하는 방법을 소개했었습니다. 


이번 포스팅에서는 


 - R로 Oracle DB connect 하고 데이터 query 하는 방법

 - R로 Presto DB connect 하고 데이터 query 하는 방법


을 소개하겠습니다. 





 1. R로 Oracle DB connect 하고 데이터 query 하는 방법


- rJava, DBI, RJDBC 패키지는 의존성이 있으므로 순서대로 설치하시기 바랍니다. (순서가 바뀌면 에러 발생)

- 혹시 Java 가 설치 안되어 있거나, 버전이 안맞아서 새로 설치해야 하면 이곳 참조 => http://rfriend.tistory.com/232

- Oracle DB의 SQL query문 마지막에 세미콜론(';')을 사용하면 에러가 나므로 유의하세요. 



# R Oracle DB Connect

 

install.packages('rJava')
install.packages('DBI')
install.packages('RJDBC')

 

library(rJava)
library(DBI)
library(RJDBC)

 


# setting driver and connection configuration


drv_Oracle <- JDBC(driverClass="oracle.jdbc.driver.OracleDriver", classPath="C:/download/ojdbc7.jar")

 

con_Oracle <- dbConnect(drv_Oracle, 
                                         "jdbc:oracle:thin:@//12.34.567.89:8888/DB_name",  # ip:port
                                         "id", 
                                         "password")

 

# SQL query
query <- "
       SELECT *
            FROM db.table
            WHERE var1 = 'aaa'
                  AND var2 = 'bbb' " # Do not use ';' (semicolon)

 

# executing DB connect & query
my_data <- dbGetQuery(con_Oracle, query)

 

# DB disconnect
dbDisconnect(con_Oracle)

 

# delete temp objects
rm(drv, con_Oracle, query)

 




 2. R로 Presto DB connect 하고 데이터 query 하는 방법


Presto는 Facebook에서 개발해서 오픈소스로 푼 분산 SQL 쿼리 엔진(distributed SQL query engine for big data)입니다. 메모리 기반으로 실행이 되다 보니 Hive 보다 속도가 많이 빠르기도 하구요, 또 Hive, phoenix, mysql 등 이기종 DB에 접속해서 데이터를 취합하고 가공하는 작업을 할 수 있어서 매우 편리하기도 합니다. 



# R Presto DB Connect


# install and request package

install.packages("RPresto")

library(RPresto)


# setting dbConnect

con_RPresto <- dbConnect(

                                           RPresto::Presto(), 

                                           host='http://12.34.56.789', 

                                           port=8080,

                                           user='user_id',

                                           schema='schema_nm',

                                           catalog='hive', # mysql, phoenix..

                                           session.timezone='UTC' 

                                           )


query <- paste0("

    SELECT var1, var2, count(*) as cnt

        FROM db.table

        WHERE var1 = 'aa'

            AND var2 = 'bb'

        GROUP BY var1, var2

")


# executing query

my_data <- dbGetQuery(con_RPresto, query)


# disconnecting DB

dbDisconnect(conn = con_Postgres)



많은 도움이 되었기를 바랍니다. 

이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. ^^



저작자 표시 비영리 변경 금지
신고
Posted by R Friend R_Friend

파이썬(Python)에는 다양한 형태의 다수의 데이터를 다룰 수 있는 자료형으로 리스트(Lists), 튜플(Tuples), 사전(Dictionary) 등이 있습니다. 


지난번 포스팅에서는 사전(Python Dictionary) 자료형의 생성, 삭제, 기본 연산자에 대해서 소개하였습니다.  이번 포스팅에서는 지난번에 이어서, 사전 자료형의 내장 함수 및 메소드(Dictionary built-in functions and methods)에 대해서 알아보겠습니다. 


사전 자료형은 키와 값의 쌍(pair of Key and Value)으로 이루어져 있는 형태에 맞게 이에 특화된 메소드들이 있습니다. 



[ 파이썬 사전 자료형의 내장 함수 및 메소드 (Python Dictionary built-in functions and methods) ]






1. 파이썬 사전 자료형의 내장 함수 (Python Dictionary built-in functions)


 1-1. len(dict): 사전의 총 길이 (total length of Dictionary)



# 1-1. len(dict) : Gives the total length of the dictionary

>>> dict_1 = {'name' : 'Python Friend', 

...           'region' : 'Busan, Korea', 

...           'phone' : '010-123-9876', 

...           'age' : 30,

...           'name' : 'R Friend'}

>>> dict_1

{'name': 'R Friend', 'region': 'Busan, Korea', 'phone': '010-123-9876', 'age': 30}

>>> len(dict_1)

4

 




 1-2. str(dict): 사전을 문자열로 반환 (string representation of a Dictionary)



# 1-2. str(dict) : Produces a printable string representation of a dictionary

>>> str(dict_1)

"{'name': 'R Friend', 'region': 'Busan, Korea', 'phone': '010-123-9876', 'age': 30}"





 1-3. type(variable): 입력 변수의 유형 반환 (returns the type of the passed variable)



# 1-3. type() : Returns the type of the passed variable

>>> type(dict_1)

<class 'dict'>

 





2. 파이썬 사전 자료형의 메소드 (Python Dictionary methods)


 2-1. dict.keys(): 사전의 키 목록



# 2-1. dict.keys(): Returns a list of all the available keys in the dictionary

>>> dict_2 = {'key1' : 123, 

...           'key2' : 'abc', 

...           'key3' : (1, 2, 3)}

>>> 

>>> dict_2

{'key1': 123, 'key2': 'abc', 'key3': (1, 2, 3)}

>>> 

>>> dict_2.keys()

dict_keys(['key1', 'key2', 'key3'])

 




 2-2. dict.values(): 사전의 값 목록



# 2-2. dict.values(): Returns a list of all the values available in the dictionary

>>> dict_2 = {'key1' : 123, 

...           'key2' : 'abc', 

...           'key3' : (1, 2, 3)}

>>> 

>>> dict_2

{'key1': 123, 'key2': 'abc', 'key3': (1, 2, 3)}

>>> 

>>> dict_2.values()

dict_values([123, 'abc', (1, 2, 3)])

 




 2-3. dict.items(): 사전의 (키, 값) 튜플 목록 



# 2-3. dict.items(): Returns a list of dict's (key, value) tuple pairs

>>> dict_2 = {'key1' : 123, 

...           'key2' : 'abc', 

...           'key3' : (1, 2, 3)}

>>> 

>>> dict_2

{'key1': 123, 'key2': 'abc', 'key3': (1, 2, 3)}

>>> 

>>> dict_2.items()

dict_items([('key1', 123), ('key2', 'abc'), ('key3', (1, 2, 3))])

 




 2-4. dict.clear(): 사전의 모든 {키, 값} 셋 제거



# 2-4. dict.clear() : Removes all items from the dictionary

>>> dict_2 = {'key1' : 123, 

...           'key2' : 'abc', 

...           'key3' : (1, 2, 3)}

>>> 

>>> dict_2

{'key1': 123, 'key2': 'abc', 'key3': (1, 2, 3)}

>>> 

>>> dict_2.clear()

>>> dict_2

{}

 




 2-5. dict.copy(): 사전의 {키 : 값} 셋 복사



# 2-5. dict.copy(): Returns a copy of the dictionary

>>> dict_2 = {'key1' : 123, 

...           'key2' : 'abc', 

...           'key3' : (1, 2, 3)}

>>> 

dict_2

>>> {'key1': 123, 'key2': 'abc', 'key3': (1, 2, 3)}

>>> 

>>> dict_3 = dict_2.copy()

>>> dict_3

{'key1': 123, 'key2': 'abc', 'key3': (1, 2, 3)}

 




 2-6. dict.fromkeys(seq, value): seq, value 셋으로 신규 사전 생성



# 2-6. dict.fromkeys(): Creates a new dictionary with keys from seq and values set to value

>>> seq = ('key1', 'key2', 'key3')

>>> 

>>> dict_4 = dict.fromkeys(seq)

>>> dict_4

{'key1': None, 'key2': None, 'key3': None}

>>> 

>>> dict_4 = dict.fromkeys(seq, 123)

>>> dict_4

{'key1': 123, 'key2': 123, 'key3': 123}

 




2-7. dict.get(key, default=None): 키에 할당된 값 반환



# 2-7. dict.get(key, default=None): Returns a value for the given key

>>> dict_2 = {'key1' : 123, 

...           'key2' : 'abc', 

          'key3' : (1, 2, 3)}

... >>> 

>>> dict_2

{'key1': 123, 'key2': 'abc', 'key3': (1, 2, 3)}

>>> 

>>> dict_2.get('key1', 'No_Key')

123

>>> dict_2.get('key5', 'No_Key') # If key is not available then returns 'No_Key'

'No_Key'

>>> dict_2.get('key5') # If key is not available then returns default value None

 




2-8. dict.setdefault(key, default=None) : 키에 할당된 값 반환


dict.get()과 유사합니다. 



# 2-8. dict.setdefault(key, default=None): Returns the key value available in the dictionary

>>> dict_2 = {'key1' : 123, 

...           'key2' : 'abc', 

...           'key3' : (1, 2, 3)}

>>> 

>>> dict_2

{'key1': 123, 'key2': 'abc', 'key3': (1, 2, 3)}

>>> 

dict_2.setdefault('key1', 'No-Key')

>>> 123

>>> dict_2.setdefault('key5', 'No_Key') 

'No_Key'

>>> dict_2.setdefault('key6', None)

 




2.9. dict.update(dict2): 기존 사전에 새로운 사전 dict2 추가



# 2-9. dict.update(dict2): Adds dictionary dict2's key-values pairs into dict

>>> dict_5 = {'key1' : 12, 

...           'key2' : 34}

>>> dict_5

{'key1': 12, 'key2': 34}

>>> 

>>> dict_6 = {'key3' : 56}

>>> 

>>> dict_5.update(dict_6)

>>> dict_5

{'key1': 12, 'key2': 34, 'key3': 56}

 



드디어 파이썬의 5가지 자료형인 숫자(Number), 문자열(String), 리스트(List), 튜플(Tuple), 그리고 사전(Dictionary)에 대한 생성, 기본 사용법, 내장함수 및 메소드에 대한 소개를 마쳤습니다. 


가장 기본이 되는 것이고 매우 매우 중요한 것이다 보니 블로그에 한번 정리를 해야지, 해야지... 하다가도 numpy 랑 pandas 먼저 포스팅하고.... 한참이 지나서야 기본이 되는 자료구조에 대해서는 이제서야 포스팅을 하게 되었네요.  밀린 숙제 끝낸 기분이라 홀가분하고 좋네요. ^^


많은 도움이 되었기를 바랍니다. 

이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. ^^


저작자 표시 비영리 변경 금지
신고
Posted by R Friend R_Friend

다양한 다수의 데이터를 다룰 수 있는 파이썬의 자료형으로 리스트(List), 튜플(Tuple), 사전(Dictionary) 자료형이 있다고 했습니다. 


그중에서 리스트와 튜플은 이전 포스팅에서 소개를 했구요, 이번 포스팅에서는 마지막으로 사전(Dictionary)에 대해서 알아보겠습니다. 


사전(Dictionary) 자료형은 마치 영한사전이 {영어단어 : 한글 뜻} 과 같이 서로 짝꿍을 이루어서 구성이 되어있는 것처럼, {키(Key) : 값(Value)} 이 콜론( :, colon)으로 구분이 되어서 쌍(pair)을 이루고 있고, 중괄호( { }, curly braces)로 싸여져 있는 자료형입니다. 


사전(Dictionary) 자료형의 키(Key)는 튜플처럼 변경 불가능(immutable)하고 유일한 값(unique)을 가지며, 값(Value)은 리스트처럼 변경이 가능(mutable) 합니다. 사전형은 키를 hashing (Dictionary as a Hash table type)해놓고 있다가 키를 사용하여 값을 찾으려고 하면 매우 빠른 속도로 값을 찾아주는 매우 효율적이고 편리한 자료형입니다. 



[ 파이썬의 5가지 자료형 (Python's 5 Data Types) ]





 1. 사전 {키 : 값} 생성: {Key1 : Value1, Key2 : Value2, ...}


{Key : Value} 를 콜론(:)으로 구분해서 쌍을 이루어주며, 다수 개의 {Key:Value}를 하나의 사전에 묶으려면 콤마(,)로 구분해서 이어주고 중괄호({ }, curly braces) 로 싸주면 됩니다.



# making Dictionary with {Key1 : Value1, Key2 : Value2, ...}

>>> dict_1 = {'name' : 'Python Friend', 

...           'region' : 'Busan, Korea', 

...           'phone' : '010-123-9876', 

...           'age' : 30}

>>> dict_1

{'name': 'Python Friend', 'region': 'Busan, Korea', 'phone': '010-123-9876', 'age': 30}

 



위의 예시처럼 한번에 {Key1 : Value1, Key2 : Value2, ...} 과 같이 키, 값 쌍을 한꺼번에 나열 할 수도 있구요, 아래의 예시처럼 먼저 { } 로 빈 사전 자료를 만들어놓은 다음에 dict[Key] = 'Value' 방식으로 하나씩 추가해나가는 방법도 있습니다. 



# making a blank Dictionary { } first, and adding {Key : Value} pairs step by step using [Key] indexing

>>> dict_2 = {} # blank Dictionary

>>> dict_2['name'] = 'R Friend'

>>> dict_2['region'] = 'Seoul, Korea'

>>> dict_2['phone'] = '02-123-4567'

>>> dict_2['age'] = 20

>>> dict_2

{'name': 'R Friend', 'region': 'Seoul, Korea', 'phone': '02-123-4567', 'age': 20}

 




  2. 사전의 키 별 값 확인 (Accessing Values per Key in Dictionary): dict[Key]



# Accessing Values per Key in Dictionary

>>> dict_1 = {'name' : 'Python Friend', 

...           'region' : 'Busan, Korea', 

...           'phone' : '010-123-9876', 

...           'age' : 30}

>>> dict_1['name']

'Python Friend'

>>> dict_1['region']

'Busan, Korea'

 



만약 사전(Dictionary)에 없는 키(Key)로 값(Value)을 확인하려고 하면 KeyError가 발생합니다. 



# KeyError when there is no 'Key' in a Dictionary

>>> dict_1 = {'name' : 'Python Friend', 

...                   'region' : 'Busan, Korea', 

...                   'phone' : '010-123-9876', 

...                   'age' : 30}

>>> dict_1

{'name': 'Python Friend', 'region': 'Busan, Korea', 'phone': '010-123-9876', 'age': 30}

>>> dict_1['address'] # KeyError due to no 'address' Key in dict_1

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

KeyError: 'address'

 




  3. 사전 갱신 (Updating Dictionary)


기존의 {키:값} 쌍의 값을 갱신하는 경우와, 새로운 {키:값} 쌍을 추가하는 방법이 있습니다. 



# Updating Dictionary : (1) updating an existing entry, (2) adding a new entry

>>> dict_1 = {'name' : 'Python Friend'

...           'region' : 'Busan, Korea', 

...           'phone' : '010-123-9876', 

...           'age' : 30}


>>> >>> dict_1['name']

'Python Friend'

>>> dict_1['name'] = 'R Friend' # (1) updating an existing entry

>>> dict_1['name']

'R Friend'

>>> 

>>> dict_1['gender'] = 'Male' # (2) Adding a new entry

>>> dict_1

{'name': 'R Friend', 'region': 'Busan, Korea', 'phone': '010-123-9876', 'age': 30, 'gender': 'Male'}

 




 4. 사전의 {키:값} 요소 삭제, 값 삭제, 사전 전체 삭제하기 (Deleting Dictionary Elements)

   : del statement, clear() method


(4-1) 사전 자료형의 'Key'를 사용하여 특정 {Key : Value} 요소(entry) 제거 : del dict[Key]

(4-2) 사전 자료형의 모든 'Value' 제거 : dict.clear()

(4-3) 사전 자료형을 통째로 삭제 : del dict



# (4-1) Removing entry with key 'name' : del dict[Key}

>>> dict_1 = {'name' : 'Python Friend', 

...           'region' : 'Busan, Korea', 

...           'phone' : '010-123-9876', 

...           'age' : 30}

>>> dict_1

{'name': 'Python Friend', 'region': 'Busan, Korea', 'phone': '010-123-9876', 'age': 30}

>>> dict_1['name']

'Python Friend'

>>> del dict_1['name'] # remove entry with key 'name'

>>> dict_1['name']

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

KeyError: 'name'



# (4-2) Removing all entries in dict using dict.clear() method

>>> dict_1 = {'name' : 'Python Friend', 

...           'region' : 'Busan, Korea', 

...           'phone' : '010-123-9876', 

...           'age' : 30}

>>> dict_1

{'name': 'Python Friend', 'region': 'Busan, Korea', 'phone': '010-123-9876', 'age': 30}

>>> dict_1.clear()

>>> dict_1

{}



# (4-3) Deleting entire dictionary using del statement

>>> dict_1 = {'name' : 'Python Friend', 

...           'region' : 'Busan, Korea', 

...           'phone' : '010-123-9876', 

...           'age' : 30}

>>> dict_1

{'name': 'Python Friend', 'region': 'Busan, Korea', 'phone': '010-123-9876', 'age': 30}

>>> del dict_1

>>> dict_1

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

NameError: name 'dict_1' is not defined

 




  • 사전 자료형 키의 2가지 특징 (2 Properties of Dictionary Key)


 5. 사전의 키 당 1개의 값 할당, 만약 사전의 키 중복 시 마지막 키의 값으로 할당 

     (In case of duplicate key in Dictionary, the last Value is assigned to the Key)



# More than one entry per key not allowed

# If keys are duplicated, then the last Value of Key will be assigned

>>> dict_1 = {'name' : 'Python Friend'

...           'region' : 'Busan, Korea', 

...           'phone' : '010-123-9876', 

...           'age' : 30,

...           'name' : 'R Friend'}

>>> dict_1

{'name': 'R Friend', 'region': 'Busan, Korea', 'phone': '010-123-9876', 'age': 30}

>>> dict_1['name']

'R Friend'

 




 6. 사전의 키는 변경 불가 (Dictionary Keys must be immutable)

    : Strings, Numbers, Tuples 은 Key로 가능, Lists 는 Key로 불가


사전의 키는 변경 불가능해야 합니다. 따라서 문자열(Strings), 숫자(Numbers), 튜플(Tuples) 가 사전의 키(Dictionary Key)로 활용 가능하며, 리스트(List)는 사전의 키로 사용 불가능합니다.  만약 리스트( [obj1, obj2, ... ] )를 사전의 키로 사용하려고 입력하면 TypeError: unhashable type: 'list' 라는 에러 메시지가 발생합니다. 



# TypeError: unhashable type 'list'

>>> dict_1 = {['name'] : 'Python Friend', 

...           'region' : 'Busan, Korea', 

...           'phone' : '010-123-9876', 

...           'age' : 30}

Traceback (most recent call last):

  File "<stdin>", line 4, in <module>

TypeError: unhashable type: 'list'

 



다음번 포스팅에서는 파이썬 사전 자료형의 내장 함수와 메소드 (Python Dictionary built-in functions, methods)에 대해서 알아보겠습니다. 


많은 도움이 되었기를 바랍니다. 

이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. ^^



저작자 표시 비영리 변경 금지
신고
Posted by R Friend R_Friend

지난번 포스팅에서는 파이썬 자료형 중에서 튜플의 생성, 삭제, 인덱싱, 슬라이싱 및 기본 연산자들에 대해서 알아보았습니다. 


이번 포스팅에서는 파이썬 튜플의 내장 함수(Tuple Built-in Functions)와 메소드(Tuple Methods)에 대해서 알아보겠습니다. 


참고로, 튜플 내장함수는 리스트와 동일하며, 메소드는 리스트 대비 매우 적습니다. 왜냐하면 튜플(Tuple)은 개별 요소 변경이 불가능(Immutable) 하기 때문에 요소 추가, 튜플 확장, 요소 제거, 뒤집기, 정렬 등이 안되기 때문입니다. 


이번 포스팅은 매우 쉽기도 하려니와, 아주 짧게 간단하게 끝나겠네요. ^^



[ 파이썬 튜플의 내장 함수 및 메소드 (Python Tuple built-in functions and methods) ]





1. 파이썬 튜플의 내장 함수 (Python Tuple built-in functions)


 1-1. len(tuple) : 튜플의 전체 길이 (length)



# en() : Gives the total length of the tuple

>>> len((1, 2, 3))

3

 




 1-2. max(tuple) : 튜플 안에 있는 요소값 중 최대값 반환 (문자는 알파벳 기준)



# max(): Returns item from the tuple with max value

>>> len((1, 2, 3))

3

>>> max((1, 2, 3, 4, 5))

5

>>> max(('a', 'b', 'c', 'd', 'e')) # As for character, in order of alphabet

'e'

 



튜플 안의 요소값들이 문자열과 숫자가 섞여 있을 경우 max() 메소드를 적용하면 TypeError 가 발생합니다. 



# TypeError for max() method when 'str' and 'int' are mixed in a tuple

>>> max((1, 2, 3, 'a', 'b', 'c'))

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: '>' not supported between instances of 'str' and 'int'

 




 1-3. min(tuple) : 튜플 안에 있는 요소값 중 최소값 반환 (문자는 알파벳 기준)


 

# min() : Returns item from the tuple with min value

>>> min((1, 2, 3, 4, 5))

1

>>> min(('a', 'b', 'c', 'd', 'e'))

'a'





 1-4. tuple(seq) : 리스트를 튜플로 변환 (converting a list into tuple)



# tuple(seq) : Converts a list to tuple

>>> my_list = [1, 2, 'a', 'b']

>>> type(my_list)

<class 'list'>

>>> 

>>> my_tup = tuple(my_list)

my_tup

>>> (1, 2, 'a', 'b')

>>> type(my_tup)

<class 'tuple'>

 





2. 파이썬 튜플의 메소드 (Python Tuple methods)


 2-1. tuple.count() : 튜플 내 요소의 개수 세기


 

# tuple.count(obj.) : Returns the total number of obj. in tuple

>>> tup = (1, 2, 3, 4, 5, 2, 2)

>>> tup.count(2)

3





 2-2. tuple.index(obj.) : 튜플 내 요소가 있는 위치 index 반환


만약 똑같은 값이 2개 이상 들어있는 경우 처음 요소 값이 나타나는 위치의 index 를 반환합니다. 



# tuple.index(obj.) : Returns the index of a obj. in tuple

>>> tup = (1, 2, 3, 4, 5, 2, 2)

>>> tup.index(2)

1

 



다음번 포스팅에서는 사전(Dictionary) 자료형의 기본 활용 및 특징에 대해서 알아보겠습니다. 


많은 도움이 되었기를 바랍니다. 

이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. ^^



저작자 표시 비영리 변경 금지
신고
Posted by R Friend R_Friend