sparkとかいうのをちょっと触ってみる その3

前回の続き
最終回。のつもり。
今回の記事ではspark用語"RDD""DAG"についてちょっと解説しておわり。
まずは
RDDってなんじゃ
ということなんだけど
RDDっていうのは変更されないアイテム。
ただし、
代入されない。
これがRDDの特徴。
RDDには実際のデータの代わりに、「これから代入する」という情報が、保存されている
たとえば
val raw = sc.textFile("./sample_transaction.csv")
と書いた時、みんながいつも使ってる言語なら
変数rawのために用意されたメモリ上にsample_transaction.csvの内容が代入される。
けど、sparkでは
val raw = sc.textFile("./sample_transaction.csv")
と書いた時、
「変数rawに、sample_transaction.csvの内容を代入しますよ」という動作が保存される。
このような情報を保存した変数が、RDDってやつらしい。つまり、いちいちアクセス速度の遅い補助記憶装置からデータを取ってこないで、なにかしらアクションを実行するときに初めて持ってくる。

DAGっていうのは、そのRDD同士の依存関係を保存してるグラフのことをいう。
例を挙げて説明してみる。
sample.csvのなかに"100"という数値データが入っていて、それをhogeという名前のRDDに読み込んでいる。そこに
hogehoge = hoge * 2
という処理をする。このときhogehogeは200ではなく、「hogeを2倍した数値」という処理内容が入っている。さらに
hoge3 = hogehoge + 2;
をした時、hoge3は「hogehogeに2を足した数値」になっている。
つまり、hoge3は、「hogeを2倍にした後、2を足した数値」ということになる。このような依存関係のグラフのことをsparkではDAGと呼ぶ。
こうして、いくつかのRDDと、ひとつのDAGが出来上がったあと、reduceByKeyなどをするときに初めて数値計算が行われる。
このように、計算順序を先に作り上げた上で後から演算する様子のことを「遅延評価」というらしい。
DAGを見ることで変数同士の依存関係が明らかになるため、対故障性もいいんだとか。

sparkはこのへんで終わり。ちなみにこの記事は当blog内100番目の投稿らしい。

sparkとかいうのをちょっと触ってみる その2

前回からの続き。
今回やること
1.csv読み込み
2.データ整形
3.集計
4.コンソール出力
5.ファイル出力
適当なcsvファイルを用意しておく。
今回用意したcsvファイル内容はこれ↓

id,transaction_id,name,quantity,price
1,t1,商品1,5,100
2,t1,商品2,3,150
3,t2,商品3,10,210
4,t2,商品4,2,1050
5,t2,商品5,40,80
6,t3,商品6,150,30
7,t3,商品1,10,100
8,t4,商品4,5,1050

この内容で
sample_transaction.csv
とかいうcsvファイルを作った。
作ったディレクトリと同じ場所に移動しておく。
そしてsparkを起動する。私は
spark-shell
で起動した。

sample_transaction.csvを読み込むコマンドはこう
sp1.png 
val raw = sc.textFile("./sample_transaction.csv")
rawという変数(ほんとは変数ではないけど)にsample_transaction.csvの内容が代入できた。

次に、ヘッダを取得しておく。後で取り除くために。
sp2.png 
val head = raw.first()
これで、変数headにcsvファイルのヘッダが代入できた。

ここで、transaction_id,quantity*priceという構成の新しいデータを作りたいとすると、こうすればいい
sp3.png 
val temp = raw.filter(_!=head).map(row=>{
val fields = row.split(",")
(fields(1),fields(3).toInt*fields(4).toInt)
})
これで、tempの中に目標のデータが集まった。

.take(n)を使えば、変数の中身を見れる。
sp4.png 
take(5)なら、上から5行。

最後に、transaction_idごとに集計したければ
sp5.png 
val summary = temp.reduceByKey((x,y)=>x+y)
で、OK。

今作ったsummaryの中身を表示してみる。本来ならデータ数が莫大な可能性があるのであんまりしないほうが良いそうだ。
sp6.png 
summary.foreach(println)
これで中身がどうなってるかわかる。

最後にファイル出力だが、sparkは出力にファイル名ではなくディレクトリ名を指定するらしい。その中に出力されたファイルが入ってる。summaryをresultディレクトリに出力する。
sp7.png 
summary.saveAsTextFile("./result")
これで
sp8.png 
無事resultフォルダ内に出力結果が保存された。

sparkとかいうのをちょっと触ってみる

申し訳ないけど今回の記事はmac向けです。
apache-sparkなるものをインストールして起動してみるまで
Homebrewをインストールしてない人はインストールすること。(適当なリンク)
sparkはterminalからbrewでインストールできる。
こんな感じで↓
spark2.png 
brew install apache-spark
すると、私の場合こんな風に怒られた
spark3.png 
java1.8を入れろということだったのでjava1.8をブラウザからインストールしたが、何も変わらなかった。
仕方なくエラー文を読むと、「これコピペインストールできるよ❤️」なる文言があったのでそのまま貼り付けて実行した。
spark4.png 
brew cask install caskroom/versions/java8
無事インストールされた。brewいっぱいちゅき❤️。
javaが無事インストールされたら、
もう一度
brew install apache-spark
すれば、sparkがインストールできるはず。
spark5.png 
spark-shell
と打ち込むと
spark1.png 
みたいな画面がでてくるので、これで起動できた。
この起動のしかただと、scalaなる言語をつかうことになる。
scalaで起動したあと、閉じ方がわからなかったので、私は
control+c
で、インタラクティブシェルを閉じた。
pythonなる言語を使ってsparkを使いたいなら、
spark7.pngpyspark
と打てばpythonで動かせる。
pythonのほうの終了方法は、
>>>exit()
と打つだけ。

直交座標と角度の話 その1(三角関数)

ちょっと前に、方眼紙(マス目の紙。方眼紙にx軸y軸をつけたもののことをこれから直交座標とか言うことにする)と角度の相性が悪い話をちょっとした。
だけど、傾きが1とか、傾きが-2とかじゃなくて、30度って言いたい時って結構ある。
たとえば均等に放射状に線を書きたい時。
スクリーンショット 角度をキレイに指定するとき傾きはキレイに指定出来ない
これがとっても嫌なので、直交座標と角度の関係をどうにかしたい。
そのどうにかする奴が、三角関数と呼ばれる奴らだ。
(だいたい、そういう「みんなが使いたさそうなシステム」は、昔の偉い人たちがイイものを用意してる。)
三角関数っていうのは高校に入ったら習うんだけども、その高校で習う三角関数のうちまずは一つ。
tan(角度)から始めよう。
いきなりtan(角度)とかいう呪文が飛び出て来たが、怖がることはない。だいたい、+とかxとかと同じものだと思ってほしい。ただし、足し算や掛け算とは違い、人間が計算することは少し難しい
というわけで計算方法を教える前に、まずtanとは何かというお話。
tan(角度)は「タンジェント」と読む。tangentの略記だ。んで、
tan10°とは、
こんな直線傾きのこと↓
無題
tan30°とは、
こんな直線傾きのこと↓
無題1
で、この「x軸と直線のなす角度」のことを「仰角」というので、これからは仰角という言葉を使ってく。そっちの方が短くで効率的だし。
つまり、仰角60°の直線の傾きはtan60°と書くことが出来るし、仰角135°の直線の傾きはtan135°ということができるわけ。
じゃあ、問題。

問題.
仰角20°、y軸と3で交わる直線の傾きと切片はそれぞれいくら?
無題 
答え 傾きはtan20°、切片は3。わかった?

でだ。
たとえば「傾きtan30°だよ」って誰かに言われて、その直線が書けるかというと、中々難しい。
tan30°という式が、実際にいくらかという計算がとてもめんどくさいからだ(この文を見て、tan30°はOOだよ、と即答できる人は、こんなブログを読んでないはず)。tan30°がいくらかという問題は、プログラマにとってどうでもいい問題で、そんなものはパソコンに計算させればいいだけの話だ。
ちなみに、tan30°という式は0.57735026919だそうだ(グーグル先生に「tan30°」と入れれば出てくる)。
つまり、仰角30°の直線の傾きを伝えるために、「傾き0.57735026919の直線」ではなく「傾きtan30°の直線」とスマートにいうことができるわけ。





傾きとか,切片とかの話 その2 (1次関数)

切片が何かについては前回説明してみた。

ある直線が,y軸と5の位置で交わっている。この直線の切片は何?

これに答えられたらOK。次に進もう。
さて。
直線の高さが指定できるようになったので,得意げに「これは切片が3の直線だよ!切片というのは~」等と言ってみる。
そうすると,その話を聞いた人たちは直線を書く。
こうなる。
無題
ぜんぜんだめじゃん。
確かに切片は3だけどさ!
ということは,切片以外にも「ナニカ」を指定してあげないとダメっぽい。
その「ナニカ」が,「傾き」ってやつだ。だけど,その傾きも,「右肩あがりだよ」だとか「傾きは急だよ」とか「緩やか」だとかそういった漠然とした言い方じゃダメだってこともわかってるはず。じゃあ,どうすればカチッと1つの傾きを100人に間違いなく伝えられるだろうか。
パッと思いつくのは,「角度」で伝えてみるとか。
X軸(まあY軸でもいいんだけど)と直線が交わってる場所の角度で伝えられたら,それが一番いいよね。
だけど,角度で傾きを表すのには,大変な問題がある。
それは何か。
実際にやってみるとわかる。やってみよう。
「切片が0,傾きが30度の直線」を分度器を使って書いてみる。こうなる。
無題1
キリのいい点を全く通らないんだな,これが。
逆に,キリのいい点を通っていく直線↓
無題8
の角度を分度器で測ってみる。無題9だそうだ(丸投げ)。
うんうん。この,単にxが1増えたらyが2上がるだけのグラフを書いて欲しいがために,
「切片が0,傾きが63.43度(もっと正確には63.434948822922度)の直線を書いてください」とお願いしなきゃいけないなんて,ナンセンスでしょ?方眼紙と角度の相性っていうのはかなり,いや,超悪い。特別な手続きを使わないとハッキリ言って無理。
それよりは,
「切片が0,xが1増えるごとにyが2増える直線を書いてください」
のほうがず~~~~っとマシだし,書きやすい。なにしろ,分度器無くても書ける。
この,「xが1増えたときに増えるyの数値」のことを「傾き」ということにしよう。
無題10 
もう一度。

「xが1増えたときに増えるyの数値」のことを「傾き」という

傾きって何?って聞かれたら,「xが1増えたときに増えるyの数値」って答えたらいいだけだからね。
じゃあ問題。

問題.1-a
ある直線は,xが1増えるとyが4増える。この直線の傾きはいくら?

答えは4。わかった?
ちなみに

問題.1-b
ある直線は,xが1増えるとyが4減る。この直線の傾きはいくら?

この場合,増えた量は-4になる。なので傾きは-4。

問題.1-c
ある直線は,xが2増えるとyが4増える。この直線の傾きはいくら?

傾きっていうのは「xが1増えたときに増えるyの数値」なんだから,yの増えた量4をxの増えた量2で割ればいい。傾きは2。

問題.1-d
ある直線は,xが1減るとyが4増える。この直線の傾きはいくら?

この場合,xが1増えるとき,yの増えた量は-4になる。なので傾きは-4。

ここまで来ると,直線の高さがカチッと1つに指定できて,傾きもバッチリ1つに指定できる。これで,誰に書かせても全く同じ直線になる。

じゃあ,方眼紙を用意して。

問題.2
傾きが2,切片が-1の直線を書け

これが出来たら,おわり。


プロフィール

すぺくとる

Author:すぺくとる
ウディタ・Unity・UE4などなど。
MUGEN関連製作物等々は下の方の”星屑の倉庫”に置いてあります。好きに持って帰っていいですよ。
改変転載は要相談ということで。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
カウンター
現在の閲覧者数
現在の閲覧者数:
カーソルに数字を入れるだけでページジャンプできますよ~

Presented by Asondara Nakamada. hen Game
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR