'rjava'에 해당하는 글 3건

R Oracle Connection

R 2014.02.24 13:13

지난번 R DB Connection 글에서 R에서 RDBMS에 Connection하는 방법을 알아보았다.

지난 글에서는 MySQL를 접속했었는데 Oracle접속하는 방법도 간단하다.


ojdbc.jar파일을 다운로드 받은 후 특정폴더에 복사한다.

여기서는 지난 MySQL과 마찬가지로 /usr/share/java 폴더로 복사였다.


Oracle connection 소스는 아래와 같다. 자세한 사항은 지난 R DB Connection을 참고하기 바란다.

library(DBI)
library(RJDBC)
library(rJava)
drv<-JDBC("oracle.jdbc.driver.OracleDriver", "/usr/share/java/ojdbc14.jar")
conn<-dbConnect(drv, "jdbc:oracle:thin:@//<db_ip>:<port>/<sid>","<id>","<pw>")
query = "SELECT * FROM TABLES"
dbGetQuery(conn, query)

실제 소스 실행화면


저작자 표시
신고

'R' 카테고리의 다른 글

R on Hadoop and Amazon EMR  (0) 2014.08.19
R Oracle Connection  (4) 2014.02.24
R svn commit history 시각화  (0) 2014.02.21
R boxplot을 이용한 출근시간 분석 및 시각화  (0) 2014.02.19

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글  4개가 달렸습니다.
  1. 안녕하세요 컴퓨터공학과 4학년입니다. 현재 R과 하둡을 이용하여 빅데이터를 분석후 워드클라우드 같은 것을 웹에 JSP를 이용하여 뿌려 주려하는데요
    혹시 확장자 .R 소스(라이브러리 등등)을 .java에서 가져오게 하려면 어떻게 해야하나요? JRI 이용한 지금까지의 소스를 볼수 있을지 해서 올려봅니다. 즐거운 하루 되세요!
    • R과 Java간의 인터페이스는 Java Runtime Interface를 이용하여 가능합니다.
      http://using.tistory.com/55 여기를 참고해주세요
  2. 안녕하세요 질문이 있어서 연락드립니다.
    drv<-JDBC("oracle.jdbc.driver.OracleDriver", "/usr/share/java/ojdbc14.jar")

    여기서 classPath 잡는 부분이 잘 안되서요.
    ojdbc14.jar를 기존 client 설치되어 있는 곳으로 연결하려고 하거든요.
    classpath를 정확히 어떻게 잡아줘야 class가 로드될지 알고 싶습니다.

    windows7 이고요.. 로컬 환경변수 설정해서 연결해도 잘 안되네요..

    그럼, 수고하세요
    • 우선 작성해주신 내용만으로는 파악이 어렵네요 ^^;

      단순 클래스패스 설정 문제라면 검색하면 많이 나옵니다.
secret

R에서 제공하는 DataSet을 이용하여 JSON형태로 변환해보자.


R에는 다양한 DataSet(data.frame 형태)이 내장되어있다.

DataSet 목록은 아래의 명령어로 확인 가능하다.


> library(help=datasets)


iris DataSet의 일부를 head 메소드로 확인해보면 아래와 같다.

> head(iris) Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa 3 4.7 3.2 1.3 0.2 setosa 4 4.6 3.1 1.5 0.2 setosa 5 5.0 3.6 1.4 0.2 setosa 6 5.4 3.9 1.7 0.4 setosa


여러 DataSet중에서 위 명령어에서 확인한 iris DataSet을 JSON 데이터로 변환하는 작업은 R 언어 익숙하지 않다면 쉽지 않은 작업이다. 역시나 R 라이브러리 중 RJSONIO가 존재 한다. 해당 RJSONIO로 변환해보면 아래와 같다.


RJSONIO를 사용하겠다고 선언한다.

> library(RJSONIO)


toJSON 메소드에 변환될 iris DataSet을 넘겨주면 된다.

> toJSON(iris)


변환된 결과값은 아래와 같다.

{ "Sepal.Length": [ 5.1, 4.9, 4.7, 4.6, ...생략... 5.9 ],

"Sepal.Width": [ 3.5, 3, 3.2, 3.1, 3.6, ...생략... 3 ],

"Petal.Length": [ 1.4, 1.4, 1.3, 1.5, 1.4,  ...생략... 5.1 ],

"Petal.Width": [ 0.2, 0.2, 0.2, 0.2, 0.2, 0.4,  ...생략... 1.8 ],

"Species": [ "setosa", "setosa", "setosa", "setosa", ...생략... "virginica" ] }


물론 위 결과값은 문제가 없다. 하지만 내가 사용하고자 하는 JSON 구조와는 맞지 않다.

아래와 같은 결과물이 나오길 바랬다.

{"Sepal.Length":5.1,"Sepal.Width":3.5,"Petal.Length":1.4,"Petal.Width":0.2,"Species":"setosa"}


그래서 어찌어찌 JRI(rJava)에서 문자열을 받아서 simple.JSONObject로 꾸역꾸역 만들어는 냈으나.. 왠지 지저분한 느낌이 들었다.(해당 소스는 너무 지저분해서 생략....)


결국 R에서 직접 DataSet을 JSON으로 변환해주는 방법을 찾아보았으나... 검색을 해봐도... 죄다 영어고.. 자료도 없고 그렇다고 R 코딩을 할 수 도 없고 좌절하고 있었으나... 우연히 정말 우연히도 방법을 찾게 되었다.

(해당 변환함수의 출처를 잃어버렸음... @.@;;)


변환용 함수

> toJSONarray <- function(f){ + clnms <- colnames(f) + + name.value <- function(i){ + quote <- ''; + if(class(f[, i])!='numeric'){ + quote <- '"'; + } + + paste('"', i, '" : ', quote, f[,i], quote, sep='') + } + + objs <- apply(sapply(clnms, name.value), 1, function(x){paste(x, collapse=', ')}) + objs <- paste('{', objs, '}') + + res <- paste('[', paste(objs, collapse=', '), ']') + + return(res) + }


해당함수 실행

> toJSONarray(iris);


실행결과

[1] "[ { \"Sepal.Length\" : 5.1, \"Sepal.Width\" : 3.5, \"Petal.Length\" : 1.4, \"Petal.Width\" : 0.2, \"Species\" : \"setosa\" }, { \"Sepal.Length\" : 4.9, \"Sepal.Width\" : 3, \"Petal.Length\" : 1.4, \"Petal.Width\" : 0.2, \"Species\" : \"setosa\" }, ..생략..


대다나다.. 이로써 무식한 변환소스는 쓰레기통으로...


JRI을 이용하여 연계한 모습(rJava 소스는 생략...)


저작자 표시
신고

'R' 카테고리의 다른 글

R을 이용한 중심극한정리  (3) 2013.08.02
rChart  (0) 2013.06.13
[JRI] R Parsing data.frame to JSON  (1) 2013.06.11
JRI Java R Interface  (12) 2013.05.23

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글 하나 달렸습니다.
  1. 혹시 json으로 R에서 보내고 java에서 받을때 어떻게 받는지 알 수 있을까요?
secret

JRI Java R Interface

R 2013.05.23 17:09

1. R 이란


R 프로그래밍 언어(줄여서 R)는 통계 계산과 그래픽을 위한 프로그래밍 언어이자 소프트웨어 환경이다. 뉴질랜드 오클랜드 대학의 로스 이하카와 로버트 젠틀맨에 의해 시작되어 현재는 R 코어 팀이 개발하고 있다. R은 GPL 하에 배포되는 S 프로그래밍 언어의 구현으로 GNU S라고도 한다. R은 통계 소프트웨어 개발과 자료 분석에 널리 사용되고 있으며, 패키지 개발이 용이하여 통계학자들 사이에서 통계 소프트웨어 개발에 많이 쓰이고 있다.(위키백과 발췌)


2. R 설치 및 환경 세팅


2.1 R 설치

R은 공개 소프트웨어로 http://www.r-project.org/ 에서 다운로드 받아 설치가 가능하다.

Ubuntu 사용하고 있다면 apt-get으로 아래와 같이 설치하면 된다.


y2kpooh@pooh:~$ sudo apt - get install r - base


설치 후 터미널 창에서 R 명령어를 이용하면 R Console창으로 실행가능하다.

y2kpooh@pooh:~$ R


R version 2.15.1 (2012-06-22) -- "Roasted Marshmallows"

Copyright (C) 2012 The R Foundation for Statistical Computing

ISBN 3-900051-07-0

Platform: x86_64-pc-linux-gnu (64-bit)


R은 자유 소프트웨어이며 완전하게 무보증입니다.

일정한 조건에 따라 자유롭게 이것을 재배포 할 수 있습니다.

배포조건에 대한 상세설명은 'license()' 혹은 'licence()' 라고 입력해주세요


R는 많은 기여자들에 의한 공동프로젝트입니다.

더 자세한것에 대해서는 'contributors()'라고 입력해 주십시오.

또한, R 혹은 R 패키지를 인용하는 형식에 대해서는 알고싶으시다면 'citation()'라고  입력해주십시오


'demo()' 라고 입력하면, 몇가지 데모를 볼 수 있고, 'help()' 를 입력하게 되면 온라인 도움말을 볼 수 있습니다.

'help.start()' 를 입력하면 HTML 브라우저에 의한 도움말이 보여집니다.

'q()'라고 입력하면 R를 종료합니다


>


간략한 R 명령어 사용 예

(R언어의 대하여 자세한게 알고 싶다면 R을 이용한 데이터 분석 실무 참조 )

> print("Hello R")

[1] "Hello R"

> 1:10

[1]  1  2  3  4  5  6  7  8  9 10


2.2 rJava

Java와 R간의 인터페이스를 위하여 JRI(이하 rJava)를 설치한다.


2.2.1 rJava 란

JRI는 단일 스레드로 Java 애플리케이션에서 R을 실행할 수있는 Java / R 인터페이스다. 기본적으로 Java에 R 동적 라이브러리를 로드하고 R 기능에 Java API를 제공합니다. R의 기능과 전체 실행 REPL에 대한 간단한 호출을 모두 지원한다.

(http://www.rforge.net/JRI/)


2.2.2 rJava 설치

rJava 설치

y2kpooh@pooh:~$ aptitude install r-cran-rjava

환경변수 세팅

y2kpooh@pooh:~$ export R_HOME=/usr/lib/R

y2kpooh@pooh:~$ export CLASSPATH=.:/usr/lib/R/site-library/rJava/jri/

y2kpooh@pooh:~$ export LD_LIBRARY_PATH=/usr/lib/R/site-library/rJava/jri/


2.3 Eclipse 세팅


2.3.1 Java Application 빌드세팅

VM arguments : -Djava.library.path=/usr/lib/R/site-library/rJava/jri/ 추가


Environment R_HOME 추가


2.3.2 Maven 빌드세팅

VM arguments : -Djava.library.path=/usr/lib/R/site-library/rJava/jri/ 추가

Environment R_HOME 추가


2.3.3 JRI dependency 추가

<dependency>

<groupId>org.nuiton.thirdparty</groupId>

<artifactId>JRI</artifactId>

<version>0.8-4</version>

</dependency>


위와 같이 세팅을 하게 되면 이제 이클립스에서 rJava를 이용하여 R을 실행할 수 있다.


3. rJava Coding

(http://www.rosuda.org/R/nightly/JavaDoc/)

rJava를 이용한 간략한 실행 클래스이다 해당 클래스 생성 후 Run As -> Java Application 실행하면

아래 Result console화면에서 실행된 데이터를 확인 할 수 있다.

Example.java

import org.rosuda.JRI.Rengine;

import org.rosuda.JRI.REXP;


public class Example {

    public static void main (String[] args)

    {

         System.out.println("Creating Rengine (with arguments)");

         String[] Rargs = {"--vanilla"};

         Rengine re = new Rengine(Rargs, false, null);

         System.out.println("Rengine created, waiting for R");


         if (!re.waitForR()) {

              System.out.println("Cannot load R");

return;

         }


         REXP rn = re.eval("rnorm(4)");

         double[] rnd = rn.asDoubleArray();


         for(int i=0; i<rnd.length; i++){

              System.out.print(rnd[i] + " ");

         }

         System.out.println();


         re.end();

         System.out.println("Bye.");

   }

}


Result console

Creating Rengine (with arguments)

Rengine created, waiting for R

-0.4895186412991081 0.9995073716724703 -1.3400294093157445 -1.6906407959968786

Bye.

저작자 표시
신고

'R' 카테고리의 다른 글

R을 이용한 중심극한정리  (3) 2013.08.02
rChart  (0) 2013.06.13
[JRI] R Parsing data.frame to JSON  (1) 2013.06.11
JRI Java R Interface  (12) 2013.05.23

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글  12개가 달렸습니다.
  1. 안녕하세요 빅데이터를 공부하는 학생입니다.
    하둡을 이용하여 Map/Reduce한 결과를 R이 처리하도록 하고 싶은데,
    지금 현재는 RHive를 이용하여 쿼리를 하나씩 입력하여 R의 처리결과를 받고 있습니다.
    JRI를 어떻게 이용하면 가능할까요?
    • JRI도 결국 Java Runtime Interface를 통해 R을 실행시켜주는 기능을 합니다. JRI를 통해서 Java 객체를 R에서 사용하지는 못합니다.
      Map/Reduce로 결과물을 파일로 쓰고 R에서 해당 파일을 Read하는 형태면 가능할 것 같습니다.
  2. Map/Reduce로 결과물을 파일로 쓰고 R에서 해당 파일을 Read하는 형태로 진행하려고 하는데 어떻게 하면 가능할까요..??
    • JRI환경세팅을 우선 하시구요.
      Map/Reduce에서 job Class에서 waitforcompletion가 true일때
      R코드를 실행시키시면 될 것 같습니다.
      Map/Reduce에서 complete event 찾아보시면 되겠네요. ^^

      참고로 JRI보다는 rApache를 이용하시는 방법을 추천 드립니다.
      방법은 동일하겠네요~
  3. 안녕하세요, 일자가 꽤 지난 포스팅이지만 혹시나 싶어 질문드립니다.

    웹 로그 분석을 위해 rJava를 적용하고 있는데요,
    rJava에서 REngine.assign() 또는 Rengine.rniPutString()으로 값을 넘겨줄 때
    한글이 자꾸 깨져서 들어가 어려움을 겪고 있습니다.

    혹시 이와 같은 문제를 겪어보셨는지, 해결책이 있다면 공유 좀 부탁드립니다.^^;
    • 안녕하세요.
      REngine으로 R스크립트를 실행할때 한글이 포함되면
      R으로 넘겨진 R스크립트가 한글이 깨진체로 실행이 된다는 말씀이신가요?
  4. 지금 rJava에서 R로 넘어가는 과정에서 한글이 깨지는 것인지
    R에서 처리해주고 결과값을 넘겨받는 과정에서 한글이 깨지는것인지 확실히 모르겠어요.

    디버깅을 위해서라도 둘 중 어느 쪽인지 알아보려고 했는데
    제가 R을 이번에 처음 만져봐서, rJava에서는 명령어 호출만 하고 순수하게 R에서만 인풋을 넣어서 결과를 확인할 수 있는 방법을 못찾고있습니다.ㅜㅜ
    (예 : rJava에서 R코드로 파일에 한글문자열을 입력 후 저장하려고 했으나, 실패)

    인코딩이 문제인가 싶어서 확인해봤지만 크게 도움은 안됐었구요.
    • 그렇다면 rJava로 물려있는 R세션상에서 실행 history를 추출해서 R스크립트가 어떻게 실행되었는지 보시는 방법도 있겠네요
  5. Spring Framework환경에서 개발하고 있습니다.
    이클립스에서 환경설정하고 Server구동 후 웹을 화면에 띄우면 처음 한번은 예제대로 프로그램이 잘 실행이 되는데 두번째에는 Creating Rengine (with arguments) 부분에서 멈춰 버립니다.
    구글링하다보니 Native 환경변수라 안된다는 글이 있어서 System 환경변수로 바꿔서 해도
    같은 증상이었습니다.
    혹시 다른 해결책이 있을까요?
    • 안녕하세요.
      제가 시간이 좀 지나서 기억이 가물가물한데요..^^

      아마도 r입문자님께서 작성하신 코드에 R실행 Rengine객체를 R Script실행 시 마다 호출하셨을거라 예상되는데요
      해당 객체는 was(server)가 초기 실행 시에 해당 객체를 전역적으로 생성 후 R Script실행 시에 해당 객체를 재사용하는 방향으로 처리하셔야 됩니다.
  6. 다시 올립니다...^^;
    자바에서 Rengine으로 R 스크립트를 실행해 보고 있는데요...

    예를들어 arules 패키지에 있는 crossTable 함수를 사용하는 부분이 자바에서 실행이 안 되서요...
    jar 파일 지원도 없는 이런 패키지 함수들은 어떻게 해결해야 하나요?
    (ren.eval("wordtable <- crossTable(wordtran)"); //R-Studio에서는 실행되는데 자바에서는 null 값만 나옵니다;;;)
    • Rengine도 결국 R을 java에서 실행시켜주는 환경입니다.
      R-base기본 패키지가 아닌 외부 라이브러리 일 경우 library()함수를 이용하여 해당 라이브러리를 로드시켜야 합니다.
secret