実行サンプル(Scala)
2. データ処理の詳細 2-2.アドホック分析(エンジニア利用)
> spark-shell
// ケースクラス定義
case class Login(user_id: Int, regist_dt: String, level: Int)
case class Sales(user_id: Int, item_id: Int, price: Int, regist_dt: String)
// データ取り込み(RDD)
val loginRDD = sc.textFile("s3://xxxxxxxxx/xxx/xxx/login/201601/*")
val salesRDD = sc.textFile("s3://xxxxxxxxx/xxx/xxx/sales/*")
// データフレーム作成
val loginDF = loginRDD.map{ data =>
val tmpData = data.split("¥t")
val user_id = tmpData(0).toInt
val regist_dt = tmpData(1)
val level = tmpData(4).toInt
Login(user_id, regist_dt, level)
}.toDF
val salesDF = salesRDD.map{ data =>
val tmpData = data.split("¥t")
val user_id = tmpData(0).toInt
val item_id = tmpData(1).toInt
val price = tmpData(2).toInt
val regist_dt = tmpData(4)
Sales(user_id, item_id, price , regist_dt)
}.toDF
// テーブル登録
loginDF.registerTempTable("login_table")
salesDF.registerTempTable("sales_table")
// クエリ発行
val resultQuery = sqlContext.sql(s"""
SELECT login.user_id,SUM(sales.price)
FROM login_table login JOIN sales_table sales ON (login.user_id = sales.user_id)
WHERE login.regist_dt LIKE '2016-01-01%'
AND login.level = 100
AND sales.regist_dt LIKE '2015-12%'
GROUP BY login.user_id
""")
// 結果表示
resultQuery.show
読み込むデータのcaseクラスを定義
S3からデータを取り込みRDDを生成
RDDからDataFrameを生成
DataFrameを一時テーブルに登録
sqlメソッド(Spark SQL)でクエリを発行
結果を表示
2016/1/1にログインしたレベル100のユーザが2015/12に購入した金額の集計
実行サンプル(BigQuery)
2. データ処理の詳細 2-3.アドホック分析(アナリスト利用)
SELECT
a.user_id,
SUM(b.price)
FROM
TABLE_QUERY(login,'REGEXP_MATCH(table_id, r"^aaa_20160101")') a
JOIN EACH
TABLE_QUERY(sales,'REGEXP_MATCH(table_id, r"^aaa_201512")') b
ON
a.user_id = b.user_id
GROUP EACH BY
a.user_id;
• 日付分割されたテーブルを正規表現で必要な単位に連結
⇒BiqQueryは従量課金のため無駄なデータ走査を発生させない
[ポイント]
2016/1/1にログインしたユーザが2015/12に購入した金額の集計