Return-Path: X-Original-To: apmail-zeppelin-commits-archive@minotaur.apache.org Delivered-To: apmail-zeppelin-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 3F84618474 for ; Sun, 8 Nov 2015 00:36:13 +0000 (UTC) Received: (qmail 47247 invoked by uid 500); 8 Nov 2015 00:36:13 -0000 Delivered-To: apmail-zeppelin-commits-archive@zeppelin.apache.org Received: (qmail 47202 invoked by uid 500); 8 Nov 2015 00:36:13 -0000 Mailing-List: contact commits-help@zeppelin.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@zeppelin.incubator.apache.org Delivered-To: mailing list commits@zeppelin.incubator.apache.org Received: (qmail 47192 invoked by uid 99); 8 Nov 2015 00:36:13 -0000 Received: from Unknown (HELO spamd3-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 08 Nov 2015 00:36:13 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd3-us-west.apache.org (ASF Mail Server at spamd3-us-west.apache.org) with ESMTP id AFCEB180251 for ; Sun, 8 Nov 2015 00:36:12 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd3-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 0.791 X-Spam-Level: X-Spam-Status: No, score=0.791 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, T_RP_MATCHES_RCVD=-0.01, URIBL_BLOCKED=0.001] autolearn=disabled Received: from mx1-us-west.apache.org ([10.40.0.8]) by localhost (spamd3-us-west.apache.org [10.40.0.10]) (amavisd-new, port 10024) with ESMTP id TCBw2_VEKEnQ for ; Sun, 8 Nov 2015 00:35:59 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-us-west.apache.org (ASF Mail Server at mx1-us-west.apache.org) with SMTP id 5810B203BD for ; Sun, 8 Nov 2015 00:35:59 +0000 (UTC) Received: (qmail 47096 invoked by uid 99); 8 Nov 2015 00:35:59 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 08 Nov 2015 00:35:59 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id E516FDFBD7; Sun, 8 Nov 2015 00:35:58 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: moon@apache.org To: commits@zeppelin.incubator.apache.org Message-Id: <476b7ab951454c2baf9bdc26626dbad6@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: =?utf-8?q?incubator-zeppelin_git_commit=3A_=5BZEPPELIN-382=5D_Add_?= =?utf-8?q?Documentation_for_Cassandra_interpreter_in_the_doc=E2=80=A6?= Date: Sun, 8 Nov 2015 00:35:58 +0000 (UTC) Repository: incubator-zeppelin Updated Branches: refs/heads/master cd0010d69 -> 8b7556df1 [ZEPPELIN-382] Add Documentation for Cassandra interpreter in the doc… Linked **[JIRA]** [JIRA]: https://issues.apache.org/jira/browse/ZEPPELIN-382?jql=project%20%3D%20ZEPPELIN Author: DuyHai DOAN Closes #384 from doanduyhai/CassandraInterpreterDocumentation and squashes the following commits: b0bf36a [DuyHai DOAN] [ZEPPELIN-382] Add Documentation for Cassandra interpreter in the doc pages Project: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/commit/8b7556df Tree: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/tree/8b7556df Diff: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/diff/8b7556df Branch: refs/heads/master Commit: 8b7556df11c732029d694bbd492b0d30865d3b0c Parents: cd0010d Author: DuyHai DOAN Authored: Mon Nov 2 12:57:29 2015 +0100 Committer: Lee moon soo Committed: Sun Nov 8 09:36:05 2015 +0900 ---------------------------------------------------------------------- .../img/docs-img/cassandra-DescribeSchema.png | Bin 0 -> 33600 bytes .../img/docs-img/cassandra-InteractiveHelp.png | Bin 0 -> 84626 bytes .../docs-img/cassandra-InterpreterBinding.png | Bin 0 -> 16963 bytes .../cassandra-InterpreterInstanceSelection.png | Bin 0 -> 24970 bytes .../img/docs-img/cassandra-InterpreterName.png | Bin 0 -> 26762 bytes .../docs-img/cassandra-InterpreterSelection.png | Bin 0 -> 36754 bytes .../docs-img/cassandra-NewInterpreterInList.png | Bin 0 -> 6518 bytes .../cassandra-NewInterpreterInstance.png | Bin 0 -> 23552 bytes docs/docs/index.md | 5 +- docs/docs/interpreter/cassandra.md | 807 +++++++++++++++++++ 10 files changed, 810 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8b7556df/docs/assets/themes/zeppelin/img/docs-img/cassandra-DescribeSchema.png ---------------------------------------------------------------------- diff --git a/docs/assets/themes/zeppelin/img/docs-img/cassandra-DescribeSchema.png b/docs/assets/themes/zeppelin/img/docs-img/cassandra-DescribeSchema.png new file mode 100644 index 0000000..940ec2f Binary files /dev/null and b/docs/assets/themes/zeppelin/img/docs-img/cassandra-DescribeSchema.png differ http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8b7556df/docs/assets/themes/zeppelin/img/docs-img/cassandra-InteractiveHelp.png ---------------------------------------------------------------------- diff --git a/docs/assets/themes/zeppelin/img/docs-img/cassandra-InteractiveHelp.png b/docs/assets/themes/zeppelin/img/docs-img/cassandra-InteractiveHelp.png new file mode 100644 index 0000000..fcd2c68 Binary files /dev/null and b/docs/assets/themes/zeppelin/img/docs-img/cassandra-InteractiveHelp.png differ http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8b7556df/docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterBinding.png ---------------------------------------------------------------------- diff --git a/docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterBinding.png b/docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterBinding.png new file mode 100644 index 0000000..aae9a22 Binary files /dev/null and b/docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterBinding.png differ http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8b7556df/docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterInstanceSelection.png ---------------------------------------------------------------------- diff --git a/docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterInstanceSelection.png b/docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterInstanceSelection.png new file mode 100644 index 0000000..aeadb2b Binary files /dev/null and b/docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterInstanceSelection.png differ http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8b7556df/docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterName.png ---------------------------------------------------------------------- diff --git a/docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterName.png b/docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterName.png new file mode 100644 index 0000000..821b004 Binary files /dev/null and b/docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterName.png differ http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8b7556df/docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterSelection.png ---------------------------------------------------------------------- diff --git a/docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterSelection.png b/docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterSelection.png new file mode 100644 index 0000000..6dc97dc Binary files /dev/null and b/docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterSelection.png differ http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8b7556df/docs/assets/themes/zeppelin/img/docs-img/cassandra-NewInterpreterInList.png ---------------------------------------------------------------------- diff --git a/docs/assets/themes/zeppelin/img/docs-img/cassandra-NewInterpreterInList.png b/docs/assets/themes/zeppelin/img/docs-img/cassandra-NewInterpreterInList.png new file mode 100644 index 0000000..b287f41 Binary files /dev/null and b/docs/assets/themes/zeppelin/img/docs-img/cassandra-NewInterpreterInList.png differ http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8b7556df/docs/assets/themes/zeppelin/img/docs-img/cassandra-NewInterpreterInstance.png ---------------------------------------------------------------------- diff --git a/docs/assets/themes/zeppelin/img/docs-img/cassandra-NewInterpreterInstance.png b/docs/assets/themes/zeppelin/img/docs-img/cassandra-NewInterpreterInstance.png new file mode 100644 index 0000000..36f6c3e Binary files /dev/null and b/docs/assets/themes/zeppelin/img/docs-img/cassandra-NewInterpreterInstance.png differ http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8b7556df/docs/docs/index.md ---------------------------------------------------------------------- diff --git a/docs/docs/index.md b/docs/docs/index.md index 6a0d341..11c35da 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -19,16 +19,17 @@ group: nav-right **[Interpreters in zeppelin](manual/interpreters.html)** +* [cassandra](./interpreter/cassandra.html) * [flink](./interpreter/flink.html) +* [geode](./interpreter/geode.html) * [hive](../docs/pleasecontribute.html) * [ignite](./interpreter/ignite.html) * [lens](./interpreter/lens.html) * [md](../docs/pleasecontribute.html) +* [postgresql, hawq](./interpreter/postgresql.html) * [sh](../docs/pleasecontribute.html) * [spark](./interpreter/spark.html) * [tajo](../docs/pleasecontribute.html) -* [postgresql, hawq](./interpreter/postgresql.html) -* [geode](./interpreter/geode.html) ### Display System http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8b7556df/docs/docs/interpreter/cassandra.md ---------------------------------------------------------------------- diff --git a/docs/docs/interpreter/cassandra.md b/docs/docs/interpreter/cassandra.md new file mode 100644 index 0000000..b53295c --- /dev/null +++ b/docs/docs/interpreter/cassandra.md @@ -0,0 +1,807 @@ +--- +layout: page +title: "Cassandra Interpreter" +description: "Cassandra Interpreter" +group: manual +--- +{% include JB/setup %} + +
+## 1. Cassandra CQL Interpreter for Apache Zeppelin + +
+ + + + + + + + + + + +
NameClassDescription
%cassandraCassandraInterpreterProvides interpreter for Apache Cassandra CQL query language
+ +
+ +## 2. Enabling Cassandra Interpreter + + In a notebook, to enable the **Cassandra** interpreter, click on the **Gear** icon and select **Cassandra** + +
+ ![Interpreter Binding](/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterBinding.png) + + ![Interpreter Selection](/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterSelection.png) +
+ +
+ +## 3. Using the Cassandra Interpreter + + In a paragraph, use **_%cassandra_** to select the **Cassandra** interpreter and then input all commands. + + To access the interactive help, type **HELP;** + +
+ ![Interactive Help](/assets/themes/zeppelin/img/docs-img/cassandra-InteractiveHelp.png) +
+ +
+ +## 4. Interpreter Commands + + The **Cassandra** interpreter accepts the following commands + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Command TypeCommand NameDescription
Help commandHELPDisplay the interactive help menu
Schema commandsDESCRIBE KEYSPACE, DESCRIBE CLUSTER, DESCRIBE TABLES ...Custom commands to describe the Cassandra schema
Option commands@consistency, @retryPolicy, @fetchSize ...Inject runtime options to all statements in the paragraph
Prepared statement commands@prepare, @bind, @remove_preparedLet you register a prepared command and re-use it later by injecting bound values
Native CQL statementsAll CQL-compatible statements (SELECT, INSERT, CREATE ...)All CQL statements are executed directly against the Cassandra server
+
+ +
+## 5. CQL statements + +This interpreter is compatible with any CQL statement supported by Cassandra. Ex: + +```sql + + INSERT INTO users(login,name) VALUES('jdoe','John DOE'); + SELECT * FROM users WHERE login='jdoe'; +``` + +Each statement should be separated by a semi-colon ( **;** ) except the special commands below: + +1. @prepare +2. @bind +3. @remove_prepare +4. @consistency +5. @serialConsistency +6. @timestamp +7. @retryPolicy +8. @fetchSize + +Multi-line statements as well as multiple statements on the same line are also supported as long as they are +separated by a semi-colon. Ex: + +```sql + + USE spark_demo; + + SELECT * FROM albums_by_country LIMIT 1; SELECT * FROM countries LIMIT 1; + + SELECT * + FROM artists + WHERE login='jlennon'; +``` + +Batch statements are supported and can span multiple lines, as well as DDL(CREATE/ALTER/DROP) statements: + +```sql + + BEGIN BATCH + INSERT INTO users(login,name) VALUES('jdoe','John DOE'); + INSERT INTO users_preferences(login,account_type) VALUES('jdoe','BASIC'); + APPLY BATCH; + + CREATE TABLE IF NOT EXISTS test( + key int PRIMARY KEY, + value text + ); +``` + +CQL statements are case-insensitive (except for column names and values). +This means that the following statements are equivalent and valid: + +```sql + + INSERT INTO users(login,name) VALUES('jdoe','John DOE'); + Insert into users(login,name) vAlues('hsue','Helen SUE'); +``` + +The complete list of all CQL statements and versions can be found below: +
+ + + + + + + + + + + + + + + + + +
Cassandra VersionDocumentation Link
2.2 + + http://docs.datastax.com/en/cql/3.3/cql/cqlIntro.html + +
2.1 & 2.0 + + http://docs.datastax.com/en/cql/3.1/cql/cql_intro_c.html + +
1.2 + + http://docs.datastax.com/en/cql/3.0/cql/aboutCQL.html + +
+
+ +
+ +## 6. Comments in statements + +It is possible to add comments between statements. Single line comments start with the hash sign (#). Multi-line comments are enclosed between /** and **/. Ex: + +```sql + + #First comment + INSERT INTO users(login,name) VALUES('jdoe','John DOE'); + + /** + Multi line + comments + **/ + Insert into users(login,name) vAlues('hsue','Helen SUE'); +``` + +
+ +## 7. Syntax Validation + +The interpreters is shipped with a built-in syntax validator. This validator only checks for basic syntax errors. +All CQL-related syntax validation is delegated directly to **Cassandra** + +Most of the time, syntax errors are due to **missing semi-colons** between statements or **typo errors**. + +
+ +## 8. Schema commands + +To make schema discovery easier and more interactive, the following commands are supported: +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CommandDescription
DESCRIBE CLUSTER;Show the current cluster name and its partitioner
DESCRIBE KEYSPACES;List all existing keyspaces in the cluster and their configuration (replication factor, durable write ...)
DESCRIBE TABLES;List all existing keyspaces in the cluster and for each, all the tables name
DESCRIBE TYPES;List all existing user defined types in the current (logged) keyspace
DESCRIBE FUNCTIONS <keyspace_name>;List all existing user defined functions in the given keyspace
DESCRIBE AGGREGATES <keyspace_name>;List all existing user defined aggregates in the given keyspace
DESCRIBE KEYSPACE <keyspace_name>;Describe the given keyspace configuration and all its table details (name, columns, ...)
DESCRIBE TABLE (<keyspace_name>).<table_name>; + Describe the given table. If the keyspace is not provided, the current logged in keyspace is used. + If there is no logged in keyspace, the default system keyspace is used. + If no table is found, an error message is raised +
DESCRIBE TYPE (<keyspace_name>).<type_name>; + Describe the given type(UDT). If the keyspace is not provided, the current logged in keyspace is used. + If there is no logged in keyspace, the default system keyspace is used. + If no type is found, an error message is raised +
DESCRIBE FUNCTION (<keyspace_name>).<function_name>;Describe the given user defined function. The keyspace is optional
DESCRIBE AGGREGATE (<keyspace_name>).<aggregate_name>;Describe the given user defined aggregate. The keyspace is optional
+
+ +The schema objects (cluster, keyspace, table, type, function and aggregate) are displayed in a tabular format. +There is a drop-down menu on the top left corner to expand objects details. On the top right menu is shown the Icon legend. + +
+
+ ![Describe Schema](/assets/themes/zeppelin/img/docs-img/cassandra-DescribeSchema.png) +
+ +
+ +## 9. Runtime Parameters + +Sometimes you want to be able to pass runtime query parameters to your statements. +Those parameters are not part of the CQL specs and are specific to the interpreter. +Below is the list of all parameters: + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterSyntaxDescription
Consistency Level@consistency=valueApply the given consistency level to all queries in the paragraph
Serial Consistency Level@serialConsistency=valueApply the given serial consistency level to all queries in the paragraph
Timestamp@timestamp=long value + Apply the given timestamp to all queries in the paragraph. + Please note that timestamp value passed directly in CQL statement will override this value +
Retry Policy@retryPolicy=valueApply the given retry policy to all queries in the paragraph
Fetch Size@fetchSize=integer valueApply the given fetch size to all queries in the paragraph
+
+ + Some parameters only accept restricted values: + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterPossible Values
Consistency LevelALL, ANY, ONE, TWO, THREE, QUORUM, LOCAL_ONE, LOCAL_QUORUM, EACH_QUORUM
Serial Consistency LevelSERIAL, LOCAL_SERIAL
TimestampAny long value
Retry PolicyDEFAULT, DOWNGRADING_CONSISTENCY, FALLTHROUGH, LOGGING_DEFAULT, LOGGING_DOWNGRADING, LOGGING_FALLTHROUGH
Fetch SizeAny integer value
+
+ +>Please note that you should **not** add semi-colon ( **;** ) at the end of each parameter statement + +Some examples: + +```sql + + CREATE TABLE IF NOT EXISTS spark_demo.ts( + key int PRIMARY KEY, + value text + ); + TRUNCATE spark_demo.ts; + + # Timestamp in the past + @timestamp=10 + + # Force timestamp directly in the first insert + INSERT INTO spark_demo.ts(key,value) VALUES(1,'first insert') USING TIMESTAMP 100; + + # Select some data to make the clock turn + SELECT * FROM spark_demo.albums LIMIT 100; + + # Now insert using the timestamp parameter set at the beginning(10) + INSERT INTO spark_demo.ts(key,value) VALUES(1,'second insert'); + + # Check for the result. You should see 'first insert' + SELECT value FROM spark_demo.ts WHERE key=1; +``` + +Some remarks about query parameters: + +> 1. **many** query parameters can be set in the same paragraph +> 2. if the **same** query parameter is set many time with different values, the interpreter only take into account the first value +> 3. each query parameter applies to **all CQL statements** in the same paragraph, unless you override the option using plain CQL text (like forcing timestamp with the USING clause) +> 4. the order of each query parameter with regard to CQL statement does not matter + +
+ +## 10. Support for Prepared Statements + +For performance reason, it is better to prepare statements before-hand and reuse them later by providing bound values. +This interpreter provides 3 commands to handle prepared and bound statements: + +1. **@prepare** +2. **@bind** +3. **@remove_prepared** + +Example: + +``` + + @prepare[statement_name]=... + + @bind[statement_name]=’text’, 1223, ’2015-07-30 12:00:01’, null, true, [‘list_item1’, ’list_item2’] + + @bind[statement_name_with_no_bound_value] + + @remove_prepare[statement_name] +``` + +
+#### a. @prepare +
+You can use the syntax _"@prepare[statement_name]=SELECT ..."_ to create a prepared statement. +The _statement_name_ is **mandatory** because the interpreter prepares the given statement with the Java driver and +saves the generated prepared statement in an **internal hash map**, using the provided _statement_name_ as search key. + +> Please note that this internal prepared statement map is shared with **all notebooks** and **all paragraphs** because +there is only one instance of the interpreter for Cassandra + +> If the interpreter encounters **many** @prepare for the **same _statement_name_ (key)**, only the **first** statement will be taken into account. + +Example: + +``` + + @prepare[select]=SELECT * FROM spark_demo.albums LIMIT ? + + @prepare[select]=SELECT * FROM spark_demo.artists LIMIT ? +``` + +For the above example, the prepared statement is _SELECT * FROM spark_demo.albums LIMIT ?_. +_SELECT * FROM spark_demo.artists LIMIT ?_ is ignored because an entry already exists in the prepared statements map with the key select. + +In the context of **Zeppelin**, a notebook can be scheduled to be executed at regular interval, +thus it is necessary to **avoid re-preparing many time the same statement (considered an anti-pattern)**. +
+
+#### b. @bind +
+Once the statement is prepared (possibly in a separated notebook/paragraph). You can bind values to it: + +``` + @bind[select_first]=10 +``` + +Bound values are not mandatory for the **@bind** statement. However if you provide bound values, they need to comply to some syntax: + +* String values should be enclosed between simple quotes ( ‘ ) +* Date values should be enclosed between simple quotes ( ‘ ) and respect the formats: + 1. yyyy-MM-dd HH:MM:ss + 2. yyyy-MM-dd HH:MM:ss.SSS +* **null** is parsed as-is +* **boolean** (true|false) are parsed as-is +* collection values must follow the **[standard CQL syntax]**: + * list: [‘list_item1’, ’list_item2’, ...] + * set: {‘set_item1’, ‘set_item2’, …} + * map: {‘key1’: ‘val1’, ‘key2’: ‘val2’, …} +* **tuple** values should be enclosed between parenthesis (see **[Tuple CQL syntax]**): (‘text’, 123, true) +* **udt** values should be enclosed between brackets (see **[UDT CQL syntax]**): {stree_name: ‘Beverly Hills’, number: 104, zip_code: 90020, state: ‘California’, …} + +> It is possible to use the @bind statement inside a batch: +> +> ```sql +> +> BEGIN BATCH +> @bind[insert_user]='jdoe','John DOE' +> UPDATE users SET age = 27 WHERE login='hsue'; +> APPLY BATCH; +> ``` + +
+#### c. @remove_prepare +
+To avoid for a prepared statement to stay forever in the prepared statement map, you can use the +**@remove_prepare[statement_name]** syntax to remove it. +Removing a non-existing prepared statement yields no error. + +
+ +## 11. Using Dynamic Forms + +Instead of hard-coding your CQL queries, it is possible to use the mustache syntax ( **\{\{ \}\}** ) to inject simple value or multiple choices forms. + +The syntax for simple parameter is: **\{\{input_Label=default value\}\}**. The default value is mandatory because the first time the paragraph is executed, +we launch the CQL query before rendering the form so at least one value should be provided. + +The syntax for multiple choices parameter is: **\{\{input_Label=value1 | value2 | … | valueN \}\}**. By default the first choice is used for CQL query +the first time the paragraph is executed. + +Example: + +{% raw %} + #Secondary index on performer style + SELECT name, country, performer + FROM spark_demo.performers + WHERE name='{{performer=Sheryl Crow|Doof|Fanfarlo|Los Paranoia}}' + AND styles CONTAINS '{{style=Rock}}'; +{% endraw %} + + +In the above example, the first CQL query will be executed for _performer='Sheryl Crow' AND style='Rock'_. +For subsequent queries, you can change the value directly using the form. + +> Please note that we enclosed the **\{\{ \}\}** block between simple quotes ( **'** ) because Cassandra expects a String here. +> We could have also use the **\{\{style='Rock'\}\}** syntax but this time, the value displayed on the form is **_'Rock'_** and not **_Rock_**. + +It is also possible to use dynamic forms for **prepared statements**: + +{% raw %} + + @bind[select]=='{{performer=Sheryl Crow|Doof|Fanfarlo|Los Paranoia}}', '{{style=Rock}}' + +{% endraw %} + +
+ +## 12. Execution parallelism and shared states + +It is possible to execute many paragraphs in parallel. However, at the back-end side, we’re still using synchronous queries. +_Asynchronous execution_ is only possible when it is possible to return a `Future` value in the `InterpreterResult`. +It may be an interesting proposal for the **Zeppelin** project. + +Another caveat is that the same `com.datastax.driver.core.Session` object is used for **all** notebooks and paragraphs. +Consequently, if you use the **USE _keyspace name_;** statement to log into a keyspace, it will change the keyspace for +**all current users** of the **Cassandra** interpreter because we only create 1 `com.datastax.driver.core.Session` object +per instance of **Cassandra** interpreter. + +The same remark does apply to the **prepared statement hash map**, it is shared by **all users** using the same instance of **Cassandra** interpreter. + +Until **Zeppelin** offers a real multi-users separation, there is a work-around to segregate user environment and states: +_create different **Cassandra** interpreter instances_ + +For this, first go to the **Interpreter** menu and click on the **Create** button +
+
+
+ ![Create Interpreter](/assets/themes/zeppelin/img/docs-img/cassandra-NewInterpreterInstance.png) +
+ +In the interpreter creation form, put **cass-instance2** as **Name** and select the **cassandra** +in the interpreter drop-down list +
+
+
+ ![Interpreter Name](/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterName.png) +
+ + Click on **Save** to create the new interpreter instance. Now you should be able to see it in the interpreter list. + +
+
+
+ ![Interpreter In List](/assets/themes/zeppelin/img/docs-img/cassandra-NewInterpreterInList.png) +
+ +Go back to your notebook and click on the **Gear** icon to configure interpreter bindings. +You should be able to see and select the **cass-instance2** interpreter instance in the available +interpreter list instead of the standard **cassandra** instance. + +
+
+
+ ![Interpreter Instance Selection](/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterInstanceSelection.png) +
+ +
+ +## 13. Interpreter Configuration + +To configure the **Cassandra** interpreter, go to the **Interpreter** menu and scroll down to change the parameters. +The **Cassandra** interpreter is using the official **[Cassandra Java Driver]** and most of the parameters are used +to configure the Java driver + +Below are the configuration parameters and their default value. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Property NameDescriptionDefault Value
cassandra.clusterName of the Cassandra cluster to connect toTest Cluster
cassandra.compression.protocolOn wire compression. Possible values are: NONE, SNAPPY, LZ4NONE
cassandra.credentials.usernameIf security is enable, provide the loginnone
cassandra.credentials.passwordIf security is enable, provide the passwordnone
cassandra.hosts + Comma separated Cassandra hosts (DNS name or IP address). +
+ Ex: '192.168.0.12,node2,node3' +
localhost
cassandra.interpreter.parallelismNumber of concurrent paragraphs(queries block) that can be executed10
cassandra.keyspace + Default keyspace to connect to. + + It is strongly recommended to let the default value + and prefix the table name with the actual keyspace + in all of your queries + + system
cassandra.load.balancing.policy + Load balancing policy. Default = new TokenAwarePolicy(new DCAwareRoundRobinPolicy()) + To Specify your own policy, provide the fully qualify class name (FQCN) of your policy. + At runtime the interpreter will instantiate the policy using + Class.forName(FQCN) + DEFAULT
cassandra.max.schema.agreement.wait.secondCassandra max schema agreement wait in second10
cassandra.pooling.core.connection.per.host.localProtocol V2 and below default = 2. Protocol V3 and above default = 12
cassandra.pooling.core.connection.per.host.remoteProtocol V2 and below default = 1. Protocol V3 and above default = 11
cassandra.pooling.heartbeat.interval.secondsCassandra pool heartbeat interval in secs30
cassandra.pooling.idle.timeout.secondsCassandra idle time out in seconds120
cassandra.pooling.max.connection.per.host.localProtocol V2 and below default = 8. Protocol V3 and above default = 18
cassandra.pooling.max.connection.per.host.remoteProtocol V2 and below default = 2. Protocol V3 and above default = 12
cassandra.pooling.max.request.per.connection.localProtocol V2 and below default = 128. Protocol V3 and above default = 1024128
cassandra.pooling.max.request.per.connection.remoteProtocol V2 and below default = 128. Protocol V3 and above default = 256128
cassandra.pooling.new.connection.threshold.localProtocol V2 and below default = 100. Protocol V3 and above default = 800100
cassandra.pooling.new.connection.threshold.remoteProtocol V2 and below default = 100. Protocol V3 and above default = 200100
cassandra.pooling.pool.timeout.millisecsCassandra pool time out in millisecs5000
cassandra.protocol.versionCassandra binary protocol version3
cassandra.query.default.consistency + Cassandra query default consistency level +
+ Available values: ONE, TWO, THREE, QUORUM, LOCAL_ONE, LOCAL_QUORUM, EACH_QUORUM, ALL +
ONE
cassandra.query.default.fetchSizeCassandra query default fetch size5000
cassandra.query.default.serial.consistency + Cassandra query default serial consistency level +
+ Available values: SERIAL, LOCAL_SERIAL +
SERIAL
cassandra.reconnection.policy + Cassandra Reconnection Policy. + Default = new ExponentialReconnectionPolicy(1000, 10 * 60 * 1000) + To Specify your own policy, provide the fully qualify class name (FQCN) of your policy. + At runtime the interpreter will instantiate the policy using + Class.forName(FQCN) + DEFAULT
cassandra.retry.policy + Cassandra Retry Policy. + Default = DefaultRetryPolicy.INSTANCE + To Specify your own policy, provide the fully qualify class name (FQCN) of your policy. + At runtime the interpreter will instantiate the policy using + Class.forName(FQCN) + DEFAULT
cassandra.socket.connection.timeout.millisecsCassandra socket default connection timeout in millisecs500
cassandra.socket.read.timeout.millisecsCassandra socket read timeout in millisecs12000
cassandra.socket.tcp.no_delayCassandra socket TCP no delaytrue
cassandra.speculative.execution.policy + Cassandra Speculative Execution Policy. + Default = NoSpeculativeExecutionPolicy.INSTANCE + To Specify your own policy, provide the fully qualify class name (FQCN) of your policy. + At runtime the interpreter will instantiate the policy using + Class.forName(FQCN) + DEFAULT
+ +
+ +## 14. Bugs & Contacts + + If you encounter a bug for this interpreter, please create a **[JIRA]** ticket and ping me on Twitter + at **[@doanduyhai]** + + +[Cassandra Java Driver]: https://github.com/datastax/java-driver +[standard CQL syntax]: http://docs.datastax.com/en/cql/3.1/cql/cql_using/use_collections_c.html +[Tuple CQL syntax]: http://docs.datastax.com/en/cql/3.1/cql/cql_reference/tupleType.html +[UDT CQL syntax]: http://docs.datastax.com/en/cql/3.1/cql/cql_using/cqlUseUDT.html +[JIRA]: https://issues.apache.org/jira/browse/ZEPPELIN-382?jql=project%20%3D%20ZEPPELIN +[@doanduyhai]: https://twitter.com/doanduyhai