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 に保存されます
- 手順
-
JavascriptVisualizationの名前をオペレーターの任意の名前に変更します。たとえば、「MyCoolOperator」というオペレーターを作成するには、ファイル名
MyCoolOperator.jsおよびMyCoolOperator.scalaを使用します。 - 次の 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 }JavaScriptVisualizationRuntimeはSparkRuntimeを拡張します。- この例では、
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」をテキストとして出力します。