SlideShare ist ein Scribd-Unternehmen logo
1 von 76
Downloaden Sie, um offline zu lesen
/ 76
ゼロから始めるSparkSQL徹底活用!
~Sparkのインストールから、 SparkSQLの概要紹介、
実務で活用するためのノウハウまでを紹介します~
ビッグデータ部 加嵜長門
2017年3月21日 【 ヒカ☆ラボ 】
/ 76
自己紹介
• 加嵜 長門(カサキ ナガト)
• 2014年4月~ DMM.comラボ
• Hadoop基盤構築・Sparkを用いたレコメンド開発
2
『詳解Apache Spark』(2016年4月29日)
8章 GraphXを担当
『ビッグデータ分析・活用のためのSQLレシピ』(2017年3月27日)
SQL全般、レコメンドなどを担当
/ 76
今日の発表予定
• ゼロから始めるSparkSQL徹底活用!
3
19:45 ~ 20:50 発表
Sparkの章 20分 + 質疑応答 5分
SQLの章 20分 + 質疑応答 5分
SparkSQLの章 15分
20:50 ~ 21:00 質疑応答・アンケート
21:00 ~ 21:30 懇親会(ドリンクとお菓子をご用意しています)
/ 76
ATNDでいただいたコメント
4
https://atnd.org/events/85919
SQLを使い始めたので聞きに行きたいです
運用やSQL初心者ですが、今後OSSなど含めて取り組んでいきた
いと思っています。
Apache Spark自体は未経験ですが今後触ることになりそうで興味
があり参加させていただきます。
sparkでリアルタイムな機械学習に挑戦したいです
/ 76
A
x 人
B
x 人
C
x 人
D
x 人
会場への質問
5
Spark経験有りSpark経験無し
SQL経験有り
SQL経験無し
SQLのSELECT句, FROM句, WHERE句の意味が
分かる
何らかの方法(spark-submit, spark-shell, ...)で
Sparkジョブを実行したことがある
SQL経験有り
Spark経験有り
/ 76
Sparkの章
6
/ 76
Sparkの章
• 2015年6月
• IBMがSparkプロジェクトに3500名を投
入と発表
• Apache Spark
• オープンソースの分散処理フレームワー
クのデファクトスタンダードとなりつつ
ある
7
http://jp.techcrunch.com/2015/06/16/20150615ibm-pours-researchers-and-resources-into-apache-spark-project/
/ 76
Sparkとは?
8
http://spark.apache.org/docs/latest/
/ 76
Sparkとは?
9
http://spark.apache.org/docs/latest/
Apache Spark is a fast and general-purpose cluster computing system.
/ 76
Sparkとは?
10
http://spark.apache.org/docs/latest/
It provides high-level APIs in Java, Scala, Python and R, and an
optimized engine that supports general execution graphs.
/ 76
Sparkとは?
11
http://spark.apache.org/docs/latest/
It also supports a rich set of higher-level tools including Spark SQL for
SQL and structured data processing, MLlib for machine learning,
GraphX for graph processing, and Spark Streaming.
/ 76
general execution graphs?
12
http://spark.apache.org/docs/latest/
It provides high-level APIs in Java, Scala, Python and R, and an
optimized engine that supports general execution graphs.
/ 76
general execution graphs?
• DAG(Directed Acyclic Graph)実行エンジン
13
https://databricks.com/blog/2015/06/22/understanding-your-spark-application-through-visualization.html
/ 76
general execution graphs?
• DAG(Directed Acyclic Graph)実行エンジン
• 分かりやすい説明:
• http://nave-kazu.hatenablog.com/entry/2015/11/30/154810
• 複雑なデータ処理フローを、循環のない有向グラフで表現
• 実行計画を自動的に最適化してくれる
• 適切にキャッシュを用いることで劇的にパフォーマンスを向上
できる
14
/ 76
general-purpose cluster computing system??
15
http://spark.apache.org/docs/latest/
Apache Spark is a fast and general-purpose cluster computing system.
/ 76
general-purpose cluster computing system??
• Sparkは「分散処理のための汎用的なフレームワーク」とよく
言われる
• cluster computing (クラスターコンピューティング)
≠ distributed computing (分散処理)
16
/ 76
general-purpose cluster computing system??
• クラスターコンピューティング
• 比較的密なネットワークで接続されたコンピュータを用いて分散処理
を行う
• cf. 物理的に離れたコンピュータを用いて分散処理を行う
グリッドコンピューティング
• 衛星画像の処理、DNA配列のデータベース化など
• ネットワークIOが少ない処理に向く
17
/ 76
general-purpose cluster computing system??
• クラスターコンピューティング
• 比較的密なネットワークで接続されたコンピュータを用いて分散処理
を行う
• cf. 大量のコアを用いて並列処理を行うGPGPU
• 動画エンコーディング、ディープラーニング、ビットコインのマイニ
ングなど
• 条件分岐がないベクトル計算に向く
18
/ 76
general-purpose cluster computing system??
• クラスターコンピューティング
• 比較的密なネットワークで接続されたコンピュータを用いて分散処理
を行う
• クラスターコンピューティングのプログラミングモデル
• MapReduce → Hadoop
• RDD+DAG → Spark
• BSP: Bulk Synchronous Parallel → Apache Hama
19
/ 76
general-purpose cluster computing system??
• クラスターコンピューティングのプログラミングモデルの特徴
20
プログラミング
モデル
特徴 用途
MapReduce 分散ディスクI/Oで高スループット
を実現
大規模で単純なバッチ処理
RDD+DAG 複雑な処理をDAGで表現し、
実行計画を最適化
機械学習などの複雑な繰り返し
処理
※ ただしDeep Learningは難しい
BSP 各Worker間で差分データのみを
通信し、ネットワークI/Oを削減
グラフ処理などの単純な繰り返
し処理
/ 76
【余談】 SparkでDeep Learning
• Sparkで利用できるDeep Learningフレームワークまとめ
http://data.gunosy.io/entry/spark-deep-learning
• Elephas
• Deeplearning4j
• SparkNet
• CaffeOnSpark
• TensorFlow on Spark
• Sparkling Water (H2O + Spark)
http://qiita.com/pyr_revs/items/82443fe9728b2b027948
21
Deep Learningを高速で実
現するためには、GPUの活
用がほぼ必須
/ 76
【余談】 SparkでDeep Learning - DMMの事例
『Deep Learningを用いた類似画像レコメンドのSQL on Hadoopによる実現』
Cloudera World Tokyo 2016
22
http://labotech.dmm.com/entry/2016/11/11/154709
Deep Learningの処理にはSparkを
用いず、学習結果のみを利用する
方式
/ 76
fast???
23
http://spark.apache.org/docs/latest/
Apache Spark is a fast and general-purpose cluster computing system.
/ 76
fast???
• Sparkは「速い」のか?
24
http://spark.apache.org/
→ Hadoop(MapReduce)との比較
/ 76
fast???
• MapReduceとの比較
• 100倍はさすがに極端な例
(MapReduceが不得意なイテレーション処理での比較)
• 全般的には3倍程度速い
25
https://www.slideshare.net/knagato/hive-on-spark-hadoop-spark-conference-japan-2016
Hive on Spark を活用した高速データ分析
- Hadoop / Spark Conference Japan 2016
/ 76
fast???
• MapReduce以外との比較
• スケールアウト可能なSQLエンジンのベンチマークテスト:
Presto vs Spark SQL vs Hive on Tez
http://recruit.gmo.jp/engineer/jisedai/blog/presto_spark_hive/
26
SparkとTezが同じくらい、
Prestoはその3倍速い
/ 76
fast???
• MapReduce以外との比較
• PageRankアルゴリズムのベンチマーク
27
http://www.cl.cam.ac.uk/~ey204/teaching/ACS/R212_2013_2014/presentation/S8/Niko_GraphLabx.pdf
Mahout(MapReduce) vs
GraphX(Spark) vs
PowerGraph(GraphLab)
MapReduceよりは速いが、
GraphLabよりは遅い
/ 76
fast???
• ちなみにSpark公式ページでは、このグラフが逆転する
28
http://spark.apache.org/graphx/
→ どちらの主張も正しい(後述)
/ 76
a rich set of higher-level tools
29
http://spark.apache.org/docs/latest/
It also supports a rich set of higher-level tools including Spark SQL for
SQL and structured data processing, MLlib for machine learning,
GraphX for graph processing, and Spark Streaming.
/ 76
a rich set of higher-level tools
• 主なSparkコンポーネントと、その競合ソフトウェア
30
分野 Sparkコンポーネント 他のソフトウェア
SQL Spark SQL Presto, Hive on Tez, Redshift, BigQuery, ...
機械学習 MLlib TensorFlow, Torch, Mxnet, ...
グラフ処理 GraphX Graphlab, Titan, Microsoft Graph
Engine, ...
ストリーム処理 Spark Streaming Apache Flink, Apache Storm, ...
それぞれの分野で見た場合、特出した機能がある訳ではない
/ 76
では、Sparkのメリットとは?
• 再度、PageRank
アルゴリズムのパ
フォーマンス比較
31
https://www.yumpu.com/en/document/view/23451357/graphxstrata2014-final
/ 76
では、Sparkのメリットとは?
• 生データの取得か
ら活用までのデー
タフロー例
32
https://www.yumpu.com/en/document/view/23451357/graphxstrata2014-final
/ 76
では、Sparkのメリットとは?
• 前処理、後処理を
含めたデータ処理
全体の実行時間で
比べれば、Spark
が速い
33
https://www.yumpu.com/en/document/view/23451357/graphxstrata2014-final
/ 76
では、Sparkのメリットとは?
• End-to-endの処理を一つのアプリケーションとして実装できる
汎用性
• 前処理、後処理までSparkで実現可能
• さまざまなインターフェース(Python, Scala, Java, R, SQL)
• さまざまなデータソース(HDFS, S3, Kafka, JDBC, ...)
• 特定の目的に特化するのであれば、Spark以外の選択肢が最善
の場合もある
同じデータやクラスタを、さまざまな目的で汎用的に使いたい
なら、Sparkがベスト
34
/ 76
Sparkインストール
• Spark実行環境
• Java 7以上必須(Java 8推奨)
• 必要に応じてScala 2.10+, Python 2.6+/3.4+, R 3.1+をインストール
• (Java 7, Scala 2.10, Python 2.6はdeprecated)
• ダウンロードページ
• http://spark.apache.org/downloads.html
• Hadoop関連ライブラリ同梱版も利用できる
• https://ja.osdn.net/projects/win-hadoop/
• Windowsの場合は winutils.exe も必要
• 参考: http://hired.hateblo.jp/entry/2015/12/10/183000
35
/ 76
Spark動作確認
• サンプルプログラムの実行
36
$./bin/run-example SparkPi 10
=> Pi is roughly 3.1435951435951437
• サンプルプログラムは ./examples/src/main/* にある
• ログレベルを変えるには、conf/log4j.propertiesファイルで指定
/ 76
Spark動作確認
• Sparkアプリケーションの実行 (spark-submit)
37
# Pythonサンプルプログラムの実行
$./bin/spark-submit examples/src/main/python/pi.py 10
# Rサンプルプログラムの実行
$./bin/spark-submit examples/src/main/r/dataframe.R
/ 76
Spark動作確認
• インタラクティブシェルの実行
38
$./bin/spark-shell # Scalaシェル
$./bin/pyspark # Pythonシェル
$./bin/sparkR # Rシェル
$./bin/spark-sql # SQLシェル
/ 76
質疑応答
39
/ 76
SQLの章
40
/ 76
SQLの章
• The 9 Most In-Demand Programming Languages of 2017
41
http://www.codingdojo.com/blog/9-most-in-demand-programming-languages-of-2017/
2016年に引き続き、SQLの需要が1位
アプリケーションで実行されるSQLを生で
記述する機会は減っているが、
それ以上に分析用途のSQLの需要が高
まっている。
例: Hive, Redshift, BigQuery, SparkSQL, ...
/ 76
分析用途でよく使うSQL構文
• CTE(WITH句)
• ウィンドウ関数
• フレーム指定
• 集約関数+CASE式
42
/ 76
実践SQL: ABC分析
• ABC分析のレポート例
• 売上の70%は上位の極少数
の商品で構成される
• 売上の合計額を高い順に並
べ、構成比累計を計算
• 構成比累計に従って、
Aランク: 上位0~70%
Bランク: 上位70~90%
Cランク: 上位90~100%
というランク分けを行う
43
『ビッグデータ分析・活用のためのSQLレシピ』 p.116
/ 76
実践SQL: ABC分析
• サンプル購入ログ (purchase_log)
44
日付 (dt) 商品 (item) 価格 (amount)
2017-03-01 Onion 100
2017-03-01 Tomato 100
2017-03-01 Green Onion 80
2017-03-01 Eggplant 120
… … …
/ 76
実践SQL: ABC分析
• 月別売上の集計
45
WITH
monthly_sales AS (
SELECT item, SUM(amount) AS amount
FROM purchase_log
WHERE
dt BETWEEN '2017-03-01' AND '2017-03-31'
GROUP BY item
)
SELECT * FROM monthly_sales;
item amount
Onion 185,000
Tomato 168,000
Green Onion 130,000
Eggplant 98,000
… …
/ 76
実践SQL: ABC分析
• 構成比、構成比累計の計算
46
WITH
monthly_sales AS ( ... )
, sales_composition_ratio AS (
SELECT item, amount
, 100.0 * amount
/ NULLIF(SUM(amount) OVER(), 0)
AS comp_ratio
, 100.0 * SUM(amount) OVER(ORDER BY amount DESC)
/ NULLIF(SUM(amount) OVER(), 0)
AS cum_ratio
FROM
monthly_sales
)
SELECT * FROM sales_composition_ratio;
item amount comp_ratio cum_ratio
Onion 185,000 19.331 19.331
Tomato 168,000 17.554 36.886
Green Onion 130,000 13.584 50.470
ウィンドウ関数で全
体売上・累計売上
を計算
分母が0のときは
NULLに変換
/ 76
実践SQL: ABC分析
• ABCランクの判定
47
WITH
monthly_sales AS ( ... )
, sales_composition_ratio AS ( ... )
SELECT
item
, cum_ratio
, CASE
WHEN cum_ratio BETWEEN 0 AND 70 THEN 'A'
WHEN cum_ratio BETWEEN 70 AND 90 THEN 'B'
WHEN cum_ratio BETWEEN 90 AND 100 THEN 'C'
END AS abc_rank
FROM sales_composition_ratio;
item cum_ratio abc_rank
Onion 19.331 A
Tomato 36.886 A
… … …
Carrot 74.721 B
… … …
CASE式で値を
変換
/ 76
実践SQL:検索ログ分析
• サンプル検索ログ (search_log)
48
タイムスタンプ
(stamp)
セッションID
(session)
アクション
(action)
検索ワード
(keyword)
検索結果数
(result_num)
2017-03-01
10:00:00
Fad5bg Search Pstgres 0
2017-03-01
10:00:01
Fad5bg Search Postgres 889
2017-03-01
10:00:05
Fad5bg Click
2017-03-01
10:00:07
Fad5bg Search Hive 864
… … …
/ 76
実践SQL:検索ログ分析
• 検索アクションの次のアクションを補完する
49
WITH
search_log_with_next_action AS (
SELECT action, keyword, result_num
, LEAD(action) OVER(PARTITION BY session ORDER BY stamp) AS next_action
, LEAD(keyword) OVER(PARTITION BY session ORDER BY stamp) AS next_keyword
, LEAD(result_num) OVER(PARTITION BY session ORDER BY stamp) AS next_result_num
FROM search_log
)
SELECT * FROM search_log_with_next_action WHERE action = 'search';
action keyword result_num next_action next_keyword next_result_num
Search Pstgres 0 Search Postgres 889
Search Postgres 889 Click
Search Hive 864
… … …
再検索
クリック
離脱
LEAD関数で次のレ
コードの値を取得
/ 76
WITH
search_log_with_next_action AS ( ... )
SELECT
keyword
, COUNT(1) AS search_count
, AVG(CASE WHEN next_action = 'search' THEN 1.0 ELSE 0.0 END) AS retry_rate
, AVG(CASE WHEN next_action = 'click' THEN 1.0 ELSE 0.0 END) AS click_rate
, AVG(CASE WHEN next_action IS NULL THEN 1.0 ELSE 0.0 END) AS exit_rate
FROM search_log_with_next_action
WHERE action = 'search'
GROUP BY keyword;
実践SQL:検索ログ分析
• クリック率、再検索率、離脱率を同時に計算する
50
keyword search_count retry_rate click_rate exit_rate
Postgres 1082 0.2145 0.1548 0.6307
… … …
0除算の考慮
は不要
CASE式で0, 1 のフラグ
に変換し、AVGで集約
/ 76
SQLのメリット
• ハードウェア(物理設計)に依存しない
• 言語仕様が標準化されており、クエリをどのように解釈して実行する
かはミドルウェアに依存する
• INDEXは標準SQLではない
• “標準SQLは、インデックスその他あらゆる物理的なデータアクセス方法を定義
していない”(ジョー・セルコ(著)、ミック(訳)『プログラマのためのSQL 第4版』)
• 歴史が長く、ノウハウが蓄積されている
51
/ 76
SQLのデメリット
• 複雑なクエリが読みにくい
• WITH句で段階的に記述できるが、限界はある
• 冗長な記述になりやすい
• SELECT句とWHERE句で同じ計算が必要
• 複雑な計算結果に名前をつけるためだけにサブクエリが必要
• デバッグが難しい
• 途中結果を確認できない
52
/ 76
もっと詳しく知りたい方は
53
https://www.amazon.co.jp/dp/4839961263
/ 76
質疑応答
54
/ 76
SparkSQLの章
55
/ 76
SparkSQLの章
• SparkSQL
• SparkのSQLインターフェイス
• SQL単体でもSparkを実行可能 (spark-sqlクライアント)
• Scala, Java, Python, RなどのSparkプログラムに、シームレスに組み
込むこともできる
56
http://spark.apache.org/sql/
/ 76
SparkSQLの章
• DataFrames, Datasetsとの関係
• もともとRDDをSQLライクに操作するための機能であった
SchemaRDDsが、 Spark 1.3でRDDから独立してDataFramesとなった
• この時点では、型付けやラムダ関数など、RDDが持っていたメリットが損なわれ
ており、使い分けが必要だった
• Spark 1.6で、RDDとDataFramesのメリットを併せ持つ Dataset APIが
導入され、Spark 2.0でDataFramesはDatasetsに統合された
57
https://databricks.com/blog/2016/07/14/a-tale-of-three-apache-spark-
apis-rdds-dataframes-and-datasets.html
/ 76
SparkSQLの章
• まだアクティブに開発中で、更新が激しい
• 最新の機能や使い方については、
GitBook の Mastering Apache Spark 2 が詳しい
58
https://www.gitbook.com/book/jaceklaskowski/mastering-apache-spark/details
/ 76
SparkSQLの使い方
• DataFrameをアドホックに作成し、テーブルとして登録
59
// Found at http://stackoverflow.com/a/32514683/1305344
val dataset = Seq(
"08/11/2015",
"09/11/2015",
"09/12/2015").toDF("date_string")
dataset.registerTempTable("dates")
https://jaceklaskowski.gitbooks.io/mastering-apache-spark/content/spark-sql.html
/ 76
SparkSQLの使い方
• 登録されたテーブルに対してSQLを発行
60
// Inside spark-shell
scala > sql(
"""SELECT date_string,
from_unixtime(unix_timestamp(date_string,'MM/dd/yyyy'), 'EEEEE') AS dow
FROM dates""").show
+-----------+--------+
|date_string| dow|
+-----------+--------+
| 08/11/2015| Tuesday|
| 09/11/2015| Friday|
| 09/12/2015|Saturday|
+-----------+--------+
https://jaceklaskowski.gitbooks.io/mastering-apache-spark/content/spark-sql.html
/ 76
SparkSQLの使い方
• ファイルからDataFrameを作成
61
val df = spark.read.json("examples/src/main/resources/people.json")
// Displays the content of the DataFrame to stdout
df.show()
// +----+-------+
// | age| name|
// +----+-------+
// |null|Michael|
// | 30| Andy|
// | 19| Justin|
// +----+-------+
http://spark.apache.org/docs/latest/sql-programming-guide.html
代表的な読み込み関数
spark.read.json
spark.read.csv
spark.read.orc
spark.read.parquet
spark.read.text
spark.read.jdbc
/ 76
DataFrame API
• SQLだけでなく、DataFramesのオペレーションも使える
62
df.printSchema()
// root
// |-- age: long (nullable = true)
// |-- name: string (nullable = true)
// Select only the "name" column
df.select("name").show()
// +-------+
// | name|
// +-------+
// |Michael|
// | Andy|
// | Justin|
// +-------+
http://spark.apache.org/docs/latest/sql-programming-guide.html
/ 76
DataFrame API
• SQLだけでなく、DataFramesのオペレーションも使える
63
// Select everybody, but increment the age by 1
df.select($"name", $"age" + 1).show()
// +-------+---------+
// | name|(age + 1)|
// +-------+---------+
// |Michael| null|
// | Andy| 31|
// | Justin| 20|
// +-------+---------+
http://spark.apache.org/docs/latest/sql-programming-guide.html
/ 76
DataFrame API
• SQLだけでなく、DataFramesのオペレーションも使える
64
// Select people older than 21
df.filter($"age" > 21).show()
// +---+----+
// |age|name|
// +---+----+
// | 30|Andy|
// +---+----+
http://spark.apache.org/docs/latest/sql-programming-guide.html
/ 76
DataFrame API
• SQLだけでなく、DataFramesのオペレーションも使える
65
// Count people by age
df.groupBy("age").count().show()
// +----+-----+
// | age|count|
// +----+-----+
// | 19| 1|
// |null| 1|
// | 30| 1|
// +----+-----+
http://spark.apache.org/docs/latest/sql-programming-guide.html
/ 76
実践SparkSQL: ABC分析
• サンプルデータの作成
66
case class Sales(item: String, amount: Int)
val monthlySales = Seq(
Sales("Onion", 185000),
Sales("Tomato", 168000),
Sales("Green Onion", 130000)
).toDS()
monthlySales.show()
+-----------+------+
| item|amount|
+-----------+------+
| Onion|185000|
| Tomato|168000|
|Green Onion|130000|
+-----------+------+
/ 76
実践SparkSQL: ABC分析
• ウィンドウ関数の使用
67
import org.apache.spark.sql.expressions._
monthlySales.
withColumn("totalAmount", sum("amount") over Window.partitionBy()).
withColumn("cumAmount", sum("amount") over Window.orderBy("amount")).
show()
+-----------+------+-----------+---------+
| item|amount|totalAmount|cumAmount|
+-----------+------+-----------+---------+
|Green Onion|130000| 483000| 130000|
| Tomato|168000| 483000| 298000|
| Onion|185000| 483000| 483000|
+-----------+------+-----------+---------+
/ 76
実践SparkSQL: ABC分析
• withColumnの連結で前のカラムを再利用できる
68
monthlySales.
withColumn("totalAmount", sum("amount") over Window.partitionBy()).
withColumn("cumAmount", sum("amount") over Window.orderBy("amount")).
withColumn("compRate", lit(100.0) * $"amount" / $"totalAmount").
withColumn("cumRate", lit(100.0) * $"cumAmount" / $"totalAmount").
show()
+-----------+------+-----------+---------+--------+--------+
| item|amount|totalAmount|cumAmount|compRate| cumRate|
+-----------+------+-----------+---------+--------+--------+
|Green Onion|130000| 483000| 130000| 26.9151| 26.9151|
| Tomato|168000| 483000| 298000| 34.7826| 61.6977|
| Onion|185000| 483000| 483000| 38.3022|100.0000|
+-----------+------+-----------+---------+--------+--------+
/ 76
実践SparkSQL: ABC分析
• UDFの定義
69
// ABC分析のランク判定用UDF
val abcUdf = udf { r: Double =>
r match {
case r if (0 <= r && r <= 70) => "A"
case r if (70 < r && r <= 90) => "B"
case r if (90 < r && r <= 100) => "C"
case _ => ""
}
}
/ 76
実践SparkSQL: ABC分析
• UDFの使用
70
monthlySales.
withColumn("totalAmount", sum("amount") over Window.partitionBy()).
withColumn("cumAmount", sum("amount") over Window.orderBy("amount")).
withColumn("compRate", lit(100.0) * $"amount" / $"totalAmount").
withColumn("cumRate", lit(100.0) * $"cumAmount" / $"totalAmount").
withColumn("abcRank", abcUdf($"cumRate")).
show()
+-----------+------+-----------+---------+--------+--------+-------+
| item|amount|totalAmount|cumAmount|compRate| cumRate|abcRank|
+-----------+------+-----------+---------+--------+--------+-------+
|Green Onion|130000| 483000| 130000| 26.9151| 26.9151| A|
| Tomato|168000| 483000| 298000| 34.7826| 61.6977| A|
| Onion|185000| 483000| 483000| 38.3022|100.0000| C|
+-----------+------+-----------+---------+--------+--------+-------+
/ 76
実践SparkSQL: ABC分析
• SQLの記述との比較
71
WITH
sales_composition_ratio AS (
SELECT item, amount
, 100.0 * amount / NULLIF(SUM(amount) OVER(), 0) AS comp_ratio
, 100.0 * SUM(amount) OVER(ORDER BY amount DESC)
/ NULLIF(SUM(amount) OVER(), 0) AS cum_ratio
FROM monthly_sales
)
SELECT item, cum_ratio
, CASE
WHEN cum_ratio BETWEEN 0 AND 70 THEN 'A'
WHEN cum_ratio BETWEEN 70 AND 90 THEN 'B'
WHEN cum_ratio BETWEEN 90 AND 100 THEN 'C'
END AS abc_rank
FROM sales_composition_ratio;
/ 76
実践SparkSQL: ABC分析
• ロジック中にテストやアサーションを入れられる
72
// amountに0を含むデータ
val malMonthlySales = Seq(
Sales("Onion", 185000),
Sales("Tomato", 168000),
Sales("Green Onion", 0)
).toDS()
// amount = 0 となるレコードが存在しないことを確認するアサーション
assert(malMonthlySales.filter("amount = 0").count == 0, "amount must not be 0")
java.lang.AssertionError: assertion failed: Amount must not be 0
at scala.Predef$.assert(Predef.scala:170)
... 48 elided
/ 76
DataFramesベースのSparkモジュール
• ML Pipelines
• 機械学習の典型的な処理(モデル、学習、テストなど)をパイプライ
ン化
• パイプラインの保存や再利用、パラメタを少しずつ変えて実行などが
簡単に行える
• Structured Streaming
• DataFrame APIをストリームデータに対して適用できる
• GraphFrames
• グラフ構造、グラフ処理のためのDataFrames拡張
73
/ 76
発表まとめ
• Spark
• End-to-endの処理を一つのアプリケーションとして実装できる汎用性
• 機械学習、グラフ処理、ストリーム処理などのモジュールが充実
• SQL
• 分析用途のSQLの需要拡大
• SparkSQL
• SparkとSQLの良い所取り
• SQLの直感的操作+型安全・Sparkモジュール連携
74
/ 76
お知らせ(今後のイベント)
• 3月28日(火)
• 【 ヒカ☆ラボ 】ビッグデータを使ってバナーを動的表示させたらコン
バージョンが 323% 増加した話~Golang x Presto での高速集計処理 と Docker
を利用した Blue-Green Deployment による無停止の API~
https://atnd.org/events/86105
• 4月11日(火)
• 【 ヒカ☆ラボ 】データを武器に変える!エンジニアによるデータ活用
のススメ!
https://atnd.org/events/86766
• 4月24日(月)
• 【でじらぼ by DMM.com labo】SQLで身につける!初めてのレコメン
ド 〜 基礎から応用まで ~
https://atnd.org/events/86479
75
/ 76
質疑応答
76

Weitere ähnliche Inhalte

Was ist angesagt?

インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門Akihiro Kuwano
 
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)Trainocate Japan, Ltd.
 
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)NTT DATA Technology & Innovation
 
Apache Kafka 0.11 の Exactly Once Semantics
Apache Kafka 0.11 の Exactly Once SemanticsApache Kafka 0.11 の Exactly Once Semantics
Apache Kafka 0.11 の Exactly Once SemanticsYoshiyasu SAEKI
 
Snowflake Architecture and Performance
Snowflake Architecture and PerformanceSnowflake Architecture and Performance
Snowflake Architecture and PerformanceMineaki Motohashi
 
クラウドネイティブ時代の分散トレーシング - Distributed Tracing in a Cloud Native Age
クラウドネイティブ時代の分散トレーシング - Distributed Tracing in a Cloud Native Ageクラウドネイティブ時代の分散トレーシング - Distributed Tracing in a Cloud Native Age
クラウドネイティブ時代の分散トレーシング - Distributed Tracing in a Cloud Native AgeYoichi Kawasaki
 
Apache Hadoop YARNとマルチテナントにおけるリソース管理
Apache Hadoop YARNとマルチテナントにおけるリソース管理Apache Hadoop YARNとマルチテナントにおけるリソース管理
Apache Hadoop YARNとマルチテナントにおけるリソース管理Cloudera Japan
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティスAmazon Web Services Japan
 
Amazon Redshift パフォーマンスチューニングテクニックと最新アップデート
Amazon Redshift パフォーマンスチューニングテクニックと最新アップデートAmazon Redshift パフォーマンスチューニングテクニックと最新アップデート
Amazon Redshift パフォーマンスチューニングテクニックと最新アップデートAmazon Web Services Japan
 
Apache Sparkにおけるメモリ - アプリケーションを落とさないメモリ設計手法 -
Apache Sparkにおけるメモリ - アプリケーションを落とさないメモリ設計手法 -Apache Sparkにおけるメモリ - アプリケーションを落とさないメモリ設計手法 -
Apache Sparkにおけるメモリ - アプリケーションを落とさないメモリ設計手法 -Yoshiyasu SAEKI
 
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)NTT DATA Technology & Innovation
 
AWS で Presto を徹底的に使いこなすワザ
AWS で Presto を徹底的に使いこなすワザAWS で Presto を徹底的に使いこなすワザ
AWS で Presto を徹底的に使いこなすワザNoritaka Sekiyama
 
ヤフーのプライベートクラウドとクラウドエンジニアの業務について
ヤフーのプライベートクラウドとクラウドエンジニアの業務についてヤフーのプライベートクラウドとクラウドエンジニアの業務について
ヤフーのプライベートクラウドとクラウドエンジニアの業務についてYahoo!デベロッパーネットワーク
 
Azure Database for PostgreSQL 入門 (PostgreSQL Conference Japan 2021)
Azure Database for PostgreSQL 入門 (PostgreSQL Conference Japan 2021)Azure Database for PostgreSQL 入門 (PostgreSQL Conference Japan 2021)
Azure Database for PostgreSQL 入門 (PostgreSQL Conference Japan 2021)Keisuke Takahashi
 
PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法 ※講演は翻訳資料にて行います。 - Getting the Best...
PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法  ※講演は翻訳資料にて行います。 - Getting the Best...PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法  ※講演は翻訳資料にて行います。 - Getting the Best...
PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法 ※講演は翻訳資料にて行います。 - Getting the Best...Holden Karau
 

Was ist angesagt? (20)

インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門
 
AWS Black Belt - AWS Glue
AWS Black Belt - AWS GlueAWS Black Belt - AWS Glue
AWS Black Belt - AWS Glue
 
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
 
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
 
Apache Kafka 0.11 の Exactly Once Semantics
Apache Kafka 0.11 の Exactly Once SemanticsApache Kafka 0.11 の Exactly Once Semantics
Apache Kafka 0.11 の Exactly Once Semantics
 
Snowflake Architecture and Performance
Snowflake Architecture and PerformanceSnowflake Architecture and Performance
Snowflake Architecture and Performance
 
クラウドネイティブ時代の分散トレーシング - Distributed Tracing in a Cloud Native Age
クラウドネイティブ時代の分散トレーシング - Distributed Tracing in a Cloud Native Ageクラウドネイティブ時代の分散トレーシング - Distributed Tracing in a Cloud Native Age
クラウドネイティブ時代の分散トレーシング - Distributed Tracing in a Cloud Native Age
 
Kafka・Storm・ZooKeeperの認証と認可について #kafkajp
Kafka・Storm・ZooKeeperの認証と認可について #kafkajpKafka・Storm・ZooKeeperの認証と認可について #kafkajp
Kafka・Storm・ZooKeeperの認証と認可について #kafkajp
 
Apache Hadoop YARNとマルチテナントにおけるリソース管理
Apache Hadoop YARNとマルチテナントにおけるリソース管理Apache Hadoop YARNとマルチテナントにおけるリソース管理
Apache Hadoop YARNとマルチテナントにおけるリソース管理
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
 
Amazon Redshift パフォーマンスチューニングテクニックと最新アップデート
Amazon Redshift パフォーマンスチューニングテクニックと最新アップデートAmazon Redshift パフォーマンスチューニングテクニックと最新アップデート
Amazon Redshift パフォーマンスチューニングテクニックと最新アップデート
 
Apache Sparkにおけるメモリ - アプリケーションを落とさないメモリ設計手法 -
Apache Sparkにおけるメモリ - アプリケーションを落とさないメモリ設計手法 -Apache Sparkにおけるメモリ - アプリケーションを落とさないメモリ設計手法 -
Apache Sparkにおけるメモリ - アプリケーションを落とさないメモリ設計手法 -
 
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajpAt least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
AWS で Presto を徹底的に使いこなすワザ
AWS で Presto を徹底的に使いこなすワザAWS で Presto を徹底的に使いこなすワザ
AWS で Presto を徹底的に使いこなすワザ
 
ヤフーのプライベートクラウドとクラウドエンジニアの業務について
ヤフーのプライベートクラウドとクラウドエンジニアの業務についてヤフーのプライベートクラウドとクラウドエンジニアの業務について
ヤフーのプライベートクラウドとクラウドエンジニアの業務について
 
Apache Spark の紹介(前半:Sparkのキホン)
Apache Spark の紹介(前半:Sparkのキホン)Apache Spark の紹介(前半:Sparkのキホン)
Apache Spark の紹介(前半:Sparkのキホン)
 
Azure Database for PostgreSQL 入門 (PostgreSQL Conference Japan 2021)
Azure Database for PostgreSQL 入門 (PostgreSQL Conference Japan 2021)Azure Database for PostgreSQL 入門 (PostgreSQL Conference Japan 2021)
Azure Database for PostgreSQL 入門 (PostgreSQL Conference Japan 2021)
 
PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法 ※講演は翻訳資料にて行います。 - Getting the Best...
PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法  ※講演は翻訳資料にて行います。 - Getting the Best...PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法  ※講演は翻訳資料にて行います。 - Getting the Best...
PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法 ※講演は翻訳資料にて行います。 - Getting the Best...
 

Ähnlich wie ゼロから始めるSparkSQL徹底活用!

15.05.21_ビッグデータ分析基盤Sparkの最新動向とその活用-Spark SUMMIT EAST 2015-
15.05.21_ビッグデータ分析基盤Sparkの最新動向とその活用-Spark SUMMIT EAST 2015-15.05.21_ビッグデータ分析基盤Sparkの最新動向とその活用-Spark SUMMIT EAST 2015-
15.05.21_ビッグデータ分析基盤Sparkの最新動向とその活用-Spark SUMMIT EAST 2015-LINE Corp.
 
Deep Dive into Spark SQL with Advanced Performance Tuning
Deep Dive into Spark SQL with Advanced Performance TuningDeep Dive into Spark SQL with Advanced Performance Tuning
Deep Dive into Spark SQL with Advanced Performance TuningTakuya UESHIN
 
経済学のための実践的データ分析 4.SQL ことはじめ
経済学のための実践的データ分析 4.SQL ことはじめ経済学のための実践的データ分析 4.SQL ことはじめ
経済学のための実践的データ分析 4.SQL ことはじめYasushi Hara
 
Pysparkで始めるデータ分析
Pysparkで始めるデータ分析Pysparkで始めるデータ分析
Pysparkで始めるデータ分析Tanaka Yuichi
 
Apache Sparkを使った感情極性分析
Apache Sparkを使った感情極性分析Apache Sparkを使った感情極性分析
Apache Sparkを使った感情極性分析Tanaka Yuichi
 
20160127三木会 RDB経験者のためのspark
20160127三木会 RDB経験者のためのspark20160127三木会 RDB経験者のためのspark
20160127三木会 RDB経験者のためのsparkRyuji Tamagawa
 
ビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streamingビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streamingchibochibo
 
SparkとCassandraの美味しい関係
SparkとCassandraの美味しい関係SparkとCassandraの美味しい関係
SparkとCassandraの美味しい関係datastaxjp
 
PySpark Intro Part.2 with SQL Graph
PySpark Intro Part.2 with SQL GraphPySpark Intro Part.2 with SQL Graph
PySpark Intro Part.2 with SQL GraphOshitari_kochi
 
Spark Summit 2014 の報告と最近の取り組みについて
Spark Summit 2014 の報告と最近の取り組みについてSpark Summit 2014 の報告と最近の取り組みについて
Spark Summit 2014 の報告と最近の取り組みについてRecruit Technologies
 
Developers.IO 2019 Effective Datalake
Developers.IO 2019 Effective DatalakeDevelopers.IO 2019 Effective Datalake
Developers.IO 2019 Effective DatalakeSatoru Ishikawa
 
Watson summit 2016_j2_5
Watson summit 2016_j2_5Watson summit 2016_j2_5
Watson summit 2016_j2_5Tanaka Yuichi
 
Snowflake Architecture and Performance(db tech showcase Tokyo 2018)
Snowflake Architecture and Performance(db tech showcase Tokyo 2018)Snowflake Architecture and Performance(db tech showcase Tokyo 2018)
Snowflake Architecture and Performance(db tech showcase Tokyo 2018)Mineaki Motohashi
 
9/16 Tokyo Apache Drill Meetup - drill vs sparksql
9/16 Tokyo Apache Drill Meetup - drill vs sparksql9/16 Tokyo Apache Drill Meetup - drill vs sparksql
9/16 Tokyo Apache Drill Meetup - drill vs sparksqlMitsutoshi Kiuchi
 
SAP on AWS 実際の導入例と導入効果
SAP on AWS 実際の導入例と導入効果SAP on AWS 実際の導入例と導入効果
SAP on AWS 実際の導入例と導入効果Amazon Web Services Japan
 
Bluemixを使ったTwitter分析
Bluemixを使ったTwitter分析Bluemixを使ったTwitter分析
Bluemixを使ったTwitter分析Tanaka Yuichi
 
20161027 hadoop summit Generating Recommendations at Amazon Scale with Apach...
20161027 hadoop summit  Generating Recommendations at Amazon Scale with Apach...20161027 hadoop summit  Generating Recommendations at Amazon Scale with Apach...
20161027 hadoop summit Generating Recommendations at Amazon Scale with Apach...Amazon Web Services Japan
 
Azure Websites で作るスケーラブルな PHP アプリケーション
Azure Websites で作るスケーラブルな PHP アプリケーションAzure Websites で作るスケーラブルな PHP アプリケーション
Azure Websites で作るスケーラブルな PHP アプリケーションMasashi Shinbara
 
Reco choku tech night #09 -reinvent2018報告会-
Reco choku tech night #09 -reinvent2018報告会-Reco choku tech night #09 -reinvent2018報告会-
Reco choku tech night #09 -reinvent2018報告会-recotech
 
Presto As A Service - Treasure DataでのPresto運用事例
Presto As A Service - Treasure DataでのPresto運用事例Presto As A Service - Treasure DataでのPresto運用事例
Presto As A Service - Treasure DataでのPresto運用事例Taro L. Saito
 

Ähnlich wie ゼロから始めるSparkSQL徹底活用! (20)

15.05.21_ビッグデータ分析基盤Sparkの最新動向とその活用-Spark SUMMIT EAST 2015-
15.05.21_ビッグデータ分析基盤Sparkの最新動向とその活用-Spark SUMMIT EAST 2015-15.05.21_ビッグデータ分析基盤Sparkの最新動向とその活用-Spark SUMMIT EAST 2015-
15.05.21_ビッグデータ分析基盤Sparkの最新動向とその活用-Spark SUMMIT EAST 2015-
 
Deep Dive into Spark SQL with Advanced Performance Tuning
Deep Dive into Spark SQL with Advanced Performance TuningDeep Dive into Spark SQL with Advanced Performance Tuning
Deep Dive into Spark SQL with Advanced Performance Tuning
 
経済学のための実践的データ分析 4.SQL ことはじめ
経済学のための実践的データ分析 4.SQL ことはじめ経済学のための実践的データ分析 4.SQL ことはじめ
経済学のための実践的データ分析 4.SQL ことはじめ
 
Pysparkで始めるデータ分析
Pysparkで始めるデータ分析Pysparkで始めるデータ分析
Pysparkで始めるデータ分析
 
Apache Sparkを使った感情極性分析
Apache Sparkを使った感情極性分析Apache Sparkを使った感情極性分析
Apache Sparkを使った感情極性分析
 
20160127三木会 RDB経験者のためのspark
20160127三木会 RDB経験者のためのspark20160127三木会 RDB経験者のためのspark
20160127三木会 RDB経験者のためのspark
 
ビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streamingビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streaming
 
SparkとCassandraの美味しい関係
SparkとCassandraの美味しい関係SparkとCassandraの美味しい関係
SparkとCassandraの美味しい関係
 
PySpark Intro Part.2 with SQL Graph
PySpark Intro Part.2 with SQL GraphPySpark Intro Part.2 with SQL Graph
PySpark Intro Part.2 with SQL Graph
 
Spark Summit 2014 の報告と最近の取り組みについて
Spark Summit 2014 の報告と最近の取り組みについてSpark Summit 2014 の報告と最近の取り組みについて
Spark Summit 2014 の報告と最近の取り組みについて
 
Developers.IO 2019 Effective Datalake
Developers.IO 2019 Effective DatalakeDevelopers.IO 2019 Effective Datalake
Developers.IO 2019 Effective Datalake
 
Watson summit 2016_j2_5
Watson summit 2016_j2_5Watson summit 2016_j2_5
Watson summit 2016_j2_5
 
Snowflake Architecture and Performance(db tech showcase Tokyo 2018)
Snowflake Architecture and Performance(db tech showcase Tokyo 2018)Snowflake Architecture and Performance(db tech showcase Tokyo 2018)
Snowflake Architecture and Performance(db tech showcase Tokyo 2018)
 
9/16 Tokyo Apache Drill Meetup - drill vs sparksql
9/16 Tokyo Apache Drill Meetup - drill vs sparksql9/16 Tokyo Apache Drill Meetup - drill vs sparksql
9/16 Tokyo Apache Drill Meetup - drill vs sparksql
 
SAP on AWS 実際の導入例と導入効果
SAP on AWS 実際の導入例と導入効果SAP on AWS 実際の導入例と導入効果
SAP on AWS 実際の導入例と導入効果
 
Bluemixを使ったTwitter分析
Bluemixを使ったTwitter分析Bluemixを使ったTwitter分析
Bluemixを使ったTwitter分析
 
20161027 hadoop summit Generating Recommendations at Amazon Scale with Apach...
20161027 hadoop summit  Generating Recommendations at Amazon Scale with Apach...20161027 hadoop summit  Generating Recommendations at Amazon Scale with Apach...
20161027 hadoop summit Generating Recommendations at Amazon Scale with Apach...
 
Azure Websites で作るスケーラブルな PHP アプリケーション
Azure Websites で作るスケーラブルな PHP アプリケーションAzure Websites で作るスケーラブルな PHP アプリケーション
Azure Websites で作るスケーラブルな PHP アプリケーション
 
Reco choku tech night #09 -reinvent2018報告会-
Reco choku tech night #09 -reinvent2018報告会-Reco choku tech night #09 -reinvent2018報告会-
Reco choku tech night #09 -reinvent2018報告会-
 
Presto As A Service - Treasure DataでのPresto運用事例
Presto As A Service - Treasure DataでのPresto運用事例Presto As A Service - Treasure DataでのPresto運用事例
Presto As A Service - Treasure DataでのPresto運用事例
 

Mehr von Nagato Kasaki

20190712 polkadot japan meetup
20190712 polkadot japan meetup20190712 polkadot japan meetup
20190712 polkadot japan meetupNagato Kasaki
 
Pact言語によるセキュアなスマートコントラクト開発
Pact言語によるセキュアなスマートコントラクト開発Pact言語によるセキュアなスマートコントラクト開発
Pact言語によるセキュアなスマートコントラクト開発Nagato Kasaki
 
暗号通貨輪読会 #20 bloXroute
暗号通貨輪読会 #20 bloXroute暗号通貨輪読会 #20 bloXroute
暗号通貨輪読会 #20 bloXrouteNagato Kasaki
 
Sparkを活用したレコメンドエンジンのパフォーマンスチューニング&自動化
Sparkを活用したレコメンドエンジンのパフォーマンスチューニング&自動化Sparkを活用したレコメンドエンジンのパフォーマンスチューニング&自動化
Sparkを活用したレコメンドエンジンのパフォーマンスチューニング&自動化Nagato Kasaki
 
Sparkで始めるお手軽グラフデータ分析
Sparkで始めるお手軽グラフデータ分析Sparkで始めるお手軽グラフデータ分析
Sparkで始めるお手軽グラフデータ分析Nagato Kasaki
 
Spark GraphFrames のススメ
Spark GraphFrames のススメSpark GraphFrames のススメ
Spark GraphFrames のススメNagato Kasaki
 
Spark graph framesとopencypherによる分散グラフ処理の最新動向
Spark graph framesとopencypherによる分散グラフ処理の最新動向Spark graph framesとopencypherによる分散グラフ処理の最新動向
Spark graph framesとopencypherによる分散グラフ処理の最新動向Nagato Kasaki
 
Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016
Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016
Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016Nagato Kasaki
 

Mehr von Nagato Kasaki (8)

20190712 polkadot japan meetup
20190712 polkadot japan meetup20190712 polkadot japan meetup
20190712 polkadot japan meetup
 
Pact言語によるセキュアなスマートコントラクト開発
Pact言語によるセキュアなスマートコントラクト開発Pact言語によるセキュアなスマートコントラクト開発
Pact言語によるセキュアなスマートコントラクト開発
 
暗号通貨輪読会 #20 bloXroute
暗号通貨輪読会 #20 bloXroute暗号通貨輪読会 #20 bloXroute
暗号通貨輪読会 #20 bloXroute
 
Sparkを活用したレコメンドエンジンのパフォーマンスチューニング&自動化
Sparkを活用したレコメンドエンジンのパフォーマンスチューニング&自動化Sparkを活用したレコメンドエンジンのパフォーマンスチューニング&自動化
Sparkを活用したレコメンドエンジンのパフォーマンスチューニング&自動化
 
Sparkで始めるお手軽グラフデータ分析
Sparkで始めるお手軽グラフデータ分析Sparkで始めるお手軽グラフデータ分析
Sparkで始めるお手軽グラフデータ分析
 
Spark GraphFrames のススメ
Spark GraphFrames のススメSpark GraphFrames のススメ
Spark GraphFrames のススメ
 
Spark graph framesとopencypherによる分散グラフ処理の最新動向
Spark graph framesとopencypherによる分散グラフ処理の最新動向Spark graph framesとopencypherによる分散グラフ処理の最新動向
Spark graph framesとopencypherによる分散グラフ処理の最新動向
 
Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016
Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016
Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016
 

Kürzlich hochgeladen

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 

Kürzlich hochgeladen (9)

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 

ゼロから始めるSparkSQL徹底活用!

  • 2. / 76 自己紹介 • 加嵜 長門(カサキ ナガト) • 2014年4月~ DMM.comラボ • Hadoop基盤構築・Sparkを用いたレコメンド開発 2 『詳解Apache Spark』(2016年4月29日) 8章 GraphXを担当 『ビッグデータ分析・活用のためのSQLレシピ』(2017年3月27日) SQL全般、レコメンドなどを担当
  • 3. / 76 今日の発表予定 • ゼロから始めるSparkSQL徹底活用! 3 19:45 ~ 20:50 発表 Sparkの章 20分 + 質疑応答 5分 SQLの章 20分 + 質疑応答 5分 SparkSQLの章 15分 20:50 ~ 21:00 質疑応答・アンケート 21:00 ~ 21:30 懇親会(ドリンクとお菓子をご用意しています)
  • 5. / 76 A x 人 B x 人 C x 人 D x 人 会場への質問 5 Spark経験有りSpark経験無し SQL経験有り SQL経験無し SQLのSELECT句, FROM句, WHERE句の意味が 分かる 何らかの方法(spark-submit, spark-shell, ...)で Sparkジョブを実行したことがある SQL経験有り Spark経験有り
  • 7. / 76 Sparkの章 • 2015年6月 • IBMがSparkプロジェクトに3500名を投 入と発表 • Apache Spark • オープンソースの分散処理フレームワー クのデファクトスタンダードとなりつつ ある 7 http://jp.techcrunch.com/2015/06/16/20150615ibm-pours-researchers-and-resources-into-apache-spark-project/
  • 9. / 76 Sparkとは? 9 http://spark.apache.org/docs/latest/ Apache Spark is a fast and general-purpose cluster computing system.
  • 10. / 76 Sparkとは? 10 http://spark.apache.org/docs/latest/ It provides high-level APIs in Java, Scala, Python and R, and an optimized engine that supports general execution graphs.
  • 11. / 76 Sparkとは? 11 http://spark.apache.org/docs/latest/ It also supports a rich set of higher-level tools including Spark SQL for SQL and structured data processing, MLlib for machine learning, GraphX for graph processing, and Spark Streaming.
  • 12. / 76 general execution graphs? 12 http://spark.apache.org/docs/latest/ It provides high-level APIs in Java, Scala, Python and R, and an optimized engine that supports general execution graphs.
  • 13. / 76 general execution graphs? • DAG(Directed Acyclic Graph)実行エンジン 13 https://databricks.com/blog/2015/06/22/understanding-your-spark-application-through-visualization.html
  • 14. / 76 general execution graphs? • DAG(Directed Acyclic Graph)実行エンジン • 分かりやすい説明: • http://nave-kazu.hatenablog.com/entry/2015/11/30/154810 • 複雑なデータ処理フローを、循環のない有向グラフで表現 • 実行計画を自動的に最適化してくれる • 適切にキャッシュを用いることで劇的にパフォーマンスを向上 できる 14
  • 15. / 76 general-purpose cluster computing system?? 15 http://spark.apache.org/docs/latest/ Apache Spark is a fast and general-purpose cluster computing system.
  • 16. / 76 general-purpose cluster computing system?? • Sparkは「分散処理のための汎用的なフレームワーク」とよく 言われる • cluster computing (クラスターコンピューティング) ≠ distributed computing (分散処理) 16
  • 17. / 76 general-purpose cluster computing system?? • クラスターコンピューティング • 比較的密なネットワークで接続されたコンピュータを用いて分散処理 を行う • cf. 物理的に離れたコンピュータを用いて分散処理を行う グリッドコンピューティング • 衛星画像の処理、DNA配列のデータベース化など • ネットワークIOが少ない処理に向く 17
  • 18. / 76 general-purpose cluster computing system?? • クラスターコンピューティング • 比較的密なネットワークで接続されたコンピュータを用いて分散処理 を行う • cf. 大量のコアを用いて並列処理を行うGPGPU • 動画エンコーディング、ディープラーニング、ビットコインのマイニ ングなど • 条件分岐がないベクトル計算に向く 18
  • 19. / 76 general-purpose cluster computing system?? • クラスターコンピューティング • 比較的密なネットワークで接続されたコンピュータを用いて分散処理 を行う • クラスターコンピューティングのプログラミングモデル • MapReduce → Hadoop • RDD+DAG → Spark • BSP: Bulk Synchronous Parallel → Apache Hama 19
  • 20. / 76 general-purpose cluster computing system?? • クラスターコンピューティングのプログラミングモデルの特徴 20 プログラミング モデル 特徴 用途 MapReduce 分散ディスクI/Oで高スループット を実現 大規模で単純なバッチ処理 RDD+DAG 複雑な処理をDAGで表現し、 実行計画を最適化 機械学習などの複雑な繰り返し 処理 ※ ただしDeep Learningは難しい BSP 各Worker間で差分データのみを 通信し、ネットワークI/Oを削減 グラフ処理などの単純な繰り返 し処理
  • 21. / 76 【余談】 SparkでDeep Learning • Sparkで利用できるDeep Learningフレームワークまとめ http://data.gunosy.io/entry/spark-deep-learning • Elephas • Deeplearning4j • SparkNet • CaffeOnSpark • TensorFlow on Spark • Sparkling Water (H2O + Spark) http://qiita.com/pyr_revs/items/82443fe9728b2b027948 21 Deep Learningを高速で実 現するためには、GPUの活 用がほぼ必須
  • 22. / 76 【余談】 SparkでDeep Learning - DMMの事例 『Deep Learningを用いた類似画像レコメンドのSQL on Hadoopによる実現』 Cloudera World Tokyo 2016 22 http://labotech.dmm.com/entry/2016/11/11/154709 Deep Learningの処理にはSparkを 用いず、学習結果のみを利用する 方式
  • 23. / 76 fast??? 23 http://spark.apache.org/docs/latest/ Apache Spark is a fast and general-purpose cluster computing system.
  • 25. / 76 fast??? • MapReduceとの比較 • 100倍はさすがに極端な例 (MapReduceが不得意なイテレーション処理での比較) • 全般的には3倍程度速い 25 https://www.slideshare.net/knagato/hive-on-spark-hadoop-spark-conference-japan-2016 Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016
  • 26. / 76 fast??? • MapReduce以外との比較 • スケールアウト可能なSQLエンジンのベンチマークテスト: Presto vs Spark SQL vs Hive on Tez http://recruit.gmo.jp/engineer/jisedai/blog/presto_spark_hive/ 26 SparkとTezが同じくらい、 Prestoはその3倍速い
  • 27. / 76 fast??? • MapReduce以外との比較 • PageRankアルゴリズムのベンチマーク 27 http://www.cl.cam.ac.uk/~ey204/teaching/ACS/R212_2013_2014/presentation/S8/Niko_GraphLabx.pdf Mahout(MapReduce) vs GraphX(Spark) vs PowerGraph(GraphLab) MapReduceよりは速いが、 GraphLabよりは遅い
  • 29. / 76 a rich set of higher-level tools 29 http://spark.apache.org/docs/latest/ It also supports a rich set of higher-level tools including Spark SQL for SQL and structured data processing, MLlib for machine learning, GraphX for graph processing, and Spark Streaming.
  • 30. / 76 a rich set of higher-level tools • 主なSparkコンポーネントと、その競合ソフトウェア 30 分野 Sparkコンポーネント 他のソフトウェア SQL Spark SQL Presto, Hive on Tez, Redshift, BigQuery, ... 機械学習 MLlib TensorFlow, Torch, Mxnet, ... グラフ処理 GraphX Graphlab, Titan, Microsoft Graph Engine, ... ストリーム処理 Spark Streaming Apache Flink, Apache Storm, ... それぞれの分野で見た場合、特出した機能がある訳ではない
  • 34. / 76 では、Sparkのメリットとは? • End-to-endの処理を一つのアプリケーションとして実装できる 汎用性 • 前処理、後処理までSparkで実現可能 • さまざまなインターフェース(Python, Scala, Java, R, SQL) • さまざまなデータソース(HDFS, S3, Kafka, JDBC, ...) • 特定の目的に特化するのであれば、Spark以外の選択肢が最善 の場合もある 同じデータやクラスタを、さまざまな目的で汎用的に使いたい なら、Sparkがベスト 34
  • 35. / 76 Sparkインストール • Spark実行環境 • Java 7以上必須(Java 8推奨) • 必要に応じてScala 2.10+, Python 2.6+/3.4+, R 3.1+をインストール • (Java 7, Scala 2.10, Python 2.6はdeprecated) • ダウンロードページ • http://spark.apache.org/downloads.html • Hadoop関連ライブラリ同梱版も利用できる • https://ja.osdn.net/projects/win-hadoop/ • Windowsの場合は winutils.exe も必要 • 参考: http://hired.hateblo.jp/entry/2015/12/10/183000 35
  • 36. / 76 Spark動作確認 • サンプルプログラムの実行 36 $./bin/run-example SparkPi 10 => Pi is roughly 3.1435951435951437 • サンプルプログラムは ./examples/src/main/* にある • ログレベルを変えるには、conf/log4j.propertiesファイルで指定
  • 37. / 76 Spark動作確認 • Sparkアプリケーションの実行 (spark-submit) 37 # Pythonサンプルプログラムの実行 $./bin/spark-submit examples/src/main/python/pi.py 10 # Rサンプルプログラムの実行 $./bin/spark-submit examples/src/main/r/dataframe.R
  • 38. / 76 Spark動作確認 • インタラクティブシェルの実行 38 $./bin/spark-shell # Scalaシェル $./bin/pyspark # Pythonシェル $./bin/sparkR # Rシェル $./bin/spark-sql # SQLシェル
  • 41. / 76 SQLの章 • The 9 Most In-Demand Programming Languages of 2017 41 http://www.codingdojo.com/blog/9-most-in-demand-programming-languages-of-2017/ 2016年に引き続き、SQLの需要が1位 アプリケーションで実行されるSQLを生で 記述する機会は減っているが、 それ以上に分析用途のSQLの需要が高 まっている。 例: Hive, Redshift, BigQuery, SparkSQL, ...
  • 42. / 76 分析用途でよく使うSQL構文 • CTE(WITH句) • ウィンドウ関数 • フレーム指定 • 集約関数+CASE式 42
  • 43. / 76 実践SQL: ABC分析 • ABC分析のレポート例 • 売上の70%は上位の極少数 の商品で構成される • 売上の合計額を高い順に並 べ、構成比累計を計算 • 構成比累計に従って、 Aランク: 上位0~70% Bランク: 上位70~90% Cランク: 上位90~100% というランク分けを行う 43 『ビッグデータ分析・活用のためのSQLレシピ』 p.116
  • 44. / 76 実践SQL: ABC分析 • サンプル購入ログ (purchase_log) 44 日付 (dt) 商品 (item) 価格 (amount) 2017-03-01 Onion 100 2017-03-01 Tomato 100 2017-03-01 Green Onion 80 2017-03-01 Eggplant 120 … … …
  • 45. / 76 実践SQL: ABC分析 • 月別売上の集計 45 WITH monthly_sales AS ( SELECT item, SUM(amount) AS amount FROM purchase_log WHERE dt BETWEEN '2017-03-01' AND '2017-03-31' GROUP BY item ) SELECT * FROM monthly_sales; item amount Onion 185,000 Tomato 168,000 Green Onion 130,000 Eggplant 98,000 … …
  • 46. / 76 実践SQL: ABC分析 • 構成比、構成比累計の計算 46 WITH monthly_sales AS ( ... ) , sales_composition_ratio AS ( SELECT item, amount , 100.0 * amount / NULLIF(SUM(amount) OVER(), 0) AS comp_ratio , 100.0 * SUM(amount) OVER(ORDER BY amount DESC) / NULLIF(SUM(amount) OVER(), 0) AS cum_ratio FROM monthly_sales ) SELECT * FROM sales_composition_ratio; item amount comp_ratio cum_ratio Onion 185,000 19.331 19.331 Tomato 168,000 17.554 36.886 Green Onion 130,000 13.584 50.470 ウィンドウ関数で全 体売上・累計売上 を計算 分母が0のときは NULLに変換
  • 47. / 76 実践SQL: ABC分析 • ABCランクの判定 47 WITH monthly_sales AS ( ... ) , sales_composition_ratio AS ( ... ) SELECT item , cum_ratio , CASE WHEN cum_ratio BETWEEN 0 AND 70 THEN 'A' WHEN cum_ratio BETWEEN 70 AND 90 THEN 'B' WHEN cum_ratio BETWEEN 90 AND 100 THEN 'C' END AS abc_rank FROM sales_composition_ratio; item cum_ratio abc_rank Onion 19.331 A Tomato 36.886 A … … … Carrot 74.721 B … … … CASE式で値を 変換
  • 48. / 76 実践SQL:検索ログ分析 • サンプル検索ログ (search_log) 48 タイムスタンプ (stamp) セッションID (session) アクション (action) 検索ワード (keyword) 検索結果数 (result_num) 2017-03-01 10:00:00 Fad5bg Search Pstgres 0 2017-03-01 10:00:01 Fad5bg Search Postgres 889 2017-03-01 10:00:05 Fad5bg Click 2017-03-01 10:00:07 Fad5bg Search Hive 864 … … …
  • 49. / 76 実践SQL:検索ログ分析 • 検索アクションの次のアクションを補完する 49 WITH search_log_with_next_action AS ( SELECT action, keyword, result_num , LEAD(action) OVER(PARTITION BY session ORDER BY stamp) AS next_action , LEAD(keyword) OVER(PARTITION BY session ORDER BY stamp) AS next_keyword , LEAD(result_num) OVER(PARTITION BY session ORDER BY stamp) AS next_result_num FROM search_log ) SELECT * FROM search_log_with_next_action WHERE action = 'search'; action keyword result_num next_action next_keyword next_result_num Search Pstgres 0 Search Postgres 889 Search Postgres 889 Click Search Hive 864 … … … 再検索 クリック 離脱 LEAD関数で次のレ コードの値を取得
  • 50. / 76 WITH search_log_with_next_action AS ( ... ) SELECT keyword , COUNT(1) AS search_count , AVG(CASE WHEN next_action = 'search' THEN 1.0 ELSE 0.0 END) AS retry_rate , AVG(CASE WHEN next_action = 'click' THEN 1.0 ELSE 0.0 END) AS click_rate , AVG(CASE WHEN next_action IS NULL THEN 1.0 ELSE 0.0 END) AS exit_rate FROM search_log_with_next_action WHERE action = 'search' GROUP BY keyword; 実践SQL:検索ログ分析 • クリック率、再検索率、離脱率を同時に計算する 50 keyword search_count retry_rate click_rate exit_rate Postgres 1082 0.2145 0.1548 0.6307 … … … 0除算の考慮 は不要 CASE式で0, 1 のフラグ に変換し、AVGで集約
  • 51. / 76 SQLのメリット • ハードウェア(物理設計)に依存しない • 言語仕様が標準化されており、クエリをどのように解釈して実行する かはミドルウェアに依存する • INDEXは標準SQLではない • “標準SQLは、インデックスその他あらゆる物理的なデータアクセス方法を定義 していない”(ジョー・セルコ(著)、ミック(訳)『プログラマのためのSQL 第4版』) • 歴史が長く、ノウハウが蓄積されている 51
  • 52. / 76 SQLのデメリット • 複雑なクエリが読みにくい • WITH句で段階的に記述できるが、限界はある • 冗長な記述になりやすい • SELECT句とWHERE句で同じ計算が必要 • 複雑な計算結果に名前をつけるためだけにサブクエリが必要 • デバッグが難しい • 途中結果を確認できない 52
  • 56. / 76 SparkSQLの章 • SparkSQL • SparkのSQLインターフェイス • SQL単体でもSparkを実行可能 (spark-sqlクライアント) • Scala, Java, Python, RなどのSparkプログラムに、シームレスに組み 込むこともできる 56 http://spark.apache.org/sql/
  • 57. / 76 SparkSQLの章 • DataFrames, Datasetsとの関係 • もともとRDDをSQLライクに操作するための機能であった SchemaRDDsが、 Spark 1.3でRDDから独立してDataFramesとなった • この時点では、型付けやラムダ関数など、RDDが持っていたメリットが損なわれ ており、使い分けが必要だった • Spark 1.6で、RDDとDataFramesのメリットを併せ持つ Dataset APIが 導入され、Spark 2.0でDataFramesはDatasetsに統合された 57 https://databricks.com/blog/2016/07/14/a-tale-of-three-apache-spark- apis-rdds-dataframes-and-datasets.html
  • 58. / 76 SparkSQLの章 • まだアクティブに開発中で、更新が激しい • 最新の機能や使い方については、 GitBook の Mastering Apache Spark 2 が詳しい 58 https://www.gitbook.com/book/jaceklaskowski/mastering-apache-spark/details
  • 59. / 76 SparkSQLの使い方 • DataFrameをアドホックに作成し、テーブルとして登録 59 // Found at http://stackoverflow.com/a/32514683/1305344 val dataset = Seq( "08/11/2015", "09/11/2015", "09/12/2015").toDF("date_string") dataset.registerTempTable("dates") https://jaceklaskowski.gitbooks.io/mastering-apache-spark/content/spark-sql.html
  • 60. / 76 SparkSQLの使い方 • 登録されたテーブルに対してSQLを発行 60 // Inside spark-shell scala > sql( """SELECT date_string, from_unixtime(unix_timestamp(date_string,'MM/dd/yyyy'), 'EEEEE') AS dow FROM dates""").show +-----------+--------+ |date_string| dow| +-----------+--------+ | 08/11/2015| Tuesday| | 09/11/2015| Friday| | 09/12/2015|Saturday| +-----------+--------+ https://jaceklaskowski.gitbooks.io/mastering-apache-spark/content/spark-sql.html
  • 61. / 76 SparkSQLの使い方 • ファイルからDataFrameを作成 61 val df = spark.read.json("examples/src/main/resources/people.json") // Displays the content of the DataFrame to stdout df.show() // +----+-------+ // | age| name| // +----+-------+ // |null|Michael| // | 30| Andy| // | 19| Justin| // +----+-------+ http://spark.apache.org/docs/latest/sql-programming-guide.html 代表的な読み込み関数 spark.read.json spark.read.csv spark.read.orc spark.read.parquet spark.read.text spark.read.jdbc
  • 62. / 76 DataFrame API • SQLだけでなく、DataFramesのオペレーションも使える 62 df.printSchema() // root // |-- age: long (nullable = true) // |-- name: string (nullable = true) // Select only the "name" column df.select("name").show() // +-------+ // | name| // +-------+ // |Michael| // | Andy| // | Justin| // +-------+ http://spark.apache.org/docs/latest/sql-programming-guide.html
  • 63. / 76 DataFrame API • SQLだけでなく、DataFramesのオペレーションも使える 63 // Select everybody, but increment the age by 1 df.select($"name", $"age" + 1).show() // +-------+---------+ // | name|(age + 1)| // +-------+---------+ // |Michael| null| // | Andy| 31| // | Justin| 20| // +-------+---------+ http://spark.apache.org/docs/latest/sql-programming-guide.html
  • 64. / 76 DataFrame API • SQLだけでなく、DataFramesのオペレーションも使える 64 // Select people older than 21 df.filter($"age" > 21).show() // +---+----+ // |age|name| // +---+----+ // | 30|Andy| // +---+----+ http://spark.apache.org/docs/latest/sql-programming-guide.html
  • 65. / 76 DataFrame API • SQLだけでなく、DataFramesのオペレーションも使える 65 // Count people by age df.groupBy("age").count().show() // +----+-----+ // | age|count| // +----+-----+ // | 19| 1| // |null| 1| // | 30| 1| // +----+-----+ http://spark.apache.org/docs/latest/sql-programming-guide.html
  • 66. / 76 実践SparkSQL: ABC分析 • サンプルデータの作成 66 case class Sales(item: String, amount: Int) val monthlySales = Seq( Sales("Onion", 185000), Sales("Tomato", 168000), Sales("Green Onion", 130000) ).toDS() monthlySales.show() +-----------+------+ | item|amount| +-----------+------+ | Onion|185000| | Tomato|168000| |Green Onion|130000| +-----------+------+
  • 67. / 76 実践SparkSQL: ABC分析 • ウィンドウ関数の使用 67 import org.apache.spark.sql.expressions._ monthlySales. withColumn("totalAmount", sum("amount") over Window.partitionBy()). withColumn("cumAmount", sum("amount") over Window.orderBy("amount")). show() +-----------+------+-----------+---------+ | item|amount|totalAmount|cumAmount| +-----------+------+-----------+---------+ |Green Onion|130000| 483000| 130000| | Tomato|168000| 483000| 298000| | Onion|185000| 483000| 483000| +-----------+------+-----------+---------+
  • 68. / 76 実践SparkSQL: ABC分析 • withColumnの連結で前のカラムを再利用できる 68 monthlySales. withColumn("totalAmount", sum("amount") over Window.partitionBy()). withColumn("cumAmount", sum("amount") over Window.orderBy("amount")). withColumn("compRate", lit(100.0) * $"amount" / $"totalAmount"). withColumn("cumRate", lit(100.0) * $"cumAmount" / $"totalAmount"). show() +-----------+------+-----------+---------+--------+--------+ | item|amount|totalAmount|cumAmount|compRate| cumRate| +-----------+------+-----------+---------+--------+--------+ |Green Onion|130000| 483000| 130000| 26.9151| 26.9151| | Tomato|168000| 483000| 298000| 34.7826| 61.6977| | Onion|185000| 483000| 483000| 38.3022|100.0000| +-----------+------+-----------+---------+--------+--------+
  • 69. / 76 実践SparkSQL: ABC分析 • UDFの定義 69 // ABC分析のランク判定用UDF val abcUdf = udf { r: Double => r match { case r if (0 <= r && r <= 70) => "A" case r if (70 < r && r <= 90) => "B" case r if (90 < r && r <= 100) => "C" case _ => "" } }
  • 70. / 76 実践SparkSQL: ABC分析 • UDFの使用 70 monthlySales. withColumn("totalAmount", sum("amount") over Window.partitionBy()). withColumn("cumAmount", sum("amount") over Window.orderBy("amount")). withColumn("compRate", lit(100.0) * $"amount" / $"totalAmount"). withColumn("cumRate", lit(100.0) * $"cumAmount" / $"totalAmount"). withColumn("abcRank", abcUdf($"cumRate")). show() +-----------+------+-----------+---------+--------+--------+-------+ | item|amount|totalAmount|cumAmount|compRate| cumRate|abcRank| +-----------+------+-----------+---------+--------+--------+-------+ |Green Onion|130000| 483000| 130000| 26.9151| 26.9151| A| | Tomato|168000| 483000| 298000| 34.7826| 61.6977| A| | Onion|185000| 483000| 483000| 38.3022|100.0000| C| +-----------+------+-----------+---------+--------+--------+-------+
  • 71. / 76 実践SparkSQL: ABC分析 • SQLの記述との比較 71 WITH sales_composition_ratio AS ( SELECT item, amount , 100.0 * amount / NULLIF(SUM(amount) OVER(), 0) AS comp_ratio , 100.0 * SUM(amount) OVER(ORDER BY amount DESC) / NULLIF(SUM(amount) OVER(), 0) AS cum_ratio FROM monthly_sales ) SELECT item, cum_ratio , CASE WHEN cum_ratio BETWEEN 0 AND 70 THEN 'A' WHEN cum_ratio BETWEEN 70 AND 90 THEN 'B' WHEN cum_ratio BETWEEN 90 AND 100 THEN 'C' END AS abc_rank FROM sales_composition_ratio;
  • 72. / 76 実践SparkSQL: ABC分析 • ロジック中にテストやアサーションを入れられる 72 // amountに0を含むデータ val malMonthlySales = Seq( Sales("Onion", 185000), Sales("Tomato", 168000), Sales("Green Onion", 0) ).toDS() // amount = 0 となるレコードが存在しないことを確認するアサーション assert(malMonthlySales.filter("amount = 0").count == 0, "amount must not be 0") java.lang.AssertionError: assertion failed: Amount must not be 0 at scala.Predef$.assert(Predef.scala:170) ... 48 elided
  • 73. / 76 DataFramesベースのSparkモジュール • ML Pipelines • 機械学習の典型的な処理(モデル、学習、テストなど)をパイプライ ン化 • パイプラインの保存や再利用、パラメタを少しずつ変えて実行などが 簡単に行える • Structured Streaming • DataFrame APIをストリームデータに対して適用できる • GraphFrames • グラフ構造、グラフ処理のためのDataFrames拡張 73
  • 74. / 76 発表まとめ • Spark • End-to-endの処理を一つのアプリケーションとして実装できる汎用性 • 機械学習、グラフ処理、ストリーム処理などのモジュールが充実 • SQL • 分析用途のSQLの需要拡大 • SparkSQL • SparkとSQLの良い所取り • SQLの直感的操作+型安全・Sparkモジュール連携 74
  • 75. / 76 お知らせ(今後のイベント) • 3月28日(火) • 【 ヒカ☆ラボ 】ビッグデータを使ってバナーを動的表示させたらコン バージョンが 323% 増加した話~Golang x Presto での高速集計処理 と Docker を利用した Blue-Green Deployment による無停止の API~ https://atnd.org/events/86105 • 4月11日(火) • 【 ヒカ☆ラボ 】データを武器に変える!エンジニアによるデータ活用 のススメ! https://atnd.org/events/86766 • 4月24日(月) • 【でじらぼ by DMM.com labo】SQLで身につける!初めてのレコメン ド 〜 基礎から応用まで ~ https://atnd.org/events/86479 75