1. 程式人生 > >R で Amazon Athena を活用する

R で Amazon Athena を活用する

データサイエンティストはしばしば、R から SQL クエリを投げるときに、その裡側のビッグデータ基盤のインフラ管理を気に掛けなければなりません。Amazon Athena はインフラ管理の必要がなく、標準 SQL で簡単に S3 上のデータを直接分析できる、インタラクティブクエリサービスです。R と Amazon Athena の連攜によって、データサイエンティストはインタラクティブな分析ソリューションのための、強力なプラットフォームを手に入れることができます。

このブログポストでは、Amazon EC2 インスタンス上で動作する R/RStudio から Athena に接続します。

事前準備

Athena との連攜を開始する前に、以下のステップを完了してください。

  1. AWS アカウントの管理者に依頼して、Athena にアクセスするのに必要な権限を、Amazon の Identity and Access Management (IAM) コンソール経由で、自身の AWS アカウントに付與してもらってください。具體的には、IAM にあるデータサイエンティストのユーザーグループに対して、関連する Athena のポリシーをアタッチしますRAthena_1
  2. Amazon S3 バケットに、ステージングディレクトリを作成してください。Athena はクエリする対象のデータセットと、クエリ結果を置く場所として、このバケットを利用します。このポストでは、ステージングバケットを s3://athenauser-athena-r とします

注意: このブログポストでは、すべての AWS リソースは us-east-1 リージョンに作成します。ほかのリージョンでも Athena が利用可能かどうか、製品およびサービス一覧で確認してください。

EC2 上での R と RStudio の起動

  1. AWS上でRを実行する” のインストラクションにしたがって、EC2 インスタンス(t2.medium かそれ以上のサイズ)で Amazon Linux を動かし、R のセットアップを行います。始める前に、以下のステップを確認しておいてください
  2. このブログポストの “高度な詳細” の記述で、ステップ 3 まできたら、最新バージョンの RStudio をインストールするため、以下の bash スクリプトを実行してください。必要であれば、RStudion のパスワードも修正してください
#!/bin/bash
#install R
yum install -y R
#install RStudio-Server
wget https://download2.rstudio.org/rstudio-server-rhel-1.0.136-x86_64.rpm
yum install -y --nogpgcheck rstudio-server-rhel-1.0.136-x86_64.rpm
#add user(s)
useradd rstudio
echo rstudio:rstudio | chpasswd

Java 8 のインストール

  1. EC2 instance に SSH でログインします
  2. 古いバージョンの Java を削除します
  3. Java 8 をインストールします。これは Athena を動かすために必要です
  4. コマンドライン上で、以下のコマンドを実行します
#install Java 8, select ‘y’ from options presented to proceed with installation
sudo yum install java-1.8.0-openjdk-devel
#remove version 7 of Java, select ‘y’ from options to proceed with removal
sudo yum remove java-1.7.0-openjdk
#configure java, choose 1 as your selection option for java 8 configuration
sudo /usr/sbin/alternatives --config java
#run command below to add Java support to R
sudo R CMD javareconf

#following libraries are required for the interactive application we build later
sudo yum install -y libpng-devel
sudo yum install -y libjpeg-turbo-devel

.Renviron のセットアップ

R の環境変數 .Renviron に対して、必要となる Athena のクレデンシャルを追加します。

  1. AWS 管理者から、必要なクレデンシャルを AWS_ACCESS_KEY_ID および AWS_SECRET_ACCESS_KEY の形式で取得します
  2. Linux のコマンドプロンプトから以下のコマンドを打ち込んで、vi エディタを立ち上げます
    sudo vim /home/rstudio/.Renviron
    
    Provide your Athena credentials in the following form into the editor:
    ATHENA_USER=< AWS_ACCESS_KEY_ID >
    ATHENA_PASSWORD=< AWS_SECRET_ACCESS_KEY>
  3. 編集結果をセーブして、エディタを終了します

RStudio にログイン

続いて、EC2 上の RStudio にログインします。

  1. EC2 のダッシュボードからインスタンスのパブリック IP アドレスを取得して、ブラウザのアドレス欄に貼り付け、後ろに :8787(RStudio のポート番號)を付けます
  2. EC2 インスタンスに関連付けられたセキュリティグループm設定で、アクセス元の IP アドレスから 8787 ポートへのアクセスが許可されていることを確認してください
  3. 先ほど設定したユーザ名とパスワードで、RStudio にログインします

R パッケージのインストール

続いて、必要な R パッケージをインストールして、ロードします。

#--following R packages are required for connecting R with Athena
install.packages("rJava")
install.packages("RJDBC")
library(rJava)
library(RJDBC)

#--following R packages are required for the interactive application we build later
#--steps below might take several minutes to complete
install.packages(c("plyr","dplyr","png","RgoogleMaps","ggmap"))
library(plyr)
library(dplyr)
library(png)
library(RgoogleMaps)
library(ggmap)

Athena への接続

以下の R のスクリプトで、Athena ドライバーのダウンロードと、コネクションの設定を行います。アクセスしたいリージョンの JDBC URL に接続してください。

#verify Athena credentials by inspecting results from command below
Sys.getenv()
#set up URL to download Athena JDBC driver
URL <- 'https://s3.amazonaws.com/athena-downloads/drivers/AthenaJDBC41-1.0.0.jar'
fil <- basename(URL)
#download the file into current working directory
if (!file.exists(fil)) download.file(URL, fil)
#verify that the file has been downloaded successfully
fil
#set up driver connection to JDBC
drv <- JDBC(driverClass="com.amazonaws.athena.jdbc.AthenaDriver", fil, identifier.quote="'")
#connect to Athena using the driver, S3 working directory and credentials for Athena 
#replace ‘athenauser’ below with prefix you have set up for your S3 bucket
con <- jdbcConnection <- dbConnect(drv, 'jdbc:awsathena://athena.us-east-1.amazonaws.com:443/',
s3_staging_dir="s3://athenauser-athena-r",
user=Sys.getenv("ATHENA_USER"),
password=Sys.getenv("ATHENA_PASSWORD"))
#in case of error or warning from step above ensure rJava and RJDBC packages have #been loaded 
#also ensure you have Java 8 running and configured for R as outlined earlier

これで RStudio から Athena に接続する準備ができました。

サンプルクエリでテスト

# get a list of all tables currently in Athena 
dbListTables(con)
# run a sample query
dfelb=dbGetQuery(con, "SELECT * FROM sampledb.elb_logs limit 10")
head(dfelb,2)

RAthena_2

インタラクティブなユースケース

次に、分析と視覺化のために R から Athena に対してインタラクティブなクエリを行ってみましょう。S3 上にあるパブリックデータセットの GDELT を使います。

GDELT データセットに対して、R から Athena のテーブルを作成します。このステップは “Amazon Athena – Amazon S3上のデータに対話的にSQLクエリを” で紹介されているように、AWS のマネジメントコンソール上からも実行することができます。

#---sql  create table statement in Athena
dbSendQuery(con, 
"
CREATE EXTERNAL TABLE IF NOT EXISTS sampledb.gdeltmaster (
GLOBALEVENTID BIGINT,
SQLDATE INT,
MonthYear INT,
Year INT,
FractionDate DOUBLE,
Actor1Code STRING,
Actor1Name STRING,
Actor1CountryCode STRING,
Actor1KnownGroupCode STRING,
Actor1EthnicCode STRING,
Actor1Religion1Code STRING,
Actor1Religion2Code STRING,
Actor1Type1Code STRING,
Actor1Type2Code STRING,
Actor1Type3Code STRING,
Actor2Code STRING,
Actor2Name STRING,
Actor2CountryCode STRING,
Actor2KnownGroupCode STRING,
Actor2EthnicCode STRING,
Actor2Religion1Code STRING,
Actor2Religion2Code STRING,
Actor2Type1Code STRING,
Actor2Type2Code STRING,
Actor2Type3Code STRING,
IsRootEvent INT,
EventCode STRING,
EventBaseCode STRING,
EventRootCode STRING,
QuadClass INT,
GoldsteinScale DOUBLE,
NumMentions INT,
NumSources INT,
NumArticles INT,
AvgTone DOUBLE,
Actor1Geo_Type INT,
Actor1Geo_FullName STRING,
Actor1Geo_CountryCode STRING,
Actor1Geo_ADM1Code STRING,
Actor1Geo_Lat FLOAT,
Actor1Geo_Long FLOAT,
Actor1Geo_FeatureID INT,
Actor2Geo_Type INT,
Actor2Geo_FullName STRING,
Actor2Geo_CountryCode STRING,
Actor2Geo_ADM1Code STRING,
Actor2Geo_Lat FLOAT,
Actor2Geo_Long FLOAT,
Actor2Geo_FeatureID INT,
ActionGeo_Type INT,
ActionGeo_FullName STRING,
ActionGeo_CountryCode STRING,
ActionGeo_ADM1Code STRING,
ActionGeo_Lat FLOAT,
ActionGeo_Long FLOAT,
ActionGeo_FeatureID INT,
DATEADDED INT,
SOURCEURL STRING )
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION 's3://support.elasticmapreduce/training/datasets/gdelt'
;
"
)

dbListTables(con)

上記のステートメントを実行すると、RStudio のコンソールに ‘gdeltmaster’ というテーブルが新しく作成されたのを確認できます。

RAthena_3

2015 年に US で開かれた CAMEO イベントの回數をカウントするクエリを、Athena テーブルに投げましょう。

#--get count of all CAMEO events that took place in US in year 2015 
#--save results in R dataframe
dfg<-dbGetQuery(con,"SELECT eventcode,count(*) as count
FROM sampledb.gdeltmaster
where year = 2015 and ActionGeo_CountryCode IN ('US')
group by eventcode
order by eventcode desc"
)
str(dfg)
head(dfg,2)

RAthena_4

#--get list of top 5 most frequently occurring events in US in 2015
dfs=head(arrange(dfg,desc(count)),5)
dfs

RAthena_5-300x140

上記の R の出力結果から、CAMEO イベントは 42 回という高頻度で行われたことがわかります。CAMEO のマニュアルから、このイベントの概要が “會議やその他のイベントのための、他の地域への出張” となります。

次に、この分析から得られる知見を使い、この特定のイベントに関連したすべての地域の座標リストを、Athena テーブルから取得します。

#--get a list of latitude and longitude associated with event “042” 
#--save results in R dataframe
dfgeo<-dbGetQuery(con,"SELECT actiongeo_lat,actiongeo_long
FROM sampledb.gdeltmaster
where year = 2015 and ActionGeo_CountryCode IN ('US')
and eventcode = '042'
"
)
#--duration of above query will depend on factors like size of chosen EC2 instance
#--now rename columns in dataframe for brevity
names(dfgeo)[names(dfgeo)=="actiongeo_lat"]="lat"
names(dfgeo)[names(dfgeo)=="actiongeo_long"]="long"
names(dfgeo)
#let us inspect this R dataframe
str(dfgeo)
head(dfgeo,5)

RAthena_6

続いて、アメリカ合眾國の地図を生成します。

#--generate map for the US using the ggmap package
map=qmap('USA',zoom=3)
map

RAthena_7

これで、Athena テーブルから得られた地理データが、地図上にプロットされました。これにより、2015 年に US でひらかれたすべての當該イベントについて、開催場所を視覺化することができました

#--plot our geo-coordinates on the US map
map + geom_point(data = dfgeo, aes(x = dfgeo$long, y = dfgeo$lat), color="blue", size=0.5, alpha=0.5)

RAthena_8

結果を視覺化することによって、あるイベントの開催場所が US の北東部に極めて集中していることを把握できました。

結論

この記事では Athena と R を使って、簡単なインタラクティブアプリケーションを構築する方法を説明しました。Athena は標準 SQL を用いて、ビッグデータを儲存し、それに対してクエリをかけるのに使うことができます。またその一方で、R の持つ強力なライブラリ群を活用することで、Athena に対してインタラクティブにクエリを投げ、分析のインサイトを得ることができます。

質問やアドバイスなどがありましたら、コメント欄にフィードバックをお願いします。

相關推薦

RAmazon Athenaする

データサイエンティストはしばしば、R から SQL クエリを投げるときに、その裡側のビッグデータ基盤のインフラ管理を気に掛けなければなりません。Amazon Athena はインフラ管理の必要がなく、標準 SQL で簡単に S3 上のデータを直接分析できる、インタラクティブクエリサービスです

AWS 匯入事例:グリー株式會社における Amazon DynamoDB 事例

グリー株式會社では、DynamoDB とそれに基づいたオートセーブ機構の構築によって、実際にすべての課題が高いレベルで解決されています。『アナザーエデン』は 2 年半弱というモバイルソーシャルゲームとしては比較的長い開発期間を経たプロジェクトですが、このうちの 2 年程度を、実際に D

AWS 匯入事例:株式會社ドワンゴによる Amazon Aurora 事例

2015 年 9 月頃から Amazon Aurora の検討を開始し、2 ヶ月ほどの時間をかけて本番と同じデータを利用した可用性と效能の検証が行われました。「検証の結果、これまで通りかそれ以上の效能が発揮できることが確認できました」(ウィリアムズ氏) その結果を

Running R on Amazon Athena

Data scientists are often concerned about managing the infrastructure behind big data platforms while running SQL on R. Amazon Athena is

TOJ4114(樹狀數組)

namespace return 統計 關系 max 按位計算 處理 們的 保存 TOJ指天津大學onlinejudge 題意:給你由N個數組成的數列,算出它們的所有連續和的異或和,比如:數列{1,2},則answer = 1 ^ 2 ^ (1 + 2) = 0。 這道題有

css,半星星的效果

span face spl pan white pla java light line 1、首先下載要用到星星字體 http://www.w3cplus.com/w3cplusDemo/demos/webFontIcon.html 2、css .cleanfloa

【前端閱讀】——《PHP、MySQL建構Web世界》摘記之設計技巧

簡化 return 下載 center src rto 響應 server pty 二、設計技巧 Programming的習慣因人而異,這裏只提供一些經驗,可以參考。 1、利用Include模塊化你的程序代碼 Include函數基本上說:就像是把另一個文件(HTM

零元學Expression Blend 4 - Chapter 26 教你如何使用RaidoButton以及布局容器的

off user scrollbar display back 找到 rect alt 新的 原文:零元學Expression Blend 4 - Chapter 26 教你如何使用RaidoButton以及布局容器的活用

Linux後臺有個systemd-r進程,占5355等端口

log class resolv div vim 配置文件 etc 配置 emc 編輯配置文件 vim /etc/systemd/resolved.conf 設置LLMNR=0 重啟服務: systemctl restart systemd-resolved.servic

LINQ to SQL(1):這要打破舊觀念

部分 res htm aac created 名稱 chang list utf 程序架構 如今比較經典的架構,看看以下圖片。 怎樣實現 在一個N層應用

JVM——Jvm內存結構

out 棧幀 連續 垃圾 VM 似的 pro 分配內存 java內存 Java內存結構:    JVM內存結構主要是有三大塊:堆內存、方法區和棧。堆內存是JVM中最大的一塊由年輕代和老年代組成,而年輕代內存又被分為三部分,Eden空間、From Survivor空間、To

JVM——類加載機制

java模塊化 throw framework 本地文件 dcl 也會 javac 限定 java 類的實例化過程 有父類的情況 1. 加載父類靜態 1.1 為靜態屬性分配存儲空間並賦初始值 1.2 執行靜態初始化塊和靜態初始化語句(從上至下)2. 加載

變量字符串${var%%.*}

活用變量字符串${var%%.*}很多時候在使用Linux的shell時,我們都需要對文件名或目錄名進行處理,通常的操作是由路徑中提取出文件名,從路徑中提取出目錄名,提取文件後綴名等等。例如,從路徑/dir1/dir2/file.txt中提取也文件名file.txt,提取出目錄/dir1/dir2,提取出文件

利用郵件激

view ger onf imp 客戶 quest 自定義 信息 confirm 一、安裝itsdangerous模塊 利用只有你自己知道的秘鑰來加密你的數據,然後把加密了的數據發給別人,取回數據時再利用已知的秘鑰來解密數據 pip install itsdangerou

零元學Expression Design 4 - Chapter 3 看小光被包圍了!!如何「Text On Path」設計效果

expr 彎曲 圖形 borde 快捷 att 簡單的 efault object 原文:零元學Expression Design 4 - Chapter 3 看小光被包圍了!!如何活用「Text On Path」設計效果

clone和trigger函式,點選按鈕原有事件不觸發,之後再觸發原有事件

活用clone和trigger函式,點選按鈕原有事件不觸發,之後再觸發原有事件 需求: 網站開發完畢了,然後產品說要在原來的’確認按鈕’點選後加一個’彈窗’提醒使用者一些注意事項,在使用者點選彈窗裡面的’同意按鈕’後再執行原來’確認按鈕’ 裡面繫結的事件。需求看起來很簡單,但是有一個要

歸併法的另類

歸併排序是OI中的一種常用方法,因為它藉助了對於兩個有序佇列,合併成一個有序佇列,只需要看隊頭,並以此達到O(n)的合併複雜度,至於分治只是活用它的一種方式罷了。 但是看隊頭的思想並不只侷限於佇列。 比如說醜數這個經典題: 對於一給定的素數集合 S = {p1, p2, …,

HDU1160 胖老鼠的速度 dp lis的,玄學改bug

題意大致就是:求出一個最長的重量遞增,速度遞減的序列,並記錄路徑,這道題本身並不難,只是lis的活用,難的是調bug!!!!,我改了兩天,怎末改都是WA,直到剛剛,我從g++換成了c++,就ac了,哭。 程式碼: #include<iostream> #include<

PTA遞推類 1093 Count PAT's (25 分),1101 Quick Sort (25 分)

思路 對於一類涉及序列的問題, 假如序列中每一位的值都可以通過“左右關係”計算得到,可以考慮所謂的“左右兩側的結果”是否可以通過遞推的預處理來得到,後面的計算就不用反覆求解。 ——演算法筆記 A1093 處理的是PAT三個字母之間的前後關係, 計數只與‘A’左右

小程式導航元件navigator

小程式開發中必不可少的元件navigator,雖然使用頻率非常高,但是卻沒多少人能靈活運用。 先說navigator元件的用處: 它的主要用處是跳轉執行,跳轉可分為當前頁面內跳轉、前往頁面外部的跳轉。