LoginSignup
2
7

More than 3 years have passed since last update.

R(R studio)からAWSを利用

Last updated at Posted at 2020-03-16

はじめに

aws環境に建てられた分析環境(EC2,Redshit,S3等の鉄板構成)でデータ分析を行うとき、
なんらかのsqlクライアントでredshiftからデータ引っ張って、rやpythonでデータを弄り、webブラウザやcli等でs3にデータを置いて、、、などがよくある作業だと思います。
これらの作業をR studioやjupyter notebook 上でsdk用いてワンストップで実行したくなる時がありますが、
Rに関してググっても情報が少なかったり古かったりしたので、tipsとしてまとめます。
適宜更新予定。

S3

とりあえずパッケージ用意

install.packages("aws.s3", dependencies = TRUE)
library(aws.s3)

接続設定

やり方2だと以降のオブジェクト取得の関数などが動かず多く、
結局やり方1のように環境変数を設定しなければいけませんでした。
おそらく~/.aws/.credentialgにregion記載がないからなのですが、.configのほうを見に行く関数が見当たりません。。

# 1.環境変数によって設定
Sys.setenv(
    "AWS_DEFAULT_REGION" = "<REGION>",
    "AWS_ACCESS_KEY_ID" = "<ACCESS_KEY_ID>",
    "AWS_SECRET_ACCESS_KEY" = "<SECRET_ACCESS_KEY>"
)
# 上記は秘匿するために~/Documents/.Rprofile上に記載が推奨

# 2.aws cliで発行するconfigureのアカウント情報の利用
# defaultのアカウント情報を用いた署名
aws.signature::use_credentials()
# ユーザのアカウント情報を利用する場合
aws.signature::use_credentials(profile = "xxx")

バケット・オブジェクトの表示

# バケット一覧表示
aws.s3::bucketlist()
# バケットに含まれるオブジェクトの表示
aws.s3::get_bucket("bucket_name")

RとS3でのデータのやり取り

# R上のデータをバケットへ保存
mtcars
aws.s3::s3save(mtcars, bucket = "bucket_name", object = "/prefix/object")

# S3オブジェクトを取得しメモリへ読み込み
x <-aws.s3::get_object(bucket = "bucket_name", object = "/prefix/object")
load(rawConnection(x))
"mtcars" %in% ls()

# S3オブジェクトを取得し保存
y <- save_object(bucket = "bucket_name", object = "/prefix/object")
y %in% dir()

Redshift

当初JDBCで頑張ろうとしましたが、rjavaのexceptionが一生解決できず、psqlに逃げてきました。
とりあえずパッケージ用意

install.packages("RPostgreSQL")
library(RPostgreSQL)

接続設定

drv <- dbDriver("PostgreSQL")
con <-dbConnect(drv,host='host_url',port='5439',dbname='dbname',user='user_name',password='pass')

# 上記は接続上は~/Documents/.Rprofile上に以下のように記載してあれば
Sys.setenv(
    "AWS_REDSHIFT_HOST" = "<host_url>",
    "AWS_REDSHIFT_PORT" = "5439",
    "AWS_REDSHIFT_DB" = "<dbname>",
    "AWS_REDSHIFT_USER" = "<user_name>",
    "AWS_REDSHIFT_PASS" = "<pass>"
)
# 以下のように呼び出せる
con <-dbConnect(drv,host=Sys.getenv("AWS_REDSHIFT_HOST")
    ,port=Sys.getenv("AWS_REDSHIFT_PORT")
    ,dbname=Sys.getenv("AWS_REDSHIFT_DB")
    ,user=Sys.getenv("AWS_REDSHIFT_USER")
    ,password=Sys.getenv("AWS_REDSHIFT_PASS")
    )

テーブル一覧取得

dbListTables(con)

クエリ発行

rs <- dbSendQuery(con,"select * from table_name")
data <- dbFetch(rs)
dbClearResult(rs)

テキストファイルからクエリ発行

install.packages("magrittr")
library(magrittr)

scan_query <- function(query_path) {
    return (
        scan(query_path, what='', quote='', sep='\n', comment.char = '', encoding='UTF-8') %>% 
            gsub(pattern='--.*$', replacement='') %>% # 正規表現でコメントアウトを消す
            paste0(collapse=' ')
    )
}

# ファイルパスからSQLを読み込む
sql <- scan_query('./test.sql')

rs <- dbSendQuery(con,sql)
data <- dbFetch(rs)
class(dbFetch(rs))

エンコードの調整

rs <- dbSendQuery(con,sql)
data <- dbFetch(rs)
dbClearResult(rs)

# Redshiftから読み込んだutf8をWindows上のR環境で文字化けしないように調整
data_conv <- data.frame(lapply(data, iconv, from = "utf-8", to = "cp932"))

参考

https://kiito.hatenablog.com/entry/2016/04/25/211105
https://cran.r-project.org/web/packages/RPostgreSQL/RPostgreSQL.pdf
https://www.rdocumentation.org/packages/aws.s3/versions/0.2.1

2
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
7