はじめに
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