データの受け渡しにS3を使う。2019-09-09


概要

世はまさに大データ時代です。
社内で分析している場合もありますが、外注して分析をしてもらっている場合もあります。
外注している場合はデータの受け渡しが発生します。
メール添付で送ったり、何か媒体に記録して送ったり、便利なクラウドサービスを利用したり、いろいろ手段はあります。

今回は「データを受け取って分析をする側」にたって、データの受け渡しにS3を使うといろいろ便利かもしれない点について書きます。

前提・準備

状況整理

  • 発注者、データを分析して欲しい人、データを準備する人、データを送る人
  • 受注者、データを分析する人、データを授受する場を用意する人、データを受け取る人、すでにAWS利用中

ポイント: 「受注者」が "データを授受する場を用意する" ケースです
(「発注者」が「受注者」が用意したS3にデータを置きます)

S3の準備

良い感じに特定のBucketだけ見られるようなポリシーを作ります。
「発注者」からは受け渡しに使うBucketのみ見える状態です。

設定内容の詳細は割愛(画面からぽちぽちでも簡単に設定できるし、awsコマンドを使っても簡単にできるし、ググればやり方はたくさん見つかると思う!)

授受するデータ

例えば、 あるユーザの利用金額のデータの授受をすこぶるシンプルに考えます。
ファイルの形式は CSVgzipで圧縮 されています。
ユーザID,利用金額
という内容です。具体的には以下の内容で、

% gzcat test_data.csv.gz | head
g,55777
n,14623
l,65655
t,92348
a,87128
m,74247
j,55425
j,44207
z,67019
j,5178

サイズもそこそこあります。

% file test_data.csv.gz
test_data.csv.gz: gzip compressed data, was "test_data.csv", last modified: Mon Sep  9 07:56:49 2019, from Unix, original size 788893425
% gzcat test_data.csv.gz | wc -l
 100000000

便利かもしれないポイント

すでにAWSを使っている場合、IAMをよしなにつかするだけでよい

すでにAWSを使っている場合、IAMをよしなにつかするだけでよいので楽

データの事前処理にAthenaを支えて便利、になるかも

例)不要なデータを抜く

例えば「1円のデータはテストデータだから分析対象には含めないでください」という指示が「発注者」からきた場合を考えます。
(結果の見やすさを考えて1円のデータが何件あるか数えます)

そこで登場 Athena 先生

便利ポイント

  • Athena先生がよしなにS3上にあるファイルを読んでくれる
  • Athena先生がよしなにCSVをパースしてくれる
  • Athena先生がよしなにgzip圧縮されているファイルを解凍してくれる
  • Athena先生のSQLパワーでよしなに集計などが行える

上記の通りの便利ポイントがあります。
「発注者」にS3にファイルを置いてもらったら、「受注者」側では

  1. Athenaでcreate tableする
  2. Athenaでselectする

の2ステップで良い感じにデータの前処理ができます。

1. Athenaでcreate tableする
CREATE EXTERNAL TABLE `test_tb`(
  `id` string, 
  `amount` int)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY ',' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
LOCATION
  's3://バケット名/'
2. Athenaでselectする

1円データを抜く

SELECT count(amount)
FROM test_tb
WHERE amount = 1 

(Run time: 30.85 seconds, Data scanned: 353.52 MB)

_col0
1 954

集計例
idごとに集計してみたりも容易

SELECT
  id,
  count(amount)
FROM test_tb
WHERE amount = 1
GROUP BY  id

(Run time: 30.81 seconds, Data scanned: 353.52 MB)

id _col0
1 w 27
2 u 34
3 b 29
4 l 23
5 m 41
. .

その他のやり方も考える

コマンドで抜く
% time (gzcat test_data.csv.gz | egrep ',1$' | wc -l)
     954
( gzcat test_data.csv.gz | egrep ',1$' | wc -l; )  32.62s user 0.43s system 111% cpu 29.753 total

1円のデータを抜くだけの一例。
不要なデータを抜くだけならコマンドでも十分かもしれないが、もう少しカラムの多いCSVや、もう少し難しい条件の場合は大変そう。

RDBを使う

割愛。たぶん S3 + Athena よりはいろいろ準備が必要なはず。
RDBを使う場合もAthenaである程度加工したデータをinsertした方が良いのではなかろうか。

まとめ

データの受け渡しにS3を使うと、

  • すでにAWSを使っている場合、IAMをよしなにつかするだけでよい
  • データの事前処理にAthenaを支えて便利、になるかも

ということでS3を使ってみるというのはいかがでしょうか!