Scala と Java スクリプトを使用したカスタム ビジュアライゼーションの作成

カスタム オペレーター SDK、共通 JavaScript ライブラリ D3、Plotly、Dojo を使用してビジュアライゼーションを作成できます。

この例を実行してカスタム ビジュアライゼーションを作成します。ワークフローに慣れたら、例をカスタマイズして独自のカスタム ビジュアライゼーションを作成します。
始める前に カスタム オペレーター」に関するセクションを確認してください。

利用バージョンへのカスタム サンプル オペレーターのインストール」をインストールします。

SDK に含まれる次の 2 つのファイルは、JavaScript 視覚化に必要です。

  • JavaScriptVisualization.js - /src/main/resources/javascript/ に保存されます。
  • JavascriptVisualization.scala - /src/main/scala/com.alpine.plugin.samples/advanced/JavascriptVisualization.scala に保存されます

    手順
  1. JavascriptVisualization の名前をオペレーターの任意の名前に変更します。

    たとえば、「MyCoolOperator」というオペレーターを作成するには、ファイル名 MyCoolOperator.js および MyCoolOperator.scala を使用します。

  2. 次の Scala サンプル コードを確認してください。
    class JavascriptVisualizationRuntime extends SparkRuntime[HdfsTabularDataset, IONone] {
    
        [...]
            override def createVisualResults(context: SparkExecutionContext,
                                            input: HdfsTabularDataset,
                                            output: IONone,
                                            params: OperatorParameters,
                                            listener: OperatorListener): VisualModel = {
            val dataset = context.visualModelHelper.createTabularDatasetVisualization(input)
            val tabularModel = dataset.asInstanceOf[TabularVisualModel]
            
            val columnName = params.getTabularDatasetSelectedColumn(JavascriptVisualizationUtil.COLUMN_TO_ANALYZE)._2
            val i = tabularModel.columnDefs.indexWhere(columnDef => columnDef.columnName == columnName)
            
            val compositeVisualModel = new CompositeVisualModel()
            if (i != -1) {
                val valuesSet = tabularModel.content.map(row => row(i))
                compositeVisualModel.addVisualModel("Data Cloud",
                new JavascriptVisualModel("execute", Option.apply(valuesSet)))
            } else {
                compositeVisualModel.addVisualModel("Data Cloud",
                new JavascriptVisualModel("execute", Option.apply("No results")))
            }
            compositeVisualModel.addVisualModel("Hello World",
                new JavascriptVisualModel("simpleFunction", Option.apply("")))
            compositeVisualModel
            }
    • JavaScriptVisualizationRuntimeSparkRuntime を拡張します。
    • この例では、createVisualResults をオーバーライドしてカスタム コードを挿入します。カスタマイズのために、パラメーターを定義どおりに維持します。
    • CompositeVisualModel() は例の中心部であり、ビジュアライゼーションの作成と定義を行います。 CompositeVisualModel は、出力に複数の「タブ」を含めることができることを意味します。この例では、2 つのタブを含むビジュアライゼーションを作成します。1 つは「word cloud」、もう 1 つは「Hello World」という単純なテキストです。
    • この例では、CompositeVisualModel 内で、次の構造を使用して JavascriptVisualModel を作成します。
      case class JavascriptVisualModel(
                functionName:String,
                data: Option[Any]) extends VisualModel
    • JavaScript コードは関数 simpleFunction を実行します。
    • この例では、CompositeVisualModel を返します。

    サンプル JavaScript コードを編集する前に、オペレーターの署名クラスをチェックして、メタデータに useJavascript=True が含まれていることを確認してください。この設定がないと JavaScript コードは実行されません。

3. JavaScript ファイルで、Scala コードから呼び出される関数を定義します。

次のコード例では、ワードクラウドの例で JavaScript を使用しています。
define([
    "dojo/dom-construct",
    "dojo/dom-geometry"
], function(domConstruct, domGeo) {
    return {
        /**
        * @param outpane The enclosing html <div> in which the Javascript code should place elements into
        * @param visualData Data specified by the custom operator in createVisualResults() when creating the JavascriptVisualModel
        */
        execute: function(outpane, visualData) {
            var geo = domGeo.position(outpane);
            var canvas = domConstruct.create('canvas', {width: geo.w, height: geo.h}, outpane);
            var context = canvas.getContext('2d');
                // Trivial visualization example - all elements in visualData (an array) are randomly positioned in the canvas with random colors
            for (var i = 0; i < visualData.length; i++) {
                context.fillStyle = 'rgb('+Math.floor(Math.random() * 255)+','+Math.floor(Math.random() *
                    255)+','+ Math.floor(Math.random() * 255)+')';
                context.fillText(visualData[i], 100 + (Math.random() * (geo.w - 200)), 100 + (Math.random() * (geo.h - 200)));
            }
        },
        simpleFunction: function(outpane, visualData) {
            var span = domConstruct.create('span', {}, outpane);
            span.innerHTML = "Hello World"
        }
    };
});
結果 
  • execute 関数はワード クラウドを作成し、JavaScript 組み込みキャンバス テクノロジを使用します。
  • 関数 simpleFunction は、「Hello World」をテキストとして出力します。