astamuse Lab

astamuse Labとは、アスタミューゼのエンジニアとデザイナーのブログです。アスタミューゼの事業・サービスを支えている知識と舞台裏の今を発信しています。

そうだAsta4dでWebアプリケーションを作ろう(第5回)

Global Handlerとattribute

今回はHandlerの話の続きです。 Handlerの簡単な役割については前回書きましたので、そちらをご覧になってから読んでいただくと理解が深まると思います。 たぶん。

で、今回書く話は個別のルール毎にコントロールを行うHandlerではなく、サイト全体や特定の属性のコントロールを行うHandlerのお話です。

今回のURLルール

package com.astamuse.blog_sample.rules;

import static com.astamuse.asta4d.web.dispatch.HttpMethod.GET;

import com.astamuse.asta4d.web.dispatch.mapping.UrlMappingRuleInitializer;
import com.astamuse.asta4d.web.dispatch.mapping.ext.UrlMappingRuleHelper;
import com.astamuse.blog_sample.handler.DefaultHandler;
import com.astamuse.blog_sample.handler.Handler;
import com.astamuse.blog_sample.handler.LoginCheckHandler;

public class UrlRules implements UrlMappingRuleInitializer{
    private static final String LOGIN_CHECK = "LOGIN_CHECK";

    public void initUrlMappingRules(UrlMappingRuleHelper rules) {
        rules.addDefaultRequestHandler(DefaultHandler.class);
        rules.addDefaultRequestHandler(LOGIN_CHECK, LoginCheckHandler.class);
        rules.add(GET, "/").forward("/html/index.html");
        rules.add(GET, "/{id:[0-9]+}").attribute(LOGIN_CHECK).handler(Handler.class);
    }
}

前回から追加した点を説明していきます。

rules.addDefaultRequestHandler(DefaultHandler.class);
rules.addDefaultRequestHandler(LOGIN_CHECK, LoginCheckHandler.class);

まずはURLルールに今回必要なルールを追加しています。 全体や属性のコントロールなので、個別のルール対してHandlerを設定するのではなくaddDefaultRequestHandlerを使ってルール全体へのコントロールを追加します。

引数1つの場合は、全てのリクエストに対してのルールに対しての処理になり、2つ場合は1つ目の引数に属性を入れてあげて属性が付与されているルールのリクエストに対してのみ処理が行われます。 属性に関してはString型です。定数を作ってあげると管理が楽です。 被ると大惨事が発生してしまうので気を付けなければなりません。 (先に書いた方の処理しか走りません)

rules.add(GET, "/{id:[0-9]+}").attribute(LOGIN_CHECK).handler(Handler.class);

属性を付与する際は個別のルールに対してattibuteで付与します。 こうすることで独自のHandlerの前にaddDefaultRequestHandlerで指定した処理を行ってくれます。

Handlerの実装

package com.astamuse.blog_sample.handler;

import com.astamuse.asta4d.web.dispatch.request.RequestHandler;
import com.astamuse.asta4d.web.dispatch.response.provider.RedirectTargetProvider;

public class LoginCheckHandler {

    @RequestHandler
    public RedirectTargetProvider handle() {
        System.out.println("call LoginCheckHandler");
        return new RedirectTargetProvider("/");
    }
}
package com.astamuse.blog_sample.handler;

import com.astamuse.asta4d.web.dispatch.request.RequestHandler;

public class DefaultHandler {

    @RequestHandler
    public void handle() {
        System.out.println("call DefaultHandler");
    }
}

今回は本題と関係ないので適当です(動けばいいというダメな精神)。 本来であればここで適切なコントロールをすることになります。 Handlerの書き方についてはどんなやり方の時も特に違いはありません。

Global Handlerの実使用例

それでは、実際のケースにおいてどのように使用されているか見ていきましょう。

  • ログイン必須ページのログインチェック
  • レスポンスにヘッダを設定(主にキャッシュコントロールで使用しています)
  • WebAPIの共通チェック

みたいな使い方が例となります。

特定のObjectがHandlerから返却された場合のGlobal処理について

Handlerより特定のObjectが返却された際に表示するページのコントロールを行う方法を合わせて紹介します。 Asta4dでは、Global Forwardの機能が提供されており、特定のObjectが返却された場合、レスポンスステータスと返却するhtmlファイルを指定することが可能となっています。

rules.addGlobalForward(TemplateNotFoundException.class, "/html/error/404.html", 404);

ここではforward先がなかった時にasta4d内で発生するTemplateNotFoundExceptionが発生した場合に404を返すルールを追加しています。

使用例としてはException発生時のエラーコントロールが主となっている。

終わりに

この仕組みを使うことでルールに属性を付与することが可能となり、どのような処理が必要かが一目で分かりやすく表現することが可能になります。

次回予告

最終回はFormを簡単に作れちゃうForm Flowについて説明しようと思います。

関連URL

第1回:環境構築して静的ページを表示するまで
第2回:Snippetを使って動的ページを作ろう
第3回:少し複雑なSnippet
第4回:Handlerの役割と使い方
第5回:Global Handlerとattribute(今ここ)
第6回:Form Flowを使おう

デザインの参考になる(かもしれない)映画8選+α

おつかれさまです、krtです。

この度はデザインの参考になる(かもしれない)映画作品をピックアップしてみました。
何がどのように参考になるのか、イイ感じなのか、をまとめましたので併せてご覧下さい。

ムーンライト

こちらは2017年に開催された米アカデミー賞で初めてLGBTをテーマにした作品での「作品賞」受賞とのことで非常に話題になった作品です。

本作の何がデザイン的にすごいかと言えば、スクリーンに映し出される黒人俳優たちの美しさです。
常にキラキラとした陽光が画面に降り注ぐ日中のシーンでは主人公達の肌は彫刻のようにそれを照り返し、夜間のシーンでは青白い月明かりの下で肌が発光しているかのように映し出されるのです。 これは単に撮影技術が優れているだけではありません。
美しさの最も大きな要因のひとつは、撮影されたあとで俳優の肌にデジタル加工を施していることが挙げられます。 本作はアレックス・ヴィッケルというカラリストが全シーンのカラーバランスを調整し、主に肌の色にこだわって美しい肌つやを実現し、映像をさらに美しく見せているのです。

写真のレタッチでも分量が多いだけで気が滅入るのに、動画となるともう…想像するだけで気が遠くなりますね。 今後は日本でもこういった動画のカラー調整及びレタッチのような仕事もぐんと増えてくるかもしれません。


映画『ムーンライト』予告

※詳しくは下記の記事をお読み下さい www.indiewire.com

ネオンデーモン

こちらも今年に日本公開されたニコラス・ウェンディング・レフン監督の作品です。
本作に限ったことではなく、彼の作品はハイコントラストなカラーリングが特徴的で、その極彩色の世界観によってグロテスクな空間を作りだすのが得意な監督です。

最近知ったことなのですが彼は中間色が見えづらい色覚異常があるためハッキリした色でなければ画面の識別がしづらいとの告白をしていました。 だからといって作品全てのシーンがハイコントラストというわけではなく、淡い色をベースにまとめたシーンも見受けられます。
ネオンカラーがまばゆい作品ではありますが、コントラストを付けるだけでなく淡い色の変化の中でもきっちりとした色調の差によってクリアな画面を作り出すヒントになる作品だと言えます。


The Neon Demon Official Trailer #1 (2016) - Elle Fanning, Keanu Reeves Horror Movie HD

タンジェリン

こちらはなにが驚きかというと、全編iphone5sにアナモレンズを取り付けて撮影された作品であるということです。
短編作品や学生の作品などではスマホ撮影の映画はさほど珍しくはないかもしれません。 また長編作でもワンシーンだけ利用されることもあるのですが、本作は88分の中編作品でそれなりの上映時間です。 変化球の機材を使用した映像作品は「これで撮影された」という触れ込みが出オチになってしまうため、1時間以上観客の興味を持続させるには骨が折れる作業だったに違いありません。
ただiphoneを使って撮影されたという以上に試みとしてチャレンジングな作品であったと言えます。 そのチャレンジとクリエイティビティをぜひ一度見てみることをお勧めします。


Tangerine - Red Band Trailer

ハードコア

先の『タンジェリン』はiphone5sでの撮影とのことでしたが、こちらはなんと全編GoProで撮影されています。
撮影で使用されたカメラはGoPro HERO3 Black Edition。

http://www.tajima-motor.com/gopro/hero3/www.tajima-motor.com

しかしながらこちらは米国GoPro社の全面バックアップがあったとのことで、多少なりともプロモーション的な意味合いもあったのかもしれません。
またGoPro撮影といったらもうお分かりかと思いますが、全編主人公目線のPOV形式のアクション映画なので大画面でSPF動画を観ているような感覚です。 つまりは画面酔いが著しいので三半規管が弱い人は見る際に十分気をつけましょう。

『タンジェリン』にも言えることですが、トリッキーな撮影機材を使用するということ、つまりは作るための道具(ツール)を変えるという単純なことによって、もしかしたら世界の見方を変えられるのではないか?そして想像もしていなかった新しいコンテンツを創ることができるのではないか?という可能性を感じさせてくれる作品になっています。


映画『ハードコア』日本版予告編

グランド・ブダペスト・ホテル

本作は2014年公開のウェス・アンダーソン監督作品です。
この監督作品もかなり特徴があり、画面構成がとにかくキッチリしたシンメトリーで構成され、徹頭徹尾カラーコーディネートされています。 小道具から大道具、衣装、風景、全てにおいて神経質なまでに配慮が行き届き、ポップであるにもかかわらず濃密な作家性が作り出されています。

ここまでキレイにバランスが取れた画面構成はデザイナーの方だと見ていて気持ちが良いくらいなのではないでしょうか。
『神は細部に宿る』、とはよく言ったもので細部まで計算して設計することの美しさがよく分かる作品の1つです。


映画『グランド・ブダペスト・ホテル』特報

フェイズIV 戦慄!昆虫パニック

打って変わってこちらの作品は1974年の作品です。
グラフィックデザイナーの方には馴染みのある、ソール・バスが監督した作品です。 彼は映画のタイトルバックデザインの先駆者とも言われており、タイトルバックデザインに初めてコンピューターグラフィックを取り入れたのも、キネティック・タイポグラフィを導入したのもソール・バスです。
googleロゴでも彼の作品動画を制作していたので知っている人も多いのではないでしょうか。


Doodle for Saul Bass' 93rd Birthday

そんな彼の本作のテーマは虫。虫っていうか主に蟻。
パニックホラーのようなタイトルなので手に取りにくい作品かも知れませんが、やはりそこはソール・バス、映像表現が巧み。
いや、匠。
普通の蟻を撮影しているだけなのですが、無言の蟻たちの意識が手に取るようにわかるその演出、映像表現は普通の映像作家とは違ったの世界観を作り出しています。
グラフィックデザイナーの方は話の種に、ぜひ一度ご覧になることをオススメします。


Phase IV (1974) Trailer (※後半のフラッシュの点滅にご注意ください)

ソング・オブ・ザ・シー 海のうた

こちらはもう…キュート・プリティー・ビューリフォー!
しかし本作はただ可愛いだけではなく、キャラデザイン、特にデフォルメのバランス感覚が卓越しています。
アイルランドに伝わる神話を元に製作された本作は、ピクト文化という古代から伝わるデザインを取り入れているとのことです。
古くから存在するデザインパターンやイメージを取り込んではアップデートし、それによって新しいコンテンツを製作するという試みは日本が得意とするアプローチ方法でもありますが、本作はそのアプローチを最も洗練した形で応用している作品と言えるでしょう。


「ソング・オブ・ザ・シー 海のうた」ミュージッククリップ

ユーリー・ノルシュテイン作品集

ロシアのアニメーション作家、ユーリー・ノルシュテインの6本の短編(『25日・最初の日』『ケルジェネツの戦い』『アオサギとツル』『キツネとウサギ』『霧の中のハリネズミ』『話の話』)を集めた作品集です。

6本それぞれの特徴を上げると、『25日・最初の日』はロシアン・アヴァンギャルド的でありつつもキュビズム的な立体感があり、『ケルジェネツの戦い』は宗教絵画的でフレスコ画やテンペラ画を彷彿とさせます。 『アオサギとツル』は日本の浮世絵や水墨画から着想を得た作品らしく、また初めて複数の背景を重ねる手法を取り入れた画期的な作品のひとつです。 『キツネとウサギ』『霧の中のハリネズミ』の2作は童話的で絵本の世界観がそのまま動いている、という印象なのですが『キツネとウサギ』はロシアの民話を元にしたストーリーで、ガラジェッツ絵画と呼ばれるデザインパターンを取り入れた色彩が豊かな作品となっています。 一方『霧の中のハリネズミ』は背の低いハリネズミが空を見上げたり、霧の中に迷い込んだりするシークエンスは奥行きを感じさせる演出で、こちらは多層にしたガラス面に切り絵を配置して奥行きを演出する、マルチプレーンという手法が用いられています。
最後の『話の話』は上記の一連の手法やテーマを総括した作品のように見えます。また、そこに観念的な要素が組み合わさっていため1回観るだけだとなかなか理解が難しい作品でもあります。

このように様々な手法を柔軟に取り入れた作風なのですが、全ての作品に統一感があります。 新しい手法を積極的に作品へ取り込む柔軟性と応用力の高さ、また取り入れるだけでなく自分のものにしている部分などは、分野・時代が違えど見習うべき美徳であります。


ユーリー・ノルシュテイン監督特集上映「アニメーションの神様、その美しき世界」予告編

おまけ

アート・オブ・デザイン www.netflix.com

これは映画ではなく、ネットフリックス制作のデザイナーに焦点をあてたドキュメンタリードラマ(?)です。

全8回で1作40分前後なのでさくっと見ることができます。 また、取り上げられている作家はイラストレーター、フットウェアデザイナー、舞台デザイナー、建築家、自動車デザイナー、グラフィックデザイナー、フォトグラファー、インテリアデザイナー。 とっても幅が広い。 見るだけで創作意欲が刺激されますし、そもそもデザイナーに焦点を当てるというのも少々珍しく貴重で素敵なドキュメンタリーだと言えます。 ぜひ2シーズン目も作成していただきたいものです。

以上8本+αのご紹介でした。

Databricks Community Edition で Spark に触れる

山縣です。

今回は Spark を無料で手軽に触れる Databricks Community Edition について書きたいと思います。

Databricks Community Editionとは

Databricks は Databricks 社が提供しているSparkサービスで、Community Edition はその無料版にあたります。

無料にもかかわらずメモリ6GBのAWSのインスタンスとNotebook が使えるというなかなか太っ腹なサービスです。

弊社では Cloudera社の CDH のクラスタがありSparkもその上で動かしていますが、個人的にSpark そのものの動作を確認したり、異なるバージョンを触りたいときに時々使わせてもらっています。

Sparkの学習用環境としては十分な機能が備わっていると思いますので、簡単に紹介したいと思います。

ユーザ登録

Community Editionを使用するためにはユーザ登録が必要です。

ユーザ登録はTRY DATABRICKS画面の右側の Community Edition の下にある
START TODAY ボタンを押してフォームに情報を入力します。 クレジットカードなどの課金情報の入力は必要ありません。 フォームを登録後、登録したアドレスにメールが来るのでリンクをクリックしてメールアドレスの確認ができれば完了です。

一般的な Web サービスのユーザ登録と変わらないと思います。

登録が完了したら ログイン画面からログインします。

ログインすると下記のような画面になります。

f:id:astamuse:20170517163345p:plain

左縦にメニューがあります。

クラスタの起動

まずは Spark クラスタを作成・起動します。

左側のメニューの Clusters ボタンを押すと、クラスタの一覧表示の画面になります。 画面上部にある + Create Cluster ボタンを押して新規にクラスタを作成します。

f:id:astamuse:20170517164313p:plain

Cluster Name に適当に名前を入れ、Databricks Runtime Version で起動したい Sparkを選択します。

選択するSparkの一覧は大まかに言ってSpark のバージョンそのものと、Scala のバージョンを 2.10 にするか 2.11 にするかの組み合わせの一覧となっています。

f:id:astamuse:20170517173935p:plain

Sparkのバージョン名は Spark <バージョン>-dbN という形式になっており、<バージョン>の部分は元となるApache Spark のバージョンを、 dbN の部分はdatabricks release番号を示しています。 同じSparkのバージョンに対してDatabricks がbackport や独自機能を加えてリリースしています。

また (Auto-updating) となっているものはdatabricks release が常に最新のものを自動的に選択するようになります。

なおこの記事を書いている時点で Spark2.2 のRC2 が利用可能になっていました。 折角なので “Spark 2.2 RC2 (Experimental, Scala 2.11)” を指定します。

Community Edition の場合、Instance の細かいカスタマイズ等は出来ませんので、あとは AWS の AZ の選択とSpark の Config を指定するのみです。 ここでは何も指定せず、Create Cluster ボタンを押して起動します。

Cluster 一覧画面に戻り、しばらくすると起動が完了します。

f:id:astamuse:20170517164502p:plain

起動したクラスタは Spark のWebUIである、Spark UI にアクセスすることができます。SparkUIを見ると起動したクラスタの詳細が分かります。

f:id:astamuse:20170517164753p:plain

Environment を見てみると spark.master が “local[8]” となっておりlocalモードで起動していることが分かります。

またログを確認することもできます。 起動したクラスタはアイドル状態がしばらくすると自動的に停止します。停止したクラスタは一覧に Terminated Cluster として残っていますので再起動可能です。

Workspace

Workspace はルートフォルダでNotebook やライブラリなどはすべて Workspace 以下に保管することになります。サブフォルダを作ることもできます。 標準で共有用の Shared というフォルダとユーザのホームフォルダである Users/<アカウント> があります。Shared は企業などが複数のアカウント間でNotebook などを共有するためのフォルダのようです。とりあえず今回は Users/<アカウント>以下にNotebook やライブラリを置いていきます。

f:id:astamuse:20170517173542p:plain

Notebook

コードはNotebookに書いていきます。 Databricks の NotebookはIPython と互換性があるそうなのでIpython ベースなのかもしれません。

左メニューの Workspace から Users → <メールアドレス>を選択して Create→Notebook を選択します。

f:id:astamuse:20170518122510p:plain

Name を適当に入れ、 Language で使いたいプログラミング言語を選択します。 言語は Scala, Python, SQL, R が選べます。 ここでは Scala を選びます。

またNotebookを実行するにはSparkクラスタにアタッチする必要がありますので、接続する Spark クラスタとして先ほど作成したクラスタを選択します。

作成後、空のセルが一つだけあるノートブックが表示されます。

空のセルに以下の内容をコピペして Shift + Enter でセルを実行します。

case class T1(id:Int, message:String)
val ds1 = Seq(T1(1, "Hello"), T1(2, "World"), T1(3, "Hello"), T1(4, "Spark")).toDS
display(ds1)

f:id:astamuse:20170519163929p:plain

display() によって結果を表示することができます。

上記のセル実行後に下に空のセルができますので、さらにコードを追加します。

ds1.createOrReplaceTempView("t1")
val ds2 = spark.sql("select message, count(*) as num from t1 group by message order by num desc")
display(ds2)

f:id:astamuse:20170519164242p:plain

Notebook には以下の変数が事前に定義されています。

  • sc:SparkContext
  • sqlContext:HiveContext
  • spark:SparkSession (2.0以降)

結果はテーブルだけでなくグラフとして表示することもできます。 結果の左下のグラフボタンを押すとグラフに変えることができます。

f:id:astamuse:20170519165254p:plain

このNotebook は Scala 用として作成しましたが、他の言語のセルを追加することも出来ます。 上記の Scala で書いたSQLクエリは以下のように直接書くことも可能です。

%sql
select message, count(*) as num from t1 group by message order by num desc

%sql 以外に %python, %r, %scala, %sh(shell), %fs(Databricks Utilities) の指定もできます。

DBFS

Databricks の固有機能としてDBFS(Databricks File System)が使えます。 これは AWS S3上に作れらたファイルシステムでSSDにキャッシュすることで高速化しているとのことです。DBFS は Scala と Python から利用することが可能で、dbutils (Databricks Utilities)というライブラリ経由でアクセスします。dbutils は Notebook にビルトインされているので簡単に利用可能です。

display(dbutils.fs.ls("/"))

f:id:astamuse:20170518174807p:plain

fsのヘルプは以下のようにしてみることが可能です。

dbutils.fs.help()

f:id:astamuse:20170518175022p:plain

sparkのデータの保存先としても利用可能です。 下記ではDataset ds1 を parquet フォーマットで書き込んでいます。

ds1.write.parquet("dbfs:/tmp/ds1")
display(dbutils.fs.ls("/tmp/ds1"))

f:id:astamuse:20170519174223p:plain

Table

Databricks ではテーブルを利用することができます。 テーブルの作成はデータのインポートにより行います。データのインポート元してはファイルのアップロード、AWS S3などいくつかを選ぶことが可能です。

ここでは総務省が運用している統計データダッシュボードサイト のAPI を使って国内の都道府県別、年代別、西暦別の人口データををCSVとしてダウンロードしてインポートしてみます。また都道府県マスタもダウンロードします。

$ wget -O - 'http://data.e-stat.go.jp/dashboard/api/1.0/Csv/getData?Lang=JP&ParentRegionCode=00000&IndicatorCode=0201010010000010010,0201010010000010020,0201010010000010030' |tail -n +31 > jp_population.csv

$ wget -O - 'http://data.e-stat.go.jp/dashboard/api/1.0/Csv/getRegionInfo?Lang=JP&ParentRegionCode=00000'|tail -n +18 > jp_region.csv

$ head jp_population.csv
"indicatorCd","unitCd","statCd","regionCd","timeCd","cycle","regionRank","isSeasonal","isProvisional","value","cellAnnotations"
"0201010010000010010","090","20020101","01000","1975CY00","3","3","1","0","1312611",
"0201010010000010010","090","20020101","02000","1975CY00","3","3","1","0","380218",
...

$ head jp_region.csv
"upAreaCd","upAreaNm","upHiragana","areaCd","areaNm","areaLevel","hiragana","fromDate","toDate"
"00000","全国","ぜんこく","01000","北海道","3","ほっかいどう","190001","999912"
"00000","全国","ぜんこく","02000","青森県","3","あおもりけん","190001","999912"
...

上記の方法でダウンロードしたCSVをインポートします。 左メニュー → Tables→ +Create Tables でインポート画面が出ます。インポートのソースとしてFile を選択して jp_popluation.csv をアップロードを行います。

f:id:astamuse:20170519121655p:plain

Preview Table を押して Table name に “jp_population” を入力、First row is headerをチェックします。カラムのデータ型を選べますが、面倒なので String のままにしておきます。 (この辺データを見て自動で推測してくれると楽なのですが。)

最後に Create Table を押します。 なぜか画面にエラーメッセージが一瞬出ますが、問題なく登録できます。 作成したテーブルはSQLからその名前でアクセス可能です。

%sql
select * from jp_population

f:id:astamuse:20170519124844p:plain

同様に都道府県データを jp_region という名前でテーブルに登録します。

f:id:astamuse:20170519124634p:plain

インポートした二つのテーブルをJoinして使いやすいようにしてみます。

val pop = spark.sql("""
select 
  regexp_replace(p.timeCd, 'CY00', '') as Year,
  r.areaNm as Prefecture, 
  case p.indicatorCd
    when '0201010010000010010' then '0~14歳'
    when '0201010010000010020' then '15~64歳'
    when '0201010010000010030' then '65歳以上'
    else 'その他' END as Age,
  cast(p.value as Int) as Population
from jp_population p join jp_region r on p.regionCd = r.areaCd
""")
pop.createOrReplaceTempView("pop")
display(pop)

上記処理によって “prefecture”, “year”, “population” をフィールドとして持つテーブル “pop” を作ることができました。

例えばこのテーブルを使って東京都の西暦、年齢層のグラフを作ると以下のようになります。

f:id:astamuse:20170519151841p:plain

外部ライブラリの利用

外部ライブラリの利用はScala/Javaの場合は JAR ファイルをアップロードするか、Maven Central/Spark Pcakages からダウンロードするかになります。

まず Maven から 自然言語処理ライブラリであるStandford CoreNLPをダウンロードしてみます。

ライブラリの取り込みもNotebook と同じようにWorkspace のフォルダ内のメニューで Create → Library と実行します。

Source として Maven Coordinate を選択し、Search Spark Packages and Maven Central を押します。

検索ボックスに corenlp と入れ、spark-corenlp を、Rleases は利用している Scala のバージョンに合うものを選択します。ここでは “0.2.0_s_2.11” を選択しました。

f:id:astamuse:20170519152750p:plain

元の画面に戻るので Create Library を押すと、選択したフォルダ内にライブラリが作られます。

早速利用してみます。

import org.apache.spark.sql.functions._
import com.databricks.spark.corenlp.functions._

val input = Seq(
  (1, "<xml>Stanford University is located in California. It is a great university.</xml>")
).toDF("id", "text")

val output = input
  .select(cleanxml('text).as('doc))
  .select(explode(ssplit('doc)).as('sen))
  .select(
    'sen, tokenize('sen).as('words)
   )
display(output)

f:id:astamuse:20170519155320p:plain

とりあえずトークナイズはできました。他の機能も使ってみます。

val output = input
  .select(cleanxml('text).as('doc))
  .select(explode(ssplit('doc)).as('sen))
  .select(
    'sen, tokenize('sen).as('words),
    ner('sen).as('nerTags),
    sentiment('sen).as('sentiment),
    lemma('sen).as('lemma)
  )
display(output)

f:id:astamuse:20170519155718p:plain

ner(), sentiment(), lemma() というメソッドを使おうとしましたがエラーとなりました。 language model データが無いのが原因なのですが、Maven経由ではlanguage modelデータを入れられませんでした。 調べてみると Databricks社のほうで、対応方法を記したNotebookが出ていました。

こちらは model の jar ファイルをダウンロードしてSprkContext に直接jarを追加するというやり方です。このやり方を試してみましたが、残念ながらうまく動きませんでした。さらに調べているとクラスローダを取得してそちらに追加する方法を書かれている人もいましたがこちらもうまく行きませんでした。 仕方ないので model の jar ファイルをライブラリとして直接アップロードを試みました。

これは先ほどの Maven経由と同じ手順で方法で “Create” → “Library” としてSource を “Upload Java/Scala JAR” にしてファイルを指定する方法となります。

残念ながらmodel のJARファイルは1GB近くあり、アップロードの途中でエラーとなってしまいました。最終的には model jarファイルを3つに分割してアップロードすることで何とか対応できました。

f:id:astamuse:20170519162054p:plain

ライブラリ登録後、再度実行すると今度は結果を返すことができました。

APIによる操作

Databricks はREST API を提供しており多くの操作がAPI経由で可能です。

APIの認証はBASIC認証で行われ、ユーザとパスワードはWebUIにログインするときと同じものとなります。

APIへのアクセスは以下のURLになります。

https://community.cloud.databricks.com/api/2.0/…

例えばクラスタの一覧を得るには以下のような URL でアクセスします。

https://community.cloud.databricks.com/api/2.0/clusters/list f:id:astamuse:20170519174852p:plain

APIに関する情報はこちらのドキュメントにあるので参照してください。

終わりに

以上、Databricks Community Edition で使える機能について見てみました。無料で使える割にはクラスタの作成、Notebook、データストアと必要な機能が一通りそろっておりSparkの学習をしたい人にはかなりおススメです。

最後に弊社では Spark をはじめとして様々なデータ処理や基盤構築などを行うソフトウェアエンジニアを募集中です。興味のある方はこちらのサイトをご参照ください。

Copyright © astamuse company, ltd. all rights reserved.