mirror of
https://github.com/apache/zeppelin
synced 2026-05-24 09:38:26 +00:00
### What is this PR for? `AdvancedTransformation` has more detailed options while providing existing features of `PivotTransformation` and `ColumnselectorTransformation` which Zeppelin already has  Here are some features which advanced-transformation can provide. 1. **(screenshot)** multiple sub charts 2. **(screenshot)** parameter widgets: `input`, `checkbox`, `option`, `textarea` 3. **(screenshot)** expand/fold axis and parameter panels 4. **(screenshot)** clear axis and parameter panels 5. **(screenshot)** remove duplicated columns in an axis 6. **(screenshot)** limit column count in an axis 7. configurable char axes: `valueType`, `axisType`, `description`, ... 8. configurable chart parameters 9. lazy transformation 10. parsing parameters automatically based on their type: `int`, `float`, `string`, `JSON` 11. multiple transformation methods 12. re-initialize whole configuration based on spec hash. 13. **(screenshot)** shared axis #### API Details: Spec `AdvancedTransformation` requires `spec` which includes axis and parameter details for charts. - Let's create 2 sub-charts called `simple-line` and `step-line`. - Each sub chart can have different `axis` and `parameter` depending on their requirements. ```js constructor(targetEl, config) { super(targetEl, config) const spec = { charts: { 'simple-line': { sharedAxis: true, /** set if you want to share axes between sub charts, default is `false` */ axis: { 'xAxis': { dimension: 'multiple', axisType: 'key', }, 'yAxis': { dimension: 'multiple', axisType: 'aggregator'}, 'category': { dimension: 'multiple', axisType: 'group', }, }, parameter: { 'xAxisUnit': { valueType: 'string', defaultValue: '', description: 'unit of xAxis', }, 'yAxisUnit': { valueType: 'string', defaultValue: '', description: 'unit of yAxis', }, 'dashLength': { valueType: 'int', defaultValue: 0, description: 'the length of dash', }, }, }, 'step-line': { axis: { 'xAxis': { dimension: 'single', axisType: 'unique', }, 'yAxis': { dimension: 'multiple', axisType: 'value', }, }, parameter: { 'xAxisUnit': { valueType: 'string', defaultValue: '', description: 'unit of xAxis', }, 'yAxisUnit': { valueType: 'string', defaultValue: '', description: 'unit of yAxis', }, 'noStepRisers': { valueType: 'boolean', defaultValue: false, description: 'no risers in step line', widget: 'checkbox', }, }, }, } this.transformation = new AdvancedTransformation(config, spec) } ``` #### API Details: Axis Spec | Field Name | Available Values (type) | Description | | --- | --- | --- | |`dimension` | `single` | Axis can contains only 1 column | |`dimension` | `multiple` | Axis can contains multiple columns | |`axisType` | `key` | Column(s) in this axis will be used as `key` like in `PivotTransformation`. These columns will be served in `column.key` | |`axisType` | `aggregator` | Column(s) in this axis will be used as `value` like in `PivotTransformation`. These columns will be served in `column.aggregator` | |`axisType` | `group` | Column(s) in this axis will be used as `group` like in `PivotTransformation`. These columns will be served in `column.group` | |`axisType` | (string) | Any string value can be used here. These columns will be served in `column.custom` | |`maxAxisCount` | (int) | The maximum column count that this axis can contains. (unlimited if `undefined`) | |`valueType` | (string) | Describe the value type just for annotation | Here is an example. ```js axis: { 'xAxis': { dimension: 'multiple', axisType: 'key', }, 'yAxis': { dimension: 'multiple', axisType: 'aggregator'}, 'category': { dimension: 'multiple', axisType: 'group', maxAxisCount: 2, valueType: 'string', }, }, ``` #### API Details: Parameter Spec | Field Name | Available Values (type) | Description | | --- | --- | --- | |`valueType` | `string` | Parameter which has string value | |`valueType` | `int` | Parameter which has int value | |`valueType` | `float` | Parameter which has float value | |`valueType` | `boolean` | Parameter which has boolean value used with `checkbox` widget usually | |`valueType` | `JSON` | Parameter which has JSON value used with `textarea` widget usually. `defaultValue` should be `""` (empty string). This ||`defaultValue` | (any) | Default value of this parameter. `JSON` type should have `""` (empty string) | |`description` | (string) | Description of this parameter. This value will be parsed as HTML for pretty output | |`widget` | `input` | Use [input](https://developer.mozilla.org/en/docs/Web/HTML/Element/input) widget. This is the default widget (if `widget` is undefined)| |`widget` | `checkbox` | Use [checkbox](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/checkbox) widget. | |`widget` | `textarea` | Use [textarea](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea) widget. | |`widget` | `option` | Use [select + option](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select) widget. This parameter should have `optionValues` field as well. | |`optionValues` | (Array<string>) | Available option values used with the `option` widget | Here is an example. ```js parameter: { // string type, input widget 'xAxisUnit': { valueType: 'string', defaultValue: '', description: 'unit of xAxis', }, // boolean type, checkbox widget 'inverted': { widget: 'checkbox', valueType: 'boolean', defaultValue: false, description: 'invert x and y axes', }, // string type, option widget with `optionValues` 'graphType': { widget: 'option', valueType: 'string', defaultValue: 'line', description: 'graph type', optionValues: [ 'line', 'smoothedLine', 'step', ], }, // HTML in `description` 'dateFormat': { valueType: 'string', defaultValue: '', description: 'format of date (<a href="https://docs.amcharts.com/3/javascriptcharts/AmGraph#dateFormat">doc</a>) (e.g YYYY-MM-DD)', }, // JSON type, textarea widget 'yAxisGuides': { widget: 'textarea', valueType: 'JSON', defaultValue: '', description: 'guides of yAxis ', }, ``` #### API Details: Transformer Spec `AdvancedTransformation` supports 3 transformation methods. The return value will depend on the transformation method type. ```js const spec = { charts: { 'simple': { /** default value of `transform.method` is the flatten cube. */ axis: { ... }, parameter: { ... } }, 'cube-group': { transform: { method: 'cube', }, axis: { ... }, parameter: { ... }, } 'no-group': { transform: { method: 'raw', }, axis: { ... }, parameter: { ... }, } ``` | Field Name | Available Values (type) | Description | | --- | --- | --- | |`method` | `object` | designed for [amcharts: serial](https://www.amcharts.com/demos/date-based-data/) | |`method` | `array` | designed for [highcharts: column](http://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/demo/column-basic/) | |`method` | `drill-down` | designed for [highcharts: drill-down](http://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/demo/column-drilldown/) | |`method` | `raw` | will return the original `tableData.rows` | Whatever you specified as `transform.method`, the `transformer` value will be always function for lazy computation. ```js // advanced-transformation.util#getTransformer if (transformSpec.method === 'raw') { transformer = () => { return rows; } } else if (transformSpec.method === 'array') { transformer = () => { ... return { ... } } } ``` #### Feature Details: Automatic parameter parsing Advanced transformation will parse parameter values automatically based on their type: `int`, `float`, `string`, `JSON` - See also `advanced-transformation-util.js#parseParameter` #### Feature Details: re-initialize the whole configuration based on spec hash ```js // advanced-transformation-util#initializeConfig const currentVersion = JSON.stringify(spec) if (!config.spec || !config.spec.version || config.spec.version !== currentVersion) { spec.version = currentVersion // reset config... } ``` #### Feature Details: Shared Axes If you set `sharedAxis` to `true` in chart specification, then these charts will share their axes. (default is `false`) ```js const spec = { charts: { 'column': { transform: { method: 'array', }, sharedAxis: true, axis: { ... }, parameter: { ... }, }, 'stacked': { transform: { method: 'array', }, sharedAxis: true, axis: { ... } parameter: { ... }, }, ```  #### API Details: Usage in Visualization#render() Let's assume that we want to create 2 sub-charts called `basic` and `no-group`. - https://github.com/1ambda/zeppelin-ultimate-line-chart (an practical example) ```js drawBasicChart(parameter, column, transformer) { const { ... } = transformer() } drawNoGroupChart(parameter, column, transformer) { const { ... } = transformer() } render(data) { const { chart, parameter, column, transformer, } = data if (chart === 'basic') { this.drawBasicChart(parameter, column, transformer) } else if (chart === 'no-group') { this.drawNoGroupChart(parameter, column, transformer) } } ``` ### What type of PR is it? [Feature] ### Todos NONE ### What is the Jira issue? [ZEPPELIN-2217](https://issues.apache.org/jira/browse/ZEPPELIN-2217) ### How should this be tested? 1. Clone https://github.com/1ambda/zeppelin-ultimate-line-chart 2. Create a symbolic link `ultimate-line-chart.json` into `$ZEPPELIN_HOME/helium` 3. Modify the `artifact` value to proper absolute path considering your local machine. 4. Install the above visualization in `localhost:9000/#helium` 5. Test it ### Screenshots (if appropriate) #### 1. *(screenshot)* multiple sub charts  #### 2. *(screenshot)* parameter widgets: `input`, `checkbox`, `option`, `textarea`  #### 3. *(screenshot)* expand/fold axis and parameter panels  #### 4. *(screenshot)* clear axis and parameter panels  #### 5. *(screenshot)* remove duplicated columns in an axis  #### 6. *(screenshot)* limit column count in an axis  ### Questions: * Does the licenses files need update? - NO * Is there breaking changes for older versions? - NO * Does this needs documentation? - NO Author: 1ambda <1amb4a@gmail.com> Closes #2098 from 1ambda/ZEPPELIN-2217/advanced-transformation and squashes the following commits:6cde7c9[1ambda] fix reset params when spec changec75a3f2[1ambda] fix: Reset persisted axis6a2130a[1ambda] fix: clear config only when axis changed5464e84[1ambda] fix: Optimize array 2 key method9beb1e7[1ambda] fix: Type error2408225[1ambda] test: Add test for array 2keybf56761[1ambda] feat: Add array:2-key transform method7c6768f[1ambda] feat: Use axisSpec.desc as tooltipf98d4c9[1ambda] fix: Remove invalid key prop5cf2ece[1ambda] feat: Add minAxisCount4887800[1ambda] fix: Remove local module yarn caches3e29572[1ambda] refactor: copyModule funcc91a033[1ambda] fix: Set yarn cache dir in helium-bundles04b5140[1ambda] fix: Import a-tr0a876cf[1ambda] docs: Update index.md380b1af[1ambda] docs: Fix typo and add desc for existing trs908214b[1ambda] docs: Move experimental tagsa009627[1ambda] feat: Allow dup aggr axis3b44e92[1ambda] fix: Remove unuse constab6c22e[1ambda] test: Add test for drill-down method756107a[1ambda] test: Add array transformation methodd819c73[1ambda] test: Add object methodbf00fba[1ambda] test: Add MockTableData39fe5ae[1ambda] test: Add test for getColumnsFromAxis4c393b4[1ambda] fix: Add polyfill for es6 funcs in teste92c787[1ambda] test: Add test for rmDup, aplMaxAxisCount843f45d[1ambda] test: Add test for getCurrent* funcsae5277c[1ambda] test: Add test for initializeConfigc14a9dc7[1ambda] test: Add tests for widget, paramsc510af1[1ambda] docs: Add doc for Transformation52db37b[1ambda] feat: Show panel menus only when opened17ad4a4[1ambda] feat: Support chartChanged, parameterChangedc0d33d3[1ambda] fix: Sort selectors in drilldown methodcfd6fef[1ambda] feat: sharedAxis9af80ce[1ambda] style: Indent79b5654[1ambda] fix: return the same info in transform7bee464[1ambda] fix: Keynamesee8788e[1ambda] feat: Support drill-down666025a[1ambda] fix: DON'T reset current chartae1891f[1ambda] add array:key transform4167a2e[1ambda] fix: Sort keyNames912b5b7[1ambda] fix: Persist initialized configf1f6b0c[1ambda] feat: Support ARRAY transform.method812f9a2[1ambda] fix: Set proper aggr value when 0 group20f9437[1ambda] fix: getCube func25d51a9[1ambda] DON'T display aggr.name when aggrColumns.length == 1f37e13d[1ambda] fix: Add 'object' transform.methodda2370c[1ambda] fix: Add resetAxis, Param funcs2370682[1ambda] fix: average is not caculated correctlydd08e38[1ambda] fix: Set param panel height to 400881695a[1ambda] feat: clear chart, param separately4d0d62b[1ambda] fix: DON'T clean panel config92676d1[1ambda] fix: limit parameter panel height to 370cc29060[1ambda] feat: parse param description as HTML9a2d227[1ambda] fix: Stop event propagation in widgetsfcc625c[1ambda] feat: Automatic param parsingb4d774c[1ambda] fix: Dont close param panel when enter088705b[1ambda] refactor: Remove util and add Widget funcsbf88b4f[1ambda] feat: textare widget and update hook4e73012[1ambda] feat: widget checkbox11b7eaa[1ambda] feat: option widget5d3efc9[1ambda] fix: Change panel headerb1d9d31[1ambda] feat: Save and close with enter key53f508c[1ambda] feat: custom axisSpec0dbc431[1ambda] feat: Support transformer94d837a[1ambda] feat: Automatic spec versioning74b8b4e[1ambda] fix: Duplicated radio btn id, name5b88f08[1ambda] fix: Modify margin of subchart radio btns019892c[1ambda] feat: Support transform: flatten0484e1e[1ambda] feat: Support maxAxisCount in axisSpec936901b[1ambda] feat: Support undefined valueType in axisSpec7a454ff[1ambda] feat: Cube Transformationf0ed02f[1ambda] feat: Support same axis types49985c6[1ambda] refactor: Refine axis, param specd89e223[1ambda] feat: advanced-transformation-api75569ce[1ambda] feat: Support multiple charts in UIe1fcc2e[1ambda] feat: Support multiple charts97be629[1ambda] fix: Add singleDimensionAggregatorChanged676bd7e[1ambda] refactor: Refine transform API9fb398e[1ambda] feat: Add clearConfiga8a4fb1[1ambda] refactor: Add getAxisInSingleDimension func9768ecf[1ambda] feat: Add groupBase axis option91ae54d[1ambda] fix: Overflow issue in single aggr10c80fc[1ambda] feat: AdvancedTransformation
194 lines
10 KiB
Markdown
194 lines
10 KiB
Markdown
---
|
|
layout: page
|
|
title:
|
|
description:
|
|
group:
|
|
---
|
|
<!--
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
-->
|
|
{% include JB/setup %}
|
|
<br />
|
|
<div class="row">
|
|
<div class="col-md-6" style="padding-right:0">
|
|
<h1 style="color:#4c555a">Multi-purpose Notebook</h1>
|
|
<p class="index-header">
|
|
The Notebook is the place for all your needs
|
|
</p>
|
|
<ul style="list-style-type: none;padding-left:10px;" >
|
|
<li style="font-size:18px; margin: 5px;"><span class="glyphicon glyphicon-import" style="margin-right:10px"></span> Data Ingestion</li>
|
|
<li style="font-size:18px; margin: 5px;"><span class="glyphicon glyphicon-eye-open" style="margin-right:10px"></span> Data Discovery</li>
|
|
<li style="font-size:18px; margin: 5px;"><span class="glyphicon glyphicon-wrench" style="margin-right:10px"></span> Data Analytics</li>
|
|
<li style="font-size:18px; margin: 5px;"><span class="glyphicon glyphicon-dashboard" style="margin-right:10px"></span> Data Visualization & Collaboration</li>
|
|
</ul>
|
|
</div>
|
|
<div class="col-md-6" style="padding:0">
|
|
<img class="img-responsive" style="border: 1px solid #ecf0f1;" src="./assets/themes/zeppelin/img/notebook.png" />
|
|
</div>
|
|
</div>
|
|
|
|
<br />
|
|
## Multiple Language Backend
|
|
[Apache Zeppelin interpreter](./manual/interpreters.html) concept allows any language/data-processing-backend to be plugged into Zeppelin.
|
|
Currently Apache Zeppelin supports many interpreters such as Apache Spark, Python, JDBC, Markdown and Shell.
|
|
|
|
<img class="img-responsive" width="500px" style="margin:0 auto; padding: 26px;" src="./assets/themes/zeppelin/img/available_interpreters.png" />
|
|
|
|
Adding new language-backend is really simple. Learn [how to create your own interpreter](./development/writingzeppelininterpreter.html#make-your-own-interpreter).
|
|
|
|
#### Apache Spark integration
|
|
Especially, Apache Zeppelin provides built-in [Apache Spark](http://spark.apache.org/) integration. You don't need to build a separate module, plugin or library for it.
|
|
|
|
<img class="img-responsive" src="./assets/themes/zeppelin/img/spark_logo.png" width="140px" />
|
|
|
|
Apache Zeppelin with Spark integration provides
|
|
|
|
- Automatic SparkContext and SQLContext injection
|
|
- Runtime jar dependency loading from local filesystem or maven repository. Learn more about [dependency loader](./interpreter/spark.html#dependencyloading).
|
|
- Canceling job and displaying its progress
|
|
|
|
For the further information about Apache Spark in Apache Zeppelin, please see [Spark interpreter for Apache Zeppelin](./interpreter/spark.html).
|
|
|
|
<br />
|
|
## Data visualization
|
|
|
|
Some basic charts are already included in Apache Zeppelin. Visualizations are not limited to Spark SQL query, any output from any language backend can be recognized and visualized.
|
|
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<img class="img-responsive" src="./assets/themes/zeppelin/img/graph1.png" />
|
|
</div>
|
|
<div class="col-md-6">
|
|
<img class="img-responsive" src="./assets/themes/zeppelin/img/graph2.png" />
|
|
</div>
|
|
</div>
|
|
|
|
### Pivot chart
|
|
|
|
Apache Zeppelin aggregates values and displays them in pivot chart with simple drag and drop. You can easily create chart with multiple aggregated values including sum, count, average, min, max.
|
|
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<img class="img-responsive" style="margin: 16px auto;" src="./assets/themes/zeppelin/img/screenshots/pivot.png" width="480px" />
|
|
</div>
|
|
</div>
|
|
|
|
Learn more about [display systems](#display-system) in Apache Zeppelin.
|
|
|
|
<br />
|
|
## Dynamic forms
|
|
|
|
Apache Zeppelin can dynamically create some input forms in your notebook.
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<img class="img-responsive" style="margin: 16px auto;" src="./assets/themes/zeppelin/img/screenshots/dynamicform.png" />
|
|
</div>
|
|
</div>
|
|
Learn more about [Dynamic Forms](./manual/dynamicform.html).
|
|
|
|
<br />
|
|
## Collaborate by sharing your Notebook & Paragraph
|
|
Your notebook URL can be shared among collaborators. Then Apache Zeppelin will broadcast any changes in realtime, just like the collaboration in Google docs.
|
|
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<img class="img-responsive" style="margin: 20px auto" src="./assets/themes/zeppelin/img/screenshots/publish.png" width="650px"/>
|
|
</div>
|
|
</div>
|
|
|
|
Apache Zeppelin provides an URL to display the result only, that page does not include any menus and buttons inside of notebooks.
|
|
You can easily embed it as an iframe inside of your website in this way.
|
|
If you want to learn more about this feature, please visit [this page](./manual/publish.html).
|
|
|
|
<br />
|
|
## 100% Opensource
|
|
|
|
<img class="img-responsive" style="margin:0 auto; padding: 15px;" src="./assets/themes/zeppelin/img/asf_logo.png" width="250px"/>
|
|
|
|
Apache Zeppelin is Apache2 Licensed software. Please check out the [source repository](http://git.apache.org/zeppelin.git) and [how to contribute](https://zeppelin.apache.org/contribution/contributions.html).
|
|
Apache Zeppelin has a very active development community.
|
|
Join to our [Mailing list](https://zeppelin.apache.org/community.html) and report issues on [Jira Issue tracker](https://issues.apache.org/jira/browse/ZEPPELIN).
|
|
|
|
## What is the next ?
|
|
|
|
####Quick Start
|
|
|
|
* Getting Started
|
|
* [Quick Start](./install/install.html) for basic instructions on installing Apache Zeppelin
|
|
* [Configuration](./install/configuration.html) lists for Apache Zeppelin
|
|
* [Explore Apache Zeppelin UI](./quickstart/explorezeppelinui.html): basic components of Apache Zeppelin home
|
|
* [Tutorial](./quickstart/tutorial.html): a short walk-through tutorial that uses Apache Spark backend
|
|
* Basic Feature Guide
|
|
* [Dynamic Form](./manual/dynamicform.html): a step by step guide for creating dynamic forms
|
|
* [Publish your Paragraph](./manual/publish.html) results into your external website
|
|
* [Customize Zeppelin Homepage](./manual/notebookashomepage.html) with one of your notebooks
|
|
* More
|
|
* [Upgrade Apache Zeppelin Version](./install/upgrade.html): a manual procedure of upgrading Apache Zeppelin version
|
|
* [Build](./install/build.html): Build from source
|
|
|
|
####Interpreter
|
|
|
|
* [Interpreters in Apache Zeppelin](./manual/interpreters.html): what is interpreter group? how can you set interpreters in Apache Zeppelin?
|
|
* Usage
|
|
* [Interpreter Installation](./manual/interpreterinstallation.html): Install not only community managed interpreters but also 3rd party interpreters
|
|
* [Interpreter Dependency Management](./manual/dependencymanagement.html) when you include external libraries to interpreter
|
|
* [Interpreter User Impersonation](./manual/userimpersonation.html) when you want to run interpreter as end user
|
|
* [Interpreter Execution Hooks](./manual/interpreterexechooks.html) to specify additional code to be executed by an interpreter at pre and post-paragraph code execution
|
|
* Available Interpreters: currently, about 20 interpreters are available in Apache Zeppelin.
|
|
|
|
####Display System
|
|
|
|
* Basic Display System: [Text](./displaysystem/basicdisplaysystem.html#text), [HTML](./displaysystem/basicdisplaysystem.html#html), [Table](./displaysystem/basicdisplaysystem.html#table) is available
|
|
* Angular API: a description about avilable backend and frontend AngularJS API with examples
|
|
* [Angular (backend API)](./displaysystem/back-end-angular.html)
|
|
* [Angular (frontend API)](./displaysystem/front-end-angular.html)
|
|
|
|
#### More
|
|
|
|
* Notebook Storage: a guide about saving notebooks to external storage
|
|
* [Git Storage](./storage/storage.html#notebook-storage-in-local-git-repository)
|
|
* [S3 Storage](./storage/storage.html#notebook-storage-in-s3)
|
|
* [Azure Storage](./storage/storage.html#notebook-storage-in-azure)
|
|
* [ZeppelinHub Storage](./storage/storage.html#storage-in-zeppelinhub)
|
|
* REST API: available REST API list in Apache Zeppelin
|
|
* [Interpreter API](./rest-api/rest-interpreter.html)
|
|
* [Notebook API](./rest-api/rest-notebook.html)
|
|
* [Notebook Repository API](./rest-api/rest-notebookRepo.html)
|
|
* [Configuration API](./rest-api/rest-configuration.html)
|
|
* [Credential API](./rest-api/rest-credential.html)
|
|
* [Helium API](./rest-api/rest-helium.html)
|
|
* Security: available security support in Apache Zeppelin
|
|
* [Authentication for NGINX](./security/authentication.html)
|
|
* [Shiro Authentication](./security/shiroauthentication.html)
|
|
* [Notebook Authorization](./security/notebook_authorization.html)
|
|
* [Data Source Authorization](./security/datasource_authorization.html)
|
|
* Helium Framework (Experimental)
|
|
* [Writing Zeppelin Application](./development/writingzeppelinapplication.html)
|
|
* [Writing Zeppelin Spell](./development/writingzeppelinspell.html)
|
|
* [Writing Zeppelin Visualization: Basic](./development/writingzeppelinvisualization.html)
|
|
* [Writing Zeppelin Visualization: Transformation](./development/writingzeppelinvisualization_transformation.html)
|
|
* Advanced
|
|
* [Apache Zeppelin on Vagrant VM](./install/virtual_machine.html)
|
|
* [Zeppelin on Spark Cluster Mode (Standalone via Docker)](./install/spark_cluster_mode.html#spark-standalone-mode)
|
|
* [Zeppelin on Spark Cluster Mode (YARN via Docker)](./install/spark_cluster_mode.html#spark-on-yarn-mode)
|
|
* [Zeppelin on Spark Cluster Mode (Mesos via Docker)](./install/spark_cluster_mode.html#spark-on-mesos-mode)
|
|
* [Zeppelin on CDH (via Docker)](./install/cdh.html)
|
|
* Contribute
|
|
* [Writing Zeppelin Interpreter](./development/writingzeppelininterpreter.html)
|
|
* [How to contribute (code)](./development/howtocontribute.html)
|
|
* [How to contribute (documentation website)](./development/howtocontributewebsite.html)
|
|
|
|
#### External Resources
|
|
* [Mailing List](https://zeppelin.apache.org/community.html)
|
|
* [Apache Zeppelin Wiki](https://cwiki.apache.org/confluence/display/ZEPPELIN/Zeppelin+Home)
|
|
* [StackOverflow tag `apache-zeppelin`](http://stackoverflow.com/questions/tagged/apache-zeppelin)
|