You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by jo...@apache.org on 2022/07/15 07:37:29 UTC

[zeppelin] branch master updated: [ZEPPELIN-5768] Remove scio interpreter (#4408)

This is an automated email from the ASF dual-hosted git repository.

jongyoul pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/zeppelin.git


The following commit(s) were added to refs/heads/master by this push:
     new 9eb3aae092 [ZEPPELIN-5768] Remove scio interpreter (#4408)
9eb3aae092 is described below

commit 9eb3aae092497eae2dce98f6aeb4feafc6c663f3
Author: In-Kyu Kim <60...@users.noreply.github.com>
AuthorDate: Fri Jul 15 16:37:21 2022 +0900

    [ZEPPELIN-5768] Remove scio interpreter (#4408)
---
 .github/workflows/core.yml                         |   2 +-
 .github/workflows/frontend.yml                     |   2 +-
 .gitignore                                         |   2 -
 beam/pom.xml                                       |   6 -
 beam/src/main/resources/interpreter-setting.json   |  24 -
 conf/interpreter-list                              |   1 -
 dev/create_release.sh                              |   3 +-
 docs/_includes/themes/zeppelin/_navigation.html    |   1 -
 docs/index.md                                      |   1 -
 docs/interpreter/scio.md                           | 169 ------
 docs/usage/interpreter/installation.md             |   5 -
 pom.xml                                            |   5 +-
 scio/README.md                                     |  18 -
 scio/pom.xml                                       | 178 -------
 .../org/apache/zeppelin/scio/ContextAndArgs.scala  |  41 --
 .../org/apache/zeppelin/scio/DisplayHelpers.scala  | 167 ------
 .../scio/DisplaySCollectionImplicits.scala         | 105 ----
 .../apache/zeppelin/scio/DisplayTapImplicits.scala | 154 ------
 .../org/apache/zeppelin/scio/ScioInterpreter.scala | 201 --------
 scio/src/test/avro/schema.avsc                     |  12 -
 .../apache/zeppelin/scio/ScioInterpreterTest.java  | 109 ----
 scio/src/test/resources/log4j.properties           |  22 -
 .../zeppelin/scio/DisplayHelpersTestScala211.scala |  55 --
 .../org/apache/zeppelin/scio/TestCCScala211.scala  |  22 -
 .../apache/zeppelin/scio/DisplayHelpersTest.scala  | 570 ---------------------
 .../scala/org/apache/zeppelin/scio/TestCC.scala    |  24 -
 .../org/apache/zeppelin/scio/util/TestUtils.scala  |  50 --
 zeppelin-distribution/src/bin_license/LICENSE      |   5 -
 28 files changed, 6 insertions(+), 1948 deletions(-)

diff --git a/.github/workflows/core.yml b/.github/workflows/core.yml
index 78624b381d..bc5012f4c5 100644
--- a/.github/workflows/core.yml
+++ b/.github/workflows/core.yml
@@ -82,7 +82,7 @@ jobs:
   interpreter-test-non-core:
     runs-on: ubuntu-20.04
     env:
-      INTERPRETERS: 'beam,hbase,pig,jdbc,file,flink-cmd,ignite,cassandra,elasticsearch,bigquery,alluxio,scio,livy,groovy,sap,java,geode,neo4j,hazelcastjet,submarine,sparql,mongodb,influxdb,ksql'
+      INTERPRETERS: 'beam,hbase,pig,jdbc,file,flink-cmd,ignite,cassandra,elasticsearch,bigquery,alluxio,livy,groovy,sap,java,geode,neo4j,hazelcastjet,submarine,sparql,mongodb,influxdb,ksql'
     steps:
       - name: Checkout
         uses: actions/checkout@v2
diff --git a/.github/workflows/frontend.yml b/.github/workflows/frontend.yml
index 11624c66b9..01c26164b2 100644
--- a/.github/workflows/frontend.yml
+++ b/.github/workflows/frontend.yml
@@ -19,7 +19,7 @@ env:
   SPARK_PRINT_LAUNCH_COMMAND: "true"
   SPARK_LOCAL_IP: 127.0.0.1
   ZEPPELIN_LOCAL_IP: 127.0.0.1
-  INTERPRETERS: '!beam,!hbase,!pig,!jdbc,!file,!flink,!ignite,!cassandra,!elasticsearch,!bigquery,!alluxio,!scio,!livy,!groovy,!sap,!java,!geode,!neo4j,!hazelcastjet,!submarine,!sparql,!mongodb'
+  INTERPRETERS: '!beam,!hbase,!pig,!jdbc,!file,!flink,!ignite,!cassandra,!elasticsearch,!bigquery,!alluxio,!livy,!groovy,!sap,!java,!geode,!neo4j,!hazelcastjet,!submarine,!sparql,!mongodb'
 
 jobs:
   run-e2e-tests-in-zeppelin-web:
diff --git a/.gitignore b/.gitignore
index e52d5a63a2..425d6fbaaa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -55,8 +55,6 @@ zeppelin-web/yarn.lock
 .Rhistory
 /R/
 
-# scio
-.bigquery/
 
 # project level
 /logs/
diff --git a/beam/pom.xml b/beam/pom.xml
index 19b91bbe5f..58cfdcb30e 100644
--- a/beam/pom.xml
+++ b/beam/pom.xml
@@ -116,12 +116,6 @@
       <version>${project.version}</version>
     </dependency>
 
-    <dependency>
-      <groupId>org.apache.zeppelin</groupId>
-      <artifactId>zeppelin-scio</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
     <dependency>
       <groupId>org.apache.hadoop</groupId>
       <artifactId>hadoop-hdfs</artifactId>
diff --git a/beam/src/main/resources/interpreter-setting.json b/beam/src/main/resources/interpreter-setting.json
index e9b4a73c2a..189e08b5d8 100644
--- a/beam/src/main/resources/interpreter-setting.json
+++ b/beam/src/main/resources/interpreter-setting.json
@@ -9,29 +9,5 @@
     "editor": {
       "editOnDblClick": false
     }
-  },
-  {
-    "group": "beam",
-    "name": "scio",
-    "className": "org.apache.zeppelin.scio.ScioInterpreter",
-    "properties": {
-      "zeppelin.scio.argz": {
-        "envName": "ZEPPELIN_SCIO_ARGZ",
-        "propertyName": "zeppelin.scio.argz",
-        "defaultValue": "--runner=InProcessPipelineRunner",
-        "description": "Scio interpreter wide arguments",
-        "type": "textarea"
-      },
-      "zeppelin.scio.maxResult": {
-        "envName": "ZEPPELIN_SCIO_MAXRESULT",
-        "propertyName": "zeppelin.scio.maxResult",
-        "defaultValue": "1000",
-        "description": "Max number of SCollection results to display.",
-        "type": "number"
-      }
-    },
-    "editor": {
-      "language": "scala"
-    }
   }
 ]
diff --git a/conf/interpreter-list b/conf/interpreter-list
index 270d243b5c..766c66fa96 100644
--- a/conf/interpreter-list
+++ b/conf/interpreter-list
@@ -39,7 +39,6 @@ neo4j           org.apache.zeppelin:zeppelin-neo4j:0.10.0                Neo4j i
 pig             org.apache.zeppelin:zeppelin-pig:0.10.0                  Pig interpreter
 python          org.apache.zeppelin:zeppelin-python:0.10.0               Python interpreter
 sap             org.apache.zeppelin:zeppelin-sap:0.10.0                  SAP Support
-scio            org.apache.zeppelin:zeppelin-scio:0.10.0                 Scio interpreter
 shell           org.apache.zeppelin:zeppelin-shell:0.10.0                Shell command
 sparql          org.apache.zeppelin:zeppelin-sparql:0.10.0               Sparql interpreter
 submarine       org.apache.zeppelin:zeppelin-submarine:0.10.0            Submarine interpreter
diff --git a/dev/create_release.sh b/dev/create_release.sh
index ae2162aa9b..a9571502b6 100755
--- a/dev/create_release.sh
+++ b/dev/create_release.sh
@@ -97,7 +97,8 @@ function make_binary_release() {
 
 git_clone
 make_source_package
-make_binary_release netinst "-Pweb-angular -Phadoop-2.6 -pl !beam,!hbase,!pig,!jdbc,!file,!flink,!ignite,!cassandra,!elasticsearch,!bigquery,!alluxio,!scio,!livy,!groovy,!sap,!java,!geode,!neo4j,!hazelcastjet,!submarine,!sparql,!mongodb,!ksql -am"
+
+make_binary_release netinst "-Pweb-angular -Phadoop-2.6 -pl !beam,!hbase,!pig,!jdbc,!file,!flink,!ignite,!cassandra,!elasticsearch,!bigquery,!alluxio,!livy,!groovy,!sap,!java,!geode,!neo4j,!hazelcastjet,!submarine,!sparql,!mongodb,!ksql -am"
 make_binary_release all "-Pweb-angular -Phadoop-2.6"
 
 # remove non release files and dirs
diff --git a/docs/_includes/themes/zeppelin/_navigation.html b/docs/_includes/themes/zeppelin/_navigation.html
index ceed569605..d7b0cb9fbc 100644
--- a/docs/_includes/themes/zeppelin/_navigation.html
+++ b/docs/_includes/themes/zeppelin/_navigation.html
@@ -163,7 +163,6 @@
                 <li><a href="{{BASE_PATH}}/interpreter/pig.html">Pig</a></li>
                 <li><a href="{{BASE_PATH}}/interpreter/postgresql.html">Postgresql, HAWQ</a></li>
                 <li><a href="{{BASE_PATH}}/interpreter/sap.html">SAP</a></li>
-                <li><a href="{{BASE_PATH}}/interpreter/scio.html">Scio</a></li>
                 <li><a href="{{BASE_PATH}}/interpreter/shell.html">Shell</a></li>
                 <li><a href="{{BASE_PATH}}/interpreter/sparql.html">Sparql</a></li>
                 <li><a href="{{BASE_PATH}}/interpreter/submarine.html">Submarine</a></li>
diff --git a/docs/index.md b/docs/index.md
index d3e5a461d5..8837b3b95b 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -163,7 +163,6 @@ limitations under the License.
   * [Python](./interpreter/python.html)
   * [R](./interpreter/r.html)
   * [SAP](./interpreter/sap.html)
-  * [Scio](./interpreter/scio.html)
   * [Shell](./interpreter/shell.html)
   * [Spark](./interpreter/spark.html)
   * [Sparql](./interpreter/sparql.html)
diff --git a/docs/interpreter/scio.md b/docs/interpreter/scio.md
deleted file mode 100644
index cb8d1278ec..0000000000
--- a/docs/interpreter/scio.md
+++ /dev/null
@@ -1,169 +0,0 @@
----
-layout: page
-title: "Scio Interpreter for Apache Zeppelin"
-description: "Scio is a Scala DSL for Apache Beam/Google Dataflow model."
-group: interpreter
----
-<!--
-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 %}
-
-# Scio Interpreter for Apache Zeppelin
-
-<div id="toc"></div>
-
-## Overview
-Scio is a Scala DSL for [Google Cloud Dataflow](https://github.com/GoogleCloudPlatform/DataflowJavaSDK) and [Apache Beam](http://beam.incubator.apache.org/) inspired by [Spark](http://spark.apache.org/) and [Scalding](https://github.com/twitter/scalding). See the current [wiki](https://github.com/spotify/scio/wiki) and [API documentation](http://spotify.github.io/scio/) for more information.
-
-## Configuration
-<table class="table-configuration">
-  <tr>
-    <th>Name</th>
-    <th>Default Value</th>
-    <th>Description</th>
-  </tr>
-  <tr>
-    <td>zeppelin.scio.argz</td>
-    <td>--runner=InProcessPipelineRunner</td>
-    <td>Scio interpreter wide arguments. Documentation: https://github.com/spotify/scio/wiki#options and https://cloud.google.com/dataflow/pipelines/specifying-exec-params</td>
-  </tr>
-  <tr>
-    <td>zeppelin.scio.maxResult</td>
-    <td>1000</td>
-    <td>Max number of SCollection results to display</td>
-  </tr>
-
-</table>
-
-## Enabling the Scio Interpreter
-
-In a notebook, to enable the **Scio** interpreter, click the **Gear** icon and select **beam** (**beam.scio**).
-
-## Using the Scio Interpreter
-
-In a paragraph, use `%beam.scio` to select the **Scio** interpreter. You can use it much the same way as vanilla Scala REPL and [Scio REPL](https://github.com/spotify/scio/wiki/Scio-REPL). State (like variables, imports, execution etc) is shared among all *Scio* paragraphs. There is a special variable **argz** which holds arguments from Scio interpreter settings. The easiest way to proceed is to create a Scio context via standard `ContextAndArgs`.
-
-```scala
-%beam.scio
-val (sc, args) = ContextAndArgs(argz)
-```
-
-Use `sc` context the way you would in a regular pipeline/REPL.
-
-Example:
-
-```scala
-%beam.scio
-val (sc, args) = ContextAndArgs(argz)
-sc.parallelize(Seq("foo", "foo", "bar")).countByValue.closeAndDisplay()
-```
-
-If you close Scio context, go ahead an create a new one using `ContextAndArgs`. Please refer to [Scio wiki](https://github.com/spotify/scio/wiki) for more complex examples. You can close Scio context much the same way as in Scio REPL, and use Zeppelin display helpers to synchronously close and display results - read more below.
-
-### Progress
-
-There can be only one paragraph running at once. There is no notion of overall progress, thus progress bar will show `0`.
-
-### SCollection display helpers
-
-Scio interpreter comes with display helpers to ease working with Zeppelin notebooks. Simply use `closeAndDisplay()` on `SCollection` to close context and display the results. The number of results is limited by `zeppelin.scio.maxResult` (by default 1000).
-
-Supported `SCollection` types:
-
- * Scio's typed BigQuery
- * Scala's Products (case classes, tuples)
- * Google BigQuery's TableRow
- * Apache Avro
- * All Scala's `AnyVal`
-
-#### Helper methods
-
-There are different helper methods for different objects. You can easily display results from `SCollection`, `Future[Tap]` and `Tap`.
-
-##### `SCollection` helper
-
-`SCollection` has `closeAndDisplay` Zeppelin helper method for types listed above. Use it to synchronously close Scio context, and once available pull and display results.
-
-##### `Future[Tap]` helper
-
-`Future[Tap]` has `waitAndDisplay` Zeppelin helper method for types listed above. Use it to synchronously wait for results, and once available pull and display results.
-
-##### `Tap` helper
-
-`Tap` has `display` Zeppelin helper method for types listed above. Use it to pull and display results.
-
-### Examples
-
-#### BigQuery example:
-
-```scala
-%beam.scio
-@BigQueryType.fromQuery("""|SELECT departure_airport,count(case when departure_delay>0 then 1 else 0 end) as no_of_delays
-                           |FROM [bigquery-samples:airline_ontime_data.flights]
-                           |group by departure_airport
-                           |order by 2 desc
-                           |limit 10""".stripMargin) class Flights
-
-val (sc, args) = ContextAndArgs(argz)
-sc.bigQuerySelect(Flights.query).closeAndDisplay(Flights.schema)
-```
-
-#### BigQuery typed example:
-
-```scala
-%beam.scio
-@BigQueryType.fromQuery("""|SELECT departure_airport,count(case when departure_delay>0 then 1 else 0 end) as no_of_delays
-                           |FROM [bigquery-samples:airline_ontime_data.flights]
-                           |group by departure_airport
-                           |order by 2 desc
-                           |limit 10""".stripMargin) class Flights
-
-val (sc, args) = ContextAndArgs(argz)
-sc.typedBigQuery[Flights]().flatMap(_.no_of_delays).mean.closeAndDisplay()
-```
-
-#### Avro example:
-
-```scala
-%beam.scio
-import com.spotify.data.ExampleAvro
-
-val (sc, args) = ContextAndArgs(argz)
-sc.avroFile[ExampleAvro]("gs://<bucket>/tmp/my.avro").take(10).closeAndDisplay()
-```
-
-#### Avro example with a view schema:
-
-```scala
-%beam.scio
-import com.spotify.data.ExampleAvro
-import org.apache.avro.Schema
-
-val (sc, args) = ContextAndArgs(argz)
-val view = Schema.parse("""{"type":"record","name":"ExampleAvro","namespace":"com.spotify.data","fields":[{"name":"track","type":"string"}, {"name":"artist", "type":"string"}]}""")
-
-sc.avroFile[EndSongCleaned]("gs://<bucket>/tmp/my.avro").take(10).closeAndDisplay(view)
-```
-
-### Google credentials
-
-Scio Interpreter will try to infer your Google Cloud credentials from its environment, it will take into the account:
-
- * `argz` interpreter settings ([doc](https://github.com/spotify/scio/wiki#options))
- * environment variable (`GOOGLE_APPLICATION_CREDENTIALS`)
- * gcloud configuration
-
-#### BigQuery macro credentials
-
-Currently BigQuery project for macro expansion is inferred using Google Dataflow's [DefaultProjectFactory().create()](https://github.com/GoogleCloudPlatform/DataflowJavaSDK/blob/master/sdk/src/main/java/com/google/cloud/dataflow/sdk/options/GcpOptions.java#L187)
diff --git a/docs/usage/interpreter/installation.md b/docs/usage/interpreter/installation.md
index aaea7b8ebc..a9705fee22 100644
--- a/docs/usage/interpreter/installation.md
+++ b/docs/usage/interpreter/installation.md
@@ -212,11 +212,6 @@ You can also find the below community managed interpreter list in `conf/interpre
     <td>org.apache.zeppelin:zeppelin-sap:0.10.0</td>
     <td>SAP support</td>
   </tr>
-  <tr>
-    <td>scio</td>
-    <td>org.apache.zeppelin:zeppelin-scio:0.10.0</td>
-    <td>Scio interpreter</td>
-  </tr>
   <tr>
     <td>shell</td>
     <td>org.apache.zeppelin:zeppelin-shell:0.10.0</td>
diff --git a/pom.xml b/pom.xml
index b4c1814c9a..c4f5a0f92c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -83,7 +83,6 @@
     <module>elasticsearch</module>
     <module>bigquery</module>
     <module>alluxio</module>
-    <module>scio</module>
     <module>neo4j</module>
     <module>sap</module>
     <module>java</module>
@@ -1455,7 +1454,7 @@
             </goals>
             <configuration>
               <failOnViolation>true</failOnViolation>
-              <excludes>org/apache/zeppelin/interpreter/thrift/*,org/apache/zeppelin/scio/avro/*,org/apache/zeppelin/python/proto/*</excludes>
+              <excludes>org/apache/zeppelin/interpreter/thrift/*,org/apache/zeppelin/python/proto/*</excludes>
             </configuration>
           </execution>
           <execution>
@@ -1465,7 +1464,7 @@
               <goal>checkstyle-aggregate</goal>
             </goals>
             <configuration>
-              <excludes>org/apache/zeppelin/interpreter/thrift/*,org/apache/zeppelin/scio/avro/*,org/apache/zeppelin/python/proto/*</excludes>
+              <excludes>org/apache/zeppelin/interpreter/thrift/*,org/apache/zeppelin/python/proto/*</excludes>
             </configuration>
           </execution>
         </executions>
diff --git a/scio/README.md b/scio/README.md
deleted file mode 100644
index 73d0cb67f1..0000000000
--- a/scio/README.md
+++ /dev/null
@@ -1,18 +0,0 @@
-Scio interpreter for Apache Zeppelin
-====================================
-
-## Raison d'ĂȘtre:
-
-Provide Scio Interpreter for Zeppelin.
-
-## Build
-
-```
-./mvnw -pl zeppelin-interpreter,zeppelin-display,scio -DskipTests package
-```
-
-## Test
-
-```
-./mvnw -pl scio,zeppelin-display,zeppelin-interpreter -Dtest='org.apache.zeppelin.scio.*' -DfailIfNoTests=false test
-```
diff --git a/scio/pom.xml b/scio/pom.xml
deleted file mode 100644
index d3c3c1a214..0000000000
--- a/scio/pom.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one or more
-  ~ contributor license agreements.  See the NOTICE file distributed with
-  ~ this work for additional information regarding copyright ownership.
-  ~ The ASF licenses this file to You 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.
-  -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <artifactId>zeppelin-interpreter-parent</artifactId>
-    <groupId>org.apache.zeppelin</groupId>
-    <version>0.11.0-SNAPSHOT</version>
-    <relativePath>../zeppelin-interpreter-parent/pom.xml</relativePath>
-  </parent>
-
-  <artifactId>zeppelin-scio</artifactId>
-  <packaging>jar</packaging>
-  <name>Zeppelin: Scio</name>
-  <description>Zeppelin Scio support</description>
-
-  <properties>
-    <interpreter.name>scio</interpreter.name>
-    <!--library versions-->
-    <scio.version>0.2.4</scio.version>
-    <guava.version>14.0.1</guava.version> <!-- update needed -->
-    <scio.scala.version>${scala.2.10.version}</scio.scala.version>
-    <scio.scala.binary.version>2.10</scio.scala.binary.version>
-
-    <!--test library versions-->
-    <hamcrest.all.version>1.3</hamcrest.all.version>
-  </properties>
-
-  <dependencies>
-
-    <dependency>
-      <groupId>com.spotify</groupId>
-      <artifactId>scio-repl_${scio.scala.binary.version}</artifactId>
-      <version>${scio.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-      <version>${guava.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.scala-lang</groupId>
-      <artifactId>scala-library</artifactId>
-      <version>${scala.2.10.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.scala-lang</groupId>
-      <artifactId>scala-compiler</artifactId>
-      <version>${scala.2.10.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.scala-lang</groupId>
-      <artifactId>scala-reflect</artifactId>
-      <version>${scala.2.10.version}</version>
-    </dependency>
-
-    <!-- test libraries -->
-    <dependency>
-      <groupId>org.scalatest</groupId>
-      <artifactId>scalatest_${scio.scala.binary.version}</artifactId>
-      <version>${scalatest.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.hamcrest</groupId>
-      <artifactId>hamcrest-all</artifactId>
-      <version>${hamcrest.all.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>com.google.code.gson</groupId>
-      <artifactId>gson</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-enforcer-plugin</artifactId>
-      </plugin>
-      <plugin>
-        <artifactId>maven-resources-plugin</artifactId>
-      </plugin>
-      <plugin>
-        <artifactId>maven-shade-plugin</artifactId>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <forkCount>1</forkCount>
-          <reuseForks>false</reuseForks>
-          <argLine>-Xmx1024m -XX:MaxMetaspaceSize=512m</argLine>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.scala-tools</groupId>
-        <artifactId>maven-scala-plugin</artifactId>
-        <configuration>
-          <scalaVersion>${scio.scala.version}</scalaVersion>
-        </configuration>
-        <executions>
-          <execution>
-            <id>compile</id>
-            <goals>
-              <goal>compile</goal>
-            </goals>
-            <phase>compile</phase>
-          </execution>
-          <execution>
-            <id>test-compile</id>
-            <goals>
-              <goal>testCompile</goal>
-            </goals>
-            <phase>test-compile</phase>
-          </execution>
-          <execution>
-            <phase>process-resources</phase>
-            <goals>
-              <goal>compile</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-      <!-- plugin to compile avro for tests -->
-      <plugin>
-        <groupId>org.apache.avro</groupId>
-        <artifactId>avro-maven-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>generate-sources</phase>
-            <goals>
-              <goal>schema</goal>
-            </goals>
-            <configuration>
-              <sourceDirectory>${project.basedir}/src/test/avro/</sourceDirectory>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-</project>
diff --git a/scio/src/main/scala/org/apache/zeppelin/scio/ContextAndArgs.scala b/scio/src/main/scala/org/apache/zeppelin/scio/ContextAndArgs.scala
deleted file mode 100644
index cb1b390be4..0000000000
--- a/scio/src/main/scala/org/apache/zeppelin/scio/ContextAndArgs.scala
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-package org.apache.zeppelin.scio
-
-import com.google.cloud.dataflow.sdk.options.PipelineOptions
-import com.spotify.scio.repl.ReplScioContext
-import com.spotify.scio.{Args, ScioContext}
-
-/**
- * Convenience object for creating [[com.spotify.scio.ScioContext]] and [[com.spotify.scio.Args]].
- */
-object ContextAndArgs {
-  def apply(argz: Array[String]): (ScioContext, Args) = {
-    val (dfOpts, args) = ScioContext.parseArguments[PipelineOptions](argz)
-
-    val nextReplJar = this
-      .getClass
-      .getClassLoader
-      .asInstanceOf[{def getNextReplCodeJarPath: String}].getNextReplCodeJarPath
-
-    val sc = new ReplScioContext(dfOpts, List(nextReplJar))
-    sc.setName("sciozeppelin")
-
-    (sc, args)
-  }
-}
diff --git a/scio/src/main/scala/org/apache/zeppelin/scio/DisplayHelpers.scala b/scio/src/main/scala/org/apache/zeppelin/scio/DisplayHelpers.scala
deleted file mode 100644
index bfb4f9c73a..0000000000
--- a/scio/src/main/scala/org/apache/zeppelin/scio/DisplayHelpers.scala
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-package org.apache.zeppelin.scio
-
-import com.google.api.services.bigquery.model.TableSchema
-import com.spotify.scio.bigquery._
-import org.apache.avro.Schema
-import org.apache.avro.generic.GenericRecord
-
-import scala.reflect.ClassTag
-
-/**
- * Set of helpers for Zeppelin Display system.
- */
-private[scio] object DisplayHelpers {
-
-  private[scio] val sCollectionEmptyMsg =
-    "\n%html <font color=red>Result SCollection is empty!</font>\n"
-  private val maxResults = Integer.getInteger("zeppelin.scio.maxResult", 1000)
-  private[scio] val tab = "\t"
-  private[scio] val newline = "\n"
-  private[scio] val table = "%table"
-  private[scio] val endTable = "\n%text"
-  private[scio] val rowLimitReachedMsg =
-    s"$newline<font color=red>Results are limited to " + maxResults + s" rows.</font>$newline"
-  private[scio] val bQSchemaIncomplete =
-    s"$newline<font color=red>Provided BigQuery Schema has not fields!</font>$newline"
-
-  private def notifyIfTruncated(it: Iterator[_]): Unit = {
-    if(it.hasNext) println(rowLimitReachedMsg)
-  }
-
-  /**
-   * Displays [[AnyVal]] values from given [[Iterator]].
-   */
-  private[scio] def displayAnyVal[T: ClassTag](it: Iterator[T], printer: (T) => String): Unit = {
-    if (it.isEmpty) {
-      println(sCollectionEmptyMsg)
-    } else {
-      println(s"$table value$newline${it.take(maxResults).map(printer).mkString(newline)}")
-      println(endTable)
-      notifyIfTruncated(it)
-    }
-  }
-
-  /**
-   * Displays [[String]] values from given [[Iterator]].
-   */
-  private[scio] def displayString[T: ClassTag](it: Iterator[T], printer: (T) => String): Unit = {
-    if (it.isEmpty) {
-      println(sCollectionEmptyMsg)
-    } else {
-      println(s"$table value$newline${it.take(maxResults).map(printer).mkString(newline)}")
-      println(endTable)
-      notifyIfTruncated(it)
-    }
-  }
-
-  /**
-   * Displays [[com.google.cloud.dataflow.sdk.values.KV]] values from given [[Iterator]].
-   */
-  private[scio] def displayKV[K: ClassTag, V: ClassTag](it: Iterator[(K,V)]): Unit = {
-    if (it.isEmpty) {
-      println(sCollectionEmptyMsg)
-    } else {
-      val content = it.take(maxResults).map{ case (k, v) => s"$k$tab$v" }.mkString(newline)
-      println(s"$table key${tab}value$newline$content")
-      println(endTable)
-      notifyIfTruncated(it)
-    }
-  }
-
-  /**
-   * Displays [[Product]] values from given [[Iterator]].
-   */
-  private[scio] def displayProduct[T: ClassTag](it: Iterator[T])
-                                               (implicit ev: T <:< Product): Unit = {
-    if (it.isEmpty) {
-      println(sCollectionEmptyMsg)
-    } else {
-      val first = it.next()
-      //TODO is this safe field name to value iterator?
-      val fieldNames = first.getClass.getDeclaredFields.map(_.getName)
-
-      val header = fieldNames.mkString(tab)
-      val firstStr = first.productIterator.mkString(tab)
-      val content = it.take(maxResults - 1).map(_.productIterator.mkString(tab)).mkString(newline)
-      println(s"$table $header$newline$firstStr$newline$content")
-      println(endTable)
-      notifyIfTruncated(it)
-    }
-  }
-
-  /**
-   * Displays Avro values from given [[Iterator]] using optional [[Schema]].
-   * @param schema optional "view" schema, otherwise schema is inferred from the first object
-   */
-  private[scio] def displayAvro[T: ClassTag](it: Iterator[T], schema: Schema = null)
-                                            (implicit ev: T <:< GenericRecord): Unit = {
-    if (it.isEmpty) {
-      println(sCollectionEmptyMsg)
-    } else {
-      val first = it.next()
-      import collection.JavaConverters._
-
-      val fieldNames = if (schema != null) {
-        schema.getFields.iterator().asScala.map(_.name()).toArray
-      } else {
-        first.getSchema.getFields.iterator.asScala.map(_.name()).toArray
-      }
-
-      val header = fieldNames.mkString(tab)
-      val firstStr = fieldNames.map(first.get).mkString(tab)
-      val content = it.take(maxResults - 1)
-        .map(r => fieldNames.map(r.get).mkString(tab))
-        .mkString(newline)
-      println(s"$table $header$newline$firstStr$newline$content")
-      println(endTable)
-      notifyIfTruncated(it)
-    }
-  }
-
-  /**
-   * Displays [[TableRow]] values from given [[Iterator]] using specified [[TableSchema]].
-   */
-  private[scio] def displayBQTableRow[T: ClassTag](it: Iterator[T], schema: TableSchema)
-                                                  (implicit ev: T <:< TableRow) : Unit = {
-    if (it.isEmpty) {
-      println(sCollectionEmptyMsg)
-    } else {
-      import collection.JavaConverters._
-      val fieldsOp = Option(schema.getFields)
-      fieldsOp match {
-        case None => println(bQSchemaIncomplete)
-        case Some(f) => {
-          val fields = f.asScala.map(_.getName).toArray
-
-          val header = fields.mkString(tab)
-
-          val content = it.take(maxResults)
-            .map(r => fields.map(r.get).mkString(tab))
-            .mkString(newline)
-
-          println(s"$table $header$newline$content")
-          println(endTable)
-          notifyIfTruncated(it)
-        }
-      }
-    }
-  }
-
-}
diff --git a/scio/src/main/scala/org/apache/zeppelin/scio/DisplaySCollectionImplicits.scala b/scio/src/main/scala/org/apache/zeppelin/scio/DisplaySCollectionImplicits.scala
deleted file mode 100644
index 566e106c57..0000000000
--- a/scio/src/main/scala/org/apache/zeppelin/scio/DisplaySCollectionImplicits.scala
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-package org.apache.zeppelin.scio
-
-import com.google.api.services.bigquery.model.TableSchema
-import com.spotify.scio._
-import com.spotify.scio.bigquery._
-import com.spotify.scio.values.SCollection
-import org.apache.avro.Schema
-import org.apache.avro.generic.GenericRecord
-
-import scala.reflect.ClassTag
-
-/**
- * Implicit Zeppelin display helpers for SCollection.
- */
-object DisplaySCollectionImplicits {
-
-  private def materialize[T: ClassTag](self: SCollection[T]) = {
-    val f = self.materialize
-    self.context.close()
-    f
-  }
-
-  // TODO: scala 2.11
-  // implicit class ZeppelinSCollection[T: ClassTag](private val self: SCollection[T])(implicit ev: T <:< AnyVal) extends AnyVal {
-  implicit class ZeppelinSCollection[T: ClassTag](val self: SCollection[T])
-                                                 (implicit ev: T <:< AnyVal) {
-    /** Convenience method to close the current [[com.spotify.scio.ScioContext]]
-     * and display elements from SCollection. */
-    def closeAndDisplay(printer: (T) => String = (e: T) => e.toString): Unit = {
-      DisplayTapImplicits.ZeppelinTap(materialize(self).waitForResult()).display(printer)
-    }
-  }
-
-  // TODO: scala 2.11
-  // implicit class ZeppelinSCollection[T: ClassTag](private val self: SCollection[T]) extends AnyVal {
-  implicit class ZeppelinStringSCollection[T: ClassTag](val self: SCollection[T])
-                                                       (implicit ev: T <:< String) {
-    /** Convenience method to close the current [[com.spotify.scio.ScioContext]]
-     * and display elements from SCollection. */
-    def closeAndDisplay(printer: (T) => String = (e: T) => e.toString): Unit = {
-      DisplayTapImplicits.ZeppelinStringTap(materialize(self).waitForResult()).display(printer)
-    }
-  }
-
-  // TODO: scala 2.11
-  // implicit class ZeppelinKVSCollection[K: ClassTag, V: ClassTag](val self: SCollection[(K, V)]) extends AnyVal {
-  implicit class ZeppelinKVSCollection[K: ClassTag, V: ClassTag](val self: SCollection[(K, V)]) {
-    /** Convenience method to close the current [[com.spotify.scio.ScioContext]]
-     * and display elements from KV SCollection. */
-    def closeAndDisplay(): Unit = {
-      DisplayTapImplicits.ZeppelinKVTap(materialize(self).waitForResult()).display()
-    }
-  }
-
-  // TODO: scala 2.11
-  // implicit class ZeppelinProductSCollection[T: ClassTag](val self: SCollection[T])(implicit ev: T <:< Product) extends AnyVal {
-  implicit class ZeppelinProductSCollection[T: ClassTag](val self: SCollection[T])
-                                                        (implicit ev: T <:< Product) {
-    /** Convenience method to close the current [[com.spotify.scio.ScioContext]]
-     * and display elements from Product like SCollection */
-    def closeAndDisplay(): Unit = {
-      DisplayTapImplicits.ZeppelinProductTap(materialize(self).waitForResult()).display()
-    }
-  }
-
-  // TODO: scala 2.11
-  // implicit class ZeppelinAvroSCollection[T: ClassTag](val self: SCollection[T])(implicit ev: T <:< GenericRecord) extends AnyVal {
-  implicit class ZeppelinAvroSCollection[T: ClassTag](val self: SCollection[T])
-                                                     (implicit ev: T <:< GenericRecord) {
-    /** Convenience method to close the current [[com.spotify.scio.ScioContext]]
-     * and display elements from Avro like SCollection */
-    def closeAndDisplay(schema: Schema = null): Unit = {
-      DisplayTapImplicits.ZeppelinAvroTap(materialize(self).waitForResult()).display(schema)
-    }
-  }
-
-  // TODO: scala 2.11
-  // implicit class ZeppelinBQTableSCollection[T: ClassTag](val self: SCollection[T])(implicit ev: T <:< TableRow) extends AnyVal {
-  implicit class ZeppelinBQTableSCollection[T: ClassTag](val self: SCollection[T])
-                                                        (implicit ev: T <:< TableRow) {
-    /** Convenience method to close the current [[com.spotify.scio.ScioContext]]
-     * and display elements from TableRow like SCollection */
-    def closeAndDisplay(schema: TableSchema): Unit = {
-      DisplayTapImplicits.ZeppelinBQTableTap(materialize(self).waitForResult()).display(schema)
-    }
-  }
-
-}
diff --git a/scio/src/main/scala/org/apache/zeppelin/scio/DisplayTapImplicits.scala b/scio/src/main/scala/org/apache/zeppelin/scio/DisplayTapImplicits.scala
deleted file mode 100644
index 8aafc310a0..0000000000
--- a/scio/src/main/scala/org/apache/zeppelin/scio/DisplayTapImplicits.scala
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-package org.apache.zeppelin.scio
-
-import com.google.api.services.bigquery.model.TableSchema
-import com.spotify.scio.bigquery.TableRow
-import com.spotify.scio.io.Tap
-import com.spotify.scio._
-import org.apache.avro.Schema
-import org.apache.avro.generic.GenericRecord
-
-import scala.concurrent.Future
-import scala.reflect.ClassTag
-
-/**
- * Implicit Zeppelin display helpers for [[Tap]] and [[Future]] of a [[Tap]].
- */
-object DisplayTapImplicits {
-
-  // TODO: scala 2.11
-  // implicit class ZeppelinTap[T: ClassTag](private val self: Tap[T])(implicit ev: T <:< AnyVal) extends AnyVal {
-  implicit class ZeppelinTap[T: ClassTag](val self: Tap[T])
-                                         (implicit ev: T <:< AnyVal) {
-    /** Convenience method to display [[com.spotify.scio.io.Tap]] of AnyVal. */
-    def display(printer: (T) => String = (e: T) => e.toString): Unit = {
-      DisplayHelpers.displayAnyVal(self.value, printer)
-    }
-  }
-
-  // TODO: scala 2.11
-  // implicit class ZeppelinFutureTap[T: ClassTag](private val self: Future[Tap[T]])(implicit ev: T <:< AnyVal) extends AnyVal {
-  implicit class ZeppelinFutureTap[T: ClassTag](val self: Future[Tap[T]])
-                                               (implicit ev: T <:< AnyVal) {
-    /** Convenience method to display [[Future]] of a [[com.spotify.scio.io.Tap]] of AnyVal. */
-    def waitAndDisplay(printer: (T) => String = (e: T) => e.toString): Unit = {
-      ZeppelinTap(self.waitForResult()).display(printer)
-    }
-  }
-
-  // TODO: scala 2.11
-  // implicit class ZeppelinStringTap[T: ClassTag](private val self: Tap[T])(implicit ev: T <:< String) extends AnyVal {
-  implicit class ZeppelinStringTap[T: ClassTag](val self: Tap[T])
-                                               (implicit ev: T <:< String) {
-    /** Convenience method to display [[com.spotify.scio.io.Tap]] of Strings. */
-    def display(printer: (T) => String = (e: T) => e.toString): Unit = {
-      DisplayHelpers.displayString(self.value, printer)
-    }
-  }
-
-  // TODO: scala 2.11
-  // implicit class ZeppelinFutureStringTap[T: ClassTag](private val self: Tap[T])(implicit ev: T <:< String) extends AnyVal {
-  implicit class ZeppelinFutureStringTap[T: ClassTag](val self: Future[Tap[T]])
-                                                     (implicit ev: T <:< String) {
-    /** Convenience method to display [[Future]] of a [[com.spotify.scio.io.Tap]] of Strings. */
-    def waitAndDisplay(printer: (T) => String = (e: T) => e.toString): Unit = {
-      ZeppelinStringTap(self.waitForResult()).display(printer)
-    }
-  }
-
-  // TODO: scala 2.11
-  // implicit class ZeppelinKVTap[K: ClassTag, V: ClassTag](val self: Tap[(K, V)]) extends AnyVal {
-  implicit class ZeppelinKVTap[K: ClassTag, V: ClassTag](val self: Tap[(K, V)]) {
-    /** Convenience method to display [[com.spotify.scio.io.Tap]] of KV. */
-    def display(): Unit = {
-      DisplayHelpers.displayKV(self.value)
-    }
-  }
-
-  // TODO: scala 2.11
-  // implicit class ZeppelinFutureKVTap[K: ClassTag, V: ClassTag](val self: Future[Tap[(K, V)]]) extends AnyVal {
-  implicit class ZeppelinFutureKVTap[K: ClassTag, V: ClassTag](val self: Future[Tap[(K, V)]]) {
-    /** Convenience method to display [[Future]] of a [[com.spotify.scio.io.Tap]] of KV. */
-    def waitAndDisplay(): Unit = {
-      ZeppelinKVTap(self.waitForResult()).display()
-    }
-  }
-
-  // TODO: scala 2.11
-  // implicit class ZeppelinProductTap[T: ClassTag](val self: Tap[T])(implicit ev: T <:< Product) extends AnyVal {
-  implicit class ZeppelinProductTap[T: ClassTag](val self: Tap[T])
-                                                (implicit ev: T <:< Product) {
-    /** Convenience method to display [[com.spotify.scio.io.Tap]] of Product. */
-    def display(): Unit = {
-      DisplayHelpers.displayProduct(self.value)
-    }
-  }
-
-  // TODO: scala 2.11
-  // implicit class ZeppelinFutureProductTap[T: ClassTag](val self: Future[Tap[T]])(implicit ev: T <:< Product) extends AnyVal {
-  implicit class ZeppelinFutureProductTap[T: ClassTag](val self: Future[Tap[T]])
-                                                      (implicit ev: T <:< Product) {
-    /** Convenience method to display [[Future]] of a [[com.spotify.scio.io.Tap]] of Product. */
-    def waitAndDisplay(): Unit = {
-      ZeppelinProductTap(self.waitForResult()).display()
-    }
-  }
-
-  // TODO: scala 2.11
-  // implicit class ZeppelinAvroTap[T: ClassTag](val self: Tap[T])(implicit ev: T <:< GenericRecord) extends AnyVal {
-  implicit class ZeppelinAvroTap[T: ClassTag](val self: Tap[T])
-                                             (implicit ev: T <:< GenericRecord) {
-    /** Convenience method to display [[com.spotify.scio.io.Tap]] of Avro. */
-    def display(schema: Schema = null): Unit = {
-      DisplayHelpers.displayAvro(self.value, schema)
-    }
-  }
-
-  // TODO: scala 2.11
-  // implicit class ZeppelinFutureAvroTap[T: ClassTag](val self: Future[Tap[T]])(implicit ev: T <:< GenericRecord) extends AnyVal {
-  implicit class ZeppelinFutureAvroTap[T: ClassTag](val self: Future[Tap[T]])
-                                                   (implicit ev: T <:< GenericRecord) {
-    /** Convenience method to display [[Future]] of a [[com.spotify.scio.io.Tap]] of Avro. */
-    def waitAndDisplay(schema: Schema = null): Unit = {
-      ZeppelinAvroTap(self.waitForResult()).display(schema)
-    }
-  }
-
-  // TODO: scala 2.11
-  // implicit class ZeppelinBQTableTap[T: ClassTag](val self: Tap[T])(implicit ev: T <:< TableRow) extends AnyVal {
-  implicit class ZeppelinBQTableTap[T: ClassTag](val self: Tap[T])
-                                                (implicit ev: T <:< TableRow) {
-    /** Convenience method to display [[com.spotify.scio.io.Tap]] of BigQuery TableRow. */
-    def display(schema: TableSchema): Unit = {
-      DisplayHelpers.displayBQTableRow(self.value, schema)
-    }
-  }
-
-  // TODO: scala 2.11
-  // implicit class ZeppelinFutureBQTableTap[T: ClassTag](val self: Future[Tap[T]])(implicit ev: T <:< TableRow) extends AnyVal {
-  implicit class ZeppelinFutureBQTableTap[T: ClassTag](val self: Future[Tap[T]])
-                                                      (implicit ev: T <:< TableRow) {
-    /** Convenience method to display [[Future]] of a [[com.spotify.scio.io.Tap]] of BigQuery
-     * TableRow. */
-    def waitAndDisplay(schema: TableSchema): Unit = {
-      ZeppelinBQTableTap(self.waitForResult()).display(schema)
-    }
-  }
-
-}
diff --git a/scio/src/main/scala/org/apache/zeppelin/scio/ScioInterpreter.scala b/scio/src/main/scala/org/apache/zeppelin/scio/ScioInterpreter.scala
deleted file mode 100644
index f3400815b5..0000000000
--- a/scio/src/main/scala/org/apache/zeppelin/scio/ScioInterpreter.scala
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-package org.apache.zeppelin.scio
-
-import java.beans.Introspector
-import java.io.PrintStream
-import java.util.Properties
-
-import com.google.cloud.dataflow.sdk.options.{PipelineOptions, PipelineOptionsFactory}
-import com.google.cloud.dataflow.sdk.runners.inprocess.InProcessPipelineRunner
-import com.spotify.scio.repl.{ScioILoop, ScioReplClassLoader}
-import org.apache.zeppelin.interpreter.Interpreter.FormType
-import org.apache.zeppelin.interpreter.util.InterpreterOutputStream
-import org.apache.zeppelin.interpreter.{Interpreter, InterpreterContext, InterpreterResult}
-import org.slf4j.LoggerFactory
-
-import scala.reflect.io.File
-import scala.tools.nsc.GenericRunnerCommand
-import scala.tools.nsc.interpreter.JPrintWriter
-import scala.tools.nsc.util.ClassPath
-
-/**
- * Scio interpreter for Zeppelin.
- *
- * <ul>
- * <li>{@code zeppelin.scio.argz} - Scio interpreter wide arguments</li>
- * <li>{@code zeppelin.scio.maxResult} - Max number of SCollection results to display.</li>
- * </ul>
- *
- * <p>
- * How to use: <br/>
- * {@code
- *  $beam.scio
- *  val (sc, args) = ContextAndArgs(argz)
- *  sc.parallelize(Seq("foo", "foo", "bar")).countByValue.closeAndDisplay()
- * }
- * </p>
- *
- */
-
-class ScioInterpreter(property: Properties) extends Interpreter(property) {
-  private val logger = LoggerFactory.getLogger(classOf[ScioInterpreter])
-  private var REPL: ScioILoop = _
-
-  val innerOut = new InterpreterOutputStream(logger)
-
-  override def open(): Unit = {
-    val argz = Option(getProperty("zeppelin.scio.argz"))
-      .getOrElse(s"--runner=${classOf[InProcessPipelineRunner].getSimpleName}")
-      .split(" ")
-      .map(_.trim)
-      .filter(_.nonEmpty)
-      .toList
-
-    // Process command line arguments into a settings object, and use that to start the REPL.
-    // We ignore params we don't care about - hence error function is empty
-    val command = new GenericRunnerCommand(argz, _ => ())
-    val settings = command.settings
-
-    settings.classpath.append(System.getProperty("java.class.path"))
-    settings.usejavacp.value = true
-
-    def classLoaderURLs(cl: ClassLoader): Array[java.net.URL] = cl match {
-      case null => Array()
-      case u: java.net.URLClassLoader => u.getURLs ++ classLoaderURLs(cl.getParent)
-      case _ => classLoaderURLs(cl.getParent)
-    }
-
-    classLoaderURLs(Thread.currentThread().getContextClassLoader)
-      .foreach(u => settings.classpath.append(u.getPath))
-
-    // We have to make sure that scala macros are expandable. paradise plugin has to be added to
-    // -Xplugin paths. In case of assembly - paradise is included in assembly jar - thus we add
-    // itself to -Xplugin. If shell is started from sbt or classpath, paradise jar has to be in
-    // classpath, we find it and add it to -Xplugin.
-
-    val thisJar = this.getClass.getProtectionDomain.getCodeSource.getLocation.getPath
-    // In some cases this may be `target/classes`
-    if(thisJar.endsWith(".jar")) settings.plugin.appendToValue(thisJar)
-
-    ClassPath
-      .split(settings.classpath.value)
-      .find(File(_).name.startsWith("paradise_"))
-      .foreach(settings.plugin.appendToValue)
-
-    // Force the repl to be synchronous, so all cmds are executed in the same thread
-    settings.Yreplsync.value = true
-
-    val jars = ClassPath.split(settings.classpath.value)
-      .flatMap(ClassPath.specToURL)
-      .toArray
-
-    val scioClassLoader = new ScioReplClassLoader(
-      jars ++ classLoaderURLs(Thread.currentThread().getContextClassLoader),
-      null,
-      Thread.currentThread.getContextClassLoader)
-
-    val (dfArgs, _) = parseAndPartitionArgs(argz)
-
-    REPL = new ScioILoop(scioClassLoader, dfArgs, None, new JPrintWriter(innerOut))
-    scioClassLoader.setRepl(REPL)
-
-    // Set classloader chain - expose top level abstract class loader down
-    // the chain to allow for readObject and latestUserDefinedLoader
-    // See https://gist.github.com/harrah/404272
-    settings.embeddedDefaults(scioClassLoader)
-
-    // No need for bigquery dumps
-    sys.props("bigquery.plugin.disable.dump") = true.toString
-
-    REPL.settings_=(settings)
-    REPL.createInterpreter()
-    REPL.interpret(s"""val argz = Array("${argz.mkString("\", \"")}")""")
-    REPL.interpret("import org.apache.zeppelin.scio.DisplaySCollectionImplicits._")
-    REPL.interpret("import org.apache.zeppelin.scio.DisplayTapImplicits._")
-    REPL.interpret("import org.apache.zeppelin.scio.ContextAndArgs")
-  }
-
-  private def parseAndPartitionArgs(args: List[String]): (List[String], List[String]) = {
-    import scala.collection.JavaConverters._
-    // Extract --pattern of all registered derived types of PipelineOptions
-    val classes = PipelineOptionsFactory.getRegisteredOptions.asScala + classOf[PipelineOptions]
-    val optPatterns = classes.flatMap { cls =>
-      cls.getMethods.flatMap { m =>
-        val n = m.getName
-        if ((!n.startsWith("get") && !n.startsWith("is")) ||
-          m.getParameterTypes.nonEmpty || m.getReturnType == classOf[Unit]) None
-        else Some(Introspector.decapitalize(n.substring(if (n.startsWith("is")) 2 else 3)))
-      }.map(s => s"--$s($$|=)".r)
-    }
-
-    // Split cmdlineArgs into 2 parts, optArgs for PipelineOptions and appArgs for Args
-    args.partition(arg => optPatterns.exists(_.findFirstIn(arg).isDefined))
-  }
-
-  override def close(): Unit = {
-    logger.info("Closing Scio interpreter!")
-    REPL.closeInterpreter()
-  }
-
-  override def interpret(code: String, context: InterpreterContext): InterpreterResult = {
-    val paragraphId = context.getParagraphId
-
-    val consoleOut = new PrintStream(innerOut)
-    System.setOut(consoleOut)
-    innerOut.setInterpreterOutput(context.out)
-
-    try {
-      import scala.tools.nsc.interpreter.Results._
-      REPL.interpret(code) match {
-        case Success => {
-          logger.debug(s"Successfully executed `$code` in $paragraphId")
-          new InterpreterResult(InterpreterResult.Code.SUCCESS)
-        }
-        case Error => {
-          logger.error(s"Error executing `$code` in $paragraphId")
-          new InterpreterResult(InterpreterResult.Code.ERROR, "Interpreter error")
-        }
-        case Incomplete => {
-          logger.warn(s"Code `$code` not complete in $paragraphId")
-          new InterpreterResult(InterpreterResult.Code.INCOMPLETE, "Incomplete expression")
-        }
-      }
-    } catch {
-      case e: Exception =>
-        logger.info("Interpreter exception", e)
-        new InterpreterResult(InterpreterResult.Code.ERROR, e.getMessage)
-    } finally {
-      innerOut.flush()
-      innerOut.setInterpreterOutput(null)
-      consoleOut.flush()
-    }
-  }
-
-  override def cancel(context: InterpreterContext): Unit = {
-    // not implemented
-  }
-
-  override def getFormType: FormType = FormType.NATIVE
-
-  override def getProgress(context: InterpreterContext): Int = {
-    // not implemented
-    0
-  }
-
-}
diff --git a/scio/src/test/avro/schema.avsc b/scio/src/test/avro/schema.avsc
deleted file mode 100644
index 07c3bea888..0000000000
--- a/scio/src/test/avro/schema.avsc
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "type": "record",
-  "name": "Account",
-  "namespace": "org.apache.zeppelin.scio.avro",
-  "doc": "Record for an account",
-  "fields": [
-    {"name": "id", "type": "int"},
-    {"name": "type", "type": "string"},
-    {"name": "name", "type": "string"},
-    {"name": "amount", "type": "double"}
-  ]
-}
diff --git a/scio/src/test/java/org/apache/zeppelin/scio/ScioInterpreterTest.java b/scio/src/test/java/org/apache/zeppelin/scio/ScioInterpreterTest.java
deleted file mode 100644
index 2e5c0d9bf0..0000000000
--- a/scio/src/test/java/org/apache/zeppelin/scio/ScioInterpreterTest.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-package org.apache.zeppelin.scio;
-
-import org.apache.zeppelin.display.AngularObjectRegistry;
-import org.apache.zeppelin.display.GUI;
-import org.apache.zeppelin.interpreter.*;
-import org.apache.zeppelin.resource.LocalResourcePool;
-import org.apache.zeppelin.user.AuthenticationInfo;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.Properties;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-public class ScioInterpreterTest {
-  private static ScioInterpreter repl;
-  private static InterpreterGroup intpGroup;
-  private InterpreterContext context;
-
-  private final String newline = "\n";
-
-  private InterpreterContext getNewContext() {
-    return InterpreterContext.builder()
-        .setNoteId("noteId")
-        .setParagraphId("paragraphId")
-        .build();
-  }
-
-  @Before
-  public void setUp() throws Exception {
-    if (repl == null) {
-      intpGroup = new InterpreterGroup();
-      intpGroup.put("note", new LinkedList<Interpreter>());
-      repl = new ScioInterpreter(new Properties());
-      repl.setInterpreterGroup(intpGroup);
-      intpGroup.get("note").add(repl);
-      repl.open();
-    }
-
-    context = getNewContext();
-  }
-
-  @Test
-  public void testBasicSuccess() {
-    assertEquals(InterpreterResult.Code.SUCCESS,
-        repl.interpret("val a = 1" + newline + "val b = 2", context).code());
-  }
-
-  @Test
-  public void testBasicSyntaxError() {
-    InterpreterResult error = repl.interpret("val a:Int = 'ds'", context);
-    assertEquals(InterpreterResult.Code.ERROR, error.code());
-    assertEquals("Interpreter error", error.message().get(0).getData());
-  }
-
-  @Test
-  public void testBasicIncomplete() {
-    InterpreterResult incomplete = repl.interpret("val a = \"\"\"", context);
-    assertEquals(InterpreterResult.Code.INCOMPLETE, incomplete.code());
-    assertEquals("Incomplete expression", incomplete.message().get(0).getData());
-  }
-
-  @Test
-  public void testBasicPipeline() {
-    assertEquals(InterpreterResult.Code.SUCCESS,
-        repl.interpret("val (sc, _) = ContextAndArgs(argz)" + newline
-            + "sc.parallelize(1 to 10).closeAndCollect().toList", context).code());
-  }
-
-  @Test
-  public void testBasicMultiStepPipeline() {
-    final StringBuilder code = new StringBuilder();
-    code.append("val (sc, _) = ContextAndArgs(argz)").append(newline)
-        .append("val numbers = sc.parallelize(1 to 10)").append(newline)
-        .append("val results = numbers.closeAndCollect().toList").append(newline)
-        .append("println(results)");
-    assertEquals(InterpreterResult.Code.SUCCESS,
-        repl.interpret(code.toString(), context).code());
-  }
-
-  @Test
-  public void testException() {
-    InterpreterResult exception = repl.interpret("val (sc, _) = ContextAndArgs(argz)" + newline
-        + "throw new Exception(\"test\")", context);
-    assertEquals(InterpreterResult.Code.ERROR, exception.code());
-    assertTrue(exception.message().get(0).getData().length() > 0);
-  }
-
-}
diff --git a/scio/src/test/resources/log4j.properties b/scio/src/test/resources/log4j.properties
deleted file mode 100644
index 8daee59d60..0000000000
--- a/scio/src/test/resources/log4j.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You 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.
-#
-
-log4j.rootLogger = INFO, stdout
-
-log4j.appender.stdout = org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%5p [%d] ({%t} %F[%M]:%L) - %m%n
diff --git a/scio/src/test/scala-2.11/org/apache/zeppelin/scio/DisplayHelpersTestScala211.scala b/scio/src/test/scala-2.11/org/apache/zeppelin/scio/DisplayHelpersTestScala211.scala
deleted file mode 100644
index 729dc87f5c..0000000000
--- a/scio/src/test/scala-2.11/org/apache/zeppelin/scio/DisplayHelpersTestScala211.scala
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-package org.apache.zeppelin.scio
-
-import org.apache.zeppelin.scio.util.TestUtils
-import org.junit.runner.RunWith
-import org.scalatest.junit.JUnitRunner
-import org.scalatest.{FlatSpec, Matchers}
-
-/**
- * Scala 2.11 DisplayHelpersTest tests.
- *
- * Most tests have test scope implicit imports due to scala 2.10 bug
- * https://issues.scala-lang.org/browse/SI-3346
- *
- * Note: we can't depend on the order of data coming from SCollection.
- */
-@RunWith(classOf[JUnitRunner]
-class DisplayHelpersTestScala211 extends FlatSpec with Matchers {
-  import TestUtils._
-
-  // -----------------------------------------------------------------------------------------------
-  // Product SCollection Tests
-  // -----------------------------------------------------------------------------------------------
-
-  it should "support SCollection of Case Class of 23" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinProductSCollection
-    val tupleHeader = s"$table " + (1 to 22).map(i => s"a$i$tab").mkString + "a23"
-    val o = captureOut {
-      sideEffectWithData(
-        Seq.fill(3)(CC23(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23))) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o should contain theSameElementsAs (Seq(tupleHeader) ++
-      Seq.fill(3)((1 to 22).map(i => s"$i$tab").mkString + "23"))
-    o.head should be(tupleHeader)
-  }
-
-}
diff --git a/scio/src/test/scala-2.11/org/apache/zeppelin/scio/TestCCScala211.scala b/scio/src/test/scala-2.11/org/apache/zeppelin/scio/TestCCScala211.scala
deleted file mode 100644
index eca120598f..0000000000
--- a/scio/src/test/scala-2.11/org/apache/zeppelin/scio/TestCCScala211.scala
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-package org.apache.zeppelin.scio
-
-case class CC23(a1: Int, a2: Int, a3: Int, a4: Int, a5: Int, a6: Int, a7: Int, a8: Int, a9: Int,
-                a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, a16: Int, a17: Int,
-                a18: Int, a19: Int, a20: Int, a21: Int, a22: Int, a23: Int)
\ No newline at end of file
diff --git a/scio/src/test/scala/org/apache/zeppelin/scio/DisplayHelpersTest.scala b/scio/src/test/scala/org/apache/zeppelin/scio/DisplayHelpersTest.scala
deleted file mode 100644
index a197fafc2d..0000000000
--- a/scio/src/test/scala/org/apache/zeppelin/scio/DisplayHelpersTest.scala
+++ /dev/null
@@ -1,570 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-package org.apache.zeppelin.scio
-
-import com.google.api.services.bigquery.model.{TableFieldSchema, TableSchema}
-import com.spotify.scio.bigquery._
-import org.apache.avro.Schema
-import org.apache.avro.Schema.Parser
-import org.apache.avro.generic.{GenericData, GenericRecord}
-import org.apache.zeppelin.scio.avro.Account
-import org.apache.zeppelin.scio.util.TestUtils
-import org.junit.runner.RunWith
-import org.scalatest.junit.JUnitRunner
-import org.scalatest.{FlatSpec, Matchers}
-
-/**
- * DisplayHelpersTest tests.
- *
- * Most tests have test scope implicit imports due to scala 2.10 bug
- * https://issues.scala-lang.org/browse/SI-3346
- *
- * Note: we can't depend on the order of data coming from SCollection.
- */
-@RunWith(classOf[JUnitRunner])
-class DisplayHelpersTest extends FlatSpec with Matchers {
-  private val testRowLimit = 20
-  sys.props("zeppelin.scio.maxResult") = 20.toString
-
-  import TestUtils._
-
-  // -----------------------------------------------------------------------------------------------
-  // AnyVal SCollection Tests
-  // -----------------------------------------------------------------------------------------------
-
-  private val anyValHeader = s"$table value"
-  private val endTableFooter = DisplayHelpers.endTable.split("\\n").last
-  private val endTableSeq = Seq("", endTableFooter)
-
-  "DisplayHelpers" should "support Integer SCollection via AnyVal" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq(1, 2, 3)) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o should contain theSameElementsAs Seq(anyValHeader,
-                                           "1",
-                                           "2",
-                                           "3") ++ endTableSeq
-    o.head should be(anyValHeader)
-    o.last should be(endTableFooter)
-  }
-
-  it should "support Long SCollection via AnyVal" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq(1L, 2L, 3L)) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o should contain theSameElementsAs Seq(anyValHeader,
-                                           "1",
-                                           "2",
-                                           "3") ++ endTableSeq
-    o.head should be(anyValHeader)
-    o.last should be(endTableFooter)
-  }
-
-  it should "support Double SCollection via AnyVal" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq(1.0D, 2.0D, 3.0D)) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o should contain theSameElementsAs Seq(anyValHeader,
-                                           "1.0",
-                                           "2.0",
-                                           "3.0") ++ endTableSeq
-    o.head should be(anyValHeader)
-    o.last should be(endTableFooter)
-  }
-
-  it should "support Float SCollection via AnyVal" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq(1.0F, 2.0F, 3.0F)) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o should contain theSameElementsAs Seq(anyValHeader,
-                                           "1.0",
-                                           "2.0",
-                                           "3.0") ++ endTableSeq
-    o.head should be(anyValHeader)
-    o.last should be(endTableFooter)
-  }
-
-  it should "support Short SCollection via AnyVal" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq(1.toShort, 2.toShort, 3.toShort)) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o should contain theSameElementsAs Seq(anyValHeader,
-                                           "1",
-                                           "2",
-                                           "3") ++ endTableSeq
-    o.head should be(anyValHeader)
-    o.last should be(endTableFooter)
-  }
-
-  it should "support Byte SCollection via AnyVal" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq(1.toByte, 2.toByte, 3.toByte)) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o should contain theSameElementsAs Seq(anyValHeader,
-                                           "1",
-                                           "2",
-                                           "3") ++ endTableSeq
-    o.head should be(anyValHeader)
-    o.last should be(endTableFooter)
-  }
-
-  it should "support Boolean SCollection via AnyVal" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq(true, false, true)) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o should contain theSameElementsAs Seq(anyValHeader,
-                                           "true",
-                                           "false",
-                                           "true") ++ endTableSeq
-    o.head should be(anyValHeader)
-    o.last should be(endTableFooter)
-  }
-
-  it should "support Char SCollection via AnyVal" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq('a', 'b', 'c')) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o should contain theSameElementsAs Seq(anyValHeader,
-                                           "a",
-                                           "b",
-                                           "c") ++ endTableSeq
-    o.head should be(anyValHeader)
-    o.last should be(endTableFooter)
-  }
-
-  it should "support SCollection of AnyVal over row limit" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinSCollection
-    val o = captureOut {
-      sideEffectWithData(1 to 21) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o.size should be > testRowLimit
-    o.head should be(anyValHeader)
-    o.last should be(rowLimitReached)
-  }
-
-  it should "support empty SCollection of AnyVal" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq.empty[AnyVal]) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o should contain theSameElementsAs DisplayHelpers.sCollectionEmptyMsg.split(newline)
-  }
-
-  // -----------------------------------------------------------------------------------------------
-  // String SCollection Tests
-  // -----------------------------------------------------------------------------------------------
-
-  private val stringHeader = s"$table value"
-
-  it should "support String SCollection" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinStringSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq("a","b","c")) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o should contain theSameElementsAs Seq(stringHeader,
-                                           "a",
-                                           "b",
-                                           "c") ++ endTableSeq
-    o.head should be (stringHeader)
-    o.last should be (endTableFooter)
-  }
-
-  it should "support empty SCollection of String" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinStringSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq.empty[String]) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o should contain theSameElementsAs DisplayHelpers.sCollectionEmptyMsg.split(newline)
-  }
-
-  it should "support SCollection of String over row limit" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinStringSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq.fill(21)("a")) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o.size should be > testRowLimit
-    o.head should be(stringHeader)
-    o.last should be(rowLimitReached)
-  }
-
-  // -----------------------------------------------------------------------------------------------
-  // KV SCollection Tests
-  // -----------------------------------------------------------------------------------------------
-
-  private val kvHeader = s"$table key${tab}value"
-
-  it should "support KV (ints) SCollection" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinKVSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq((1,2), (3,4))) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o should contain theSameElementsAs Seq(kvHeader,
-                                           s"3${tab}4",
-                                           s"1${tab}2") ++ endTableSeq
-    o.head should be (kvHeader)
-    o.last should be (endTableFooter)
-  }
-
-  it should "support KV (str keys) SCollection" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinKVSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq(("foo",2), ("bar",4))) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o should contain theSameElementsAs Seq(kvHeader,
-                                           s"foo${tab}2",
-                                           s"bar${tab}4") ++ endTableSeq
-    o.head should be (kvHeader)
-    o.last should be (endTableFooter)
-  }
-
-  it should "support KV (str values) SCollection" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinKVSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq((2,"foo"), (4,"bar"))) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o should contain theSameElementsAs Seq(kvHeader,
-                                           s"2${tab}foo",
-                                           s"4${tab}bar") ++ endTableSeq
-    o.head should be (kvHeader)
-    o.last should be (endTableFooter)
-  }
-
-  it should "support empty KV SCollection" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinKVSCollection
-    captureOut {
-      sideEffectWithData(Seq.empty[(Int, Int)]) { in =>
-        in.closeAndDisplay()
-      }
-    } should contain theSameElementsAs DisplayHelpers.sCollectionEmptyMsg.split(newline)
-  }
-
-  it should "support SCollection of KV over row limit" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinKVSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq.fill(21)(("foo", 1))) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o.size should be > testRowLimit
-    o.head should be(kvHeader)
-    o.last should be(rowLimitReached)
-  }
-
-  // -----------------------------------------------------------------------------------------------
-  // Product SCollection Tests
-  // -----------------------------------------------------------------------------------------------
-
-  private val testCaseClassHeader = s"$table foo${tab}bar${tab}a"
-
-  it should "support SCollection of Tuple of 3" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinProductSCollection
-    val tupleHeader = s"$table _1${tab}_2${tab}_3"
-    val o = captureOut {
-      sideEffectWithData(Seq.fill(3)((1,2,3))) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o should contain theSameElementsAs
-      (Seq(tupleHeader) ++ Seq.fill(3)(s"1${tab}2${tab}3") ++ endTableSeq)
-    o.head should be(tupleHeader)
-    o.last should be (endTableFooter)
-  }
-
-  it should "support SCollection of Tuple of 22" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinProductSCollection
-    val tupleHeader = s"$table " + (1 to 21).map(i => s"_$i$tab").mkString + "_22"
-    val o = captureOut {
-      sideEffectWithData(
-        Seq.fill(3)((1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22))) { in =>
-          in.closeAndDisplay()
-      }
-    }
-    o should contain theSameElementsAs (Seq(tupleHeader) ++
-      Seq.fill(3)((1 to 21).map(i => s"$i$tab").mkString + "22") ++ endTableSeq)
-    o.head should be(tupleHeader)
-    o.last should be (endTableFooter)
-  }
-
-  it should "support SCollection of Case Class of 22" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinProductSCollection
-    val tupleHeader = s"$table " + (1 to 21).map(i => s"a$i$tab").mkString + "a22"
-    val o = captureOut {
-      sideEffectWithData(
-        Seq.fill(3)(CC22(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22))) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o should contain theSameElementsAs (Seq(tupleHeader) ++
-      Seq.fill(3)((1 to 21).map(i => s"$i$tab").mkString + "22") ++ endTableSeq)
-    o.head should be(tupleHeader)
-    o.last should be (endTableFooter)
-  }
-
-  it should "support SCollection of Case Class" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinProductSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq.fill(3)(TestCaseClass(1, "foo", 2.0D))) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o should contain theSameElementsAs (Seq(testCaseClassHeader) ++
-      Seq.fill(3)(s"1${tab}foo${tab}2.0") ++ endTableSeq)
-    o.head should be(testCaseClassHeader)
-    o.last should be (endTableFooter)
-  }
-
-  it should "support empty SCollection of Product" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinProductSCollection
-    captureOut {
-      sideEffectWithData(Seq.empty[Product]) { in =>
-        in.closeAndDisplay()
-      }
-    } should contain theSameElementsAs DisplayHelpers.sCollectionEmptyMsg.split(newline)
-  }
-
-  it should "support SCollection of Product over row limit" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinProductSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq.fill(21)(TestCaseClass(1, "foo", 2.0D))) { in =>
-        in.closeAndDisplay()
-      }
-    }
-
-    o.size should be > testRowLimit
-    o.head should be(testCaseClassHeader)
-    o.last should be(rowLimitReached)
-  }
-
-  // -----------------------------------------------------------------------------------------------
-  // Avro SCollection Tests
-  // -----------------------------------------------------------------------------------------------
-
-  import scala.collection.JavaConverters._
-
-  private val schema = {
-    def f(name: String, tpe: Schema.Type) =
-      new Schema.Field(
-        name,
-        Schema.createUnion(List(Schema.create(Schema.Type.NULL), Schema.create(tpe)).asJava),
-        null, null)
-
-    val s = Schema.createRecord("GenericAccountRecord", null, null, false)
-    s.setFields(List(
-      f("id", Schema.Type.INT),
-      f("amount", Schema.Type.DOUBLE),
-      f("name", Schema.Type.STRING),
-      f("type", Schema.Type.STRING)
-    ).asJava)
-    s
-  }
-
-  private def getTestGenericAvro(i: Int): GenericRecord = {
-    val s: Schema = new Parser().parse(schema.toString)
-    val r = new GenericData.Record(s)
-    r.put("id", i)
-    r.put("amount", i.toDouble)
-    r.put("name", "user" + i)
-    r.put("type", "checking")
-    r
-  }
-
-  private def getTestAccountAvro(): Account = {
-    Account.newBuilder()
-      .setId(2)
-      .setAmount(2.0D)
-      .setName("user2")
-      .setType("checking")
-      .build()
-  }
-
-  private val avroGenericRecordHeader = s"$table id${tab}amount${tab}name${tab}type"
-  private val avroAccountHeader = s"$table id${tab}type${tab}name${tab}amount"
-
-  it should "support SCollection of GenericRecord" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinAvroSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq.fill(3)(getTestGenericAvro(1))) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o should contain theSameElementsAs (Seq(avroGenericRecordHeader) ++
-      Seq.fill(3)(s"1${tab}1.0${tab}user1${tab}checking") ++ endTableSeq)
-    o.head should be(avroGenericRecordHeader)
-    o.last should be (endTableFooter)
-  }
-
-  it should "support SCollection of SpecificRecord Avro" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinAvroSCollection
-
-    val o = captureOut {
-      sideEffectWithData(Seq.fill(3)(getTestAccountAvro())) { in =>
-        in.closeAndDisplay()
-      }
-    }
-    o should contain theSameElementsAs (Seq(avroAccountHeader) ++
-      Seq.fill(3)(s"2${tab}checking${tab}user2${tab}2.0") ++ endTableSeq)
-    o.head should be(avroAccountHeader)
-    o.last should be (endTableFooter)
-  }
-
-  it should "support empty SCollection of SpecificRecord Avro" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinAvroSCollection
-    captureOut {
-      sideEffectWithData(Seq.empty[Account]) { in =>
-        in.closeAndDisplay()
-      }
-    } should contain theSameElementsAs DisplayHelpers.sCollectionEmptyMsg.split(newline)
-  }
-
-  it should "support empty SCollection of GenericRecord Avro" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinAvroSCollection
-    captureOut {
-      sideEffectWithData(Seq.empty[GenericRecord]) { in =>
-        in.closeAndDisplay()
-      }
-    } should contain theSameElementsAs DisplayHelpers.sCollectionEmptyMsg.split(newline)
-  }
-
-  it should "support SCollection of GenericRecord Avro over row limit" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinAvroSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq.fill(21)(getTestGenericAvro(1))) { in =>
-        in.closeAndDisplay()
-      }
-    }
-
-    o.size should be > testRowLimit
-    o.head should be(avroGenericRecordHeader)
-    o.last should be(rowLimitReached)
-  }
-
-  it should "support SCollection of SpecificRecord Avro over row limit" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinAvroSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq.fill(21)(getTestAccountAvro())) { in =>
-        in.closeAndDisplay()
-      }
-    }
-
-    o.size should be > testRowLimit
-    o.head should be(avroAccountHeader)
-    o.last should be(rowLimitReached)
-  }
-
-  // -----------------------------------------------------------------------------------------------
-  // TableRow SCollection Tests
-  // -----------------------------------------------------------------------------------------------
-
-  private val bQSchema = new TableSchema().setFields(List(
-    new TableFieldSchema().setName("id").setType("INTEGER"),
-    new TableFieldSchema().setName("amount").setType("FLOAT"),
-    new TableFieldSchema().setName("type").setType("STRING"),
-    new TableFieldSchema().setName("name").setType("STRING")
-  ).asJava)
-
-  private val bQHeader = s"$table id${tab}amount${tab}type${tab}name"
-
-  private def getBQTableRow(): TableRow = {
-    TableRow("id" -> 3, "amount" -> 3.0D, "type" -> "checking", "name" -> "user3")
-  }
-
-  it should "support SCollection of TableRow" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinBQTableSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq.fill(3)(getBQTableRow())) { in =>
-        in.closeAndDisplay(bQSchema)
-      }
-    }
-    o should contain theSameElementsAs (Seq(bQHeader) ++
-      Seq.fill(3)(s"3${tab}3.0${tab}checking${tab}user3") ++ endTableSeq)
-    o.head should be(bQHeader)
-    o.last should be (endTableFooter)
-  }
-
-  it should "print error on empty BQ schema" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinBQTableSCollection
-    captureOut {
-      sideEffectWithData(Seq.fill(3)(getBQTableRow())) { in =>
-        in.closeAndDisplay(new TableSchema())
-      }
-    } should contain theSameElementsAs DisplayHelpers.bQSchemaIncomplete.split(newline)
-  }
-
-  it should "support SCollection of TableRow over row limit" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinBQTableSCollection
-    val o = captureOut {
-      sideEffectWithData(Seq.fill(21)(getBQTableRow())) { in =>
-        in.closeAndDisplay(bQSchema)
-      }
-    }
-
-    o.size should be > testRowLimit
-    o.head should be(bQHeader)
-    o.last should be(rowLimitReached)
-  }
-
-  it should "support empty SCollection of TableRow" in {
-    import org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinBQTableSCollection
-    captureOut {
-      sideEffectWithData(Seq.empty[TableRow]) { in =>
-        in.closeAndDisplay(new TableSchema())
-      }
-    } should contain theSameElementsAs DisplayHelpers.sCollectionEmptyMsg.split(newline)
-  }
-
-}
diff --git a/scio/src/test/scala/org/apache/zeppelin/scio/TestCC.scala b/scio/src/test/scala/org/apache/zeppelin/scio/TestCC.scala
deleted file mode 100644
index 8928b9900b..0000000000
--- a/scio/src/test/scala/org/apache/zeppelin/scio/TestCC.scala
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-package org.apache.zeppelin.scio
-
-case class TestCaseClass(foo: Int, bar: String, a: Double)
-
-case class CC22(a1: Int, a2: Int, a3: Int, a4: Int, a5: Int, a6: Int, a7: Int, a8: Int, a9: Int,
-                a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, a16: Int, a17: Int,
-                a18: Int, a19: Int, a20: Int, a21: Int, a22: Int)
\ No newline at end of file
diff --git a/scio/src/test/scala/org/apache/zeppelin/scio/util/TestUtils.scala b/scio/src/test/scala/org/apache/zeppelin/scio/util/TestUtils.scala
deleted file mode 100644
index 72271b8df7..0000000000
--- a/scio/src/test/scala/org/apache/zeppelin/scio/util/TestUtils.scala
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-package org.apache.zeppelin.scio.util
-
-import java.io.{ByteArrayOutputStream, PrintStream}
-
-import com.google.common.base.Charsets
-import com.spotify.scio.ScioContext
-import com.spotify.scio.values.SCollection
-import org.apache.zeppelin.scio.DisplayHelpers
-
-import scala.reflect.ClassTag
-
-object TestUtils {
-  val tab = DisplayHelpers.tab
-  val newline = DisplayHelpers.newline
-  val table = DisplayHelpers.table
-  val rowLimitReached = DisplayHelpers.rowLimitReachedMsg.replaceAll(newline,"")
-
-  private[scio] def sideEffectWithData[T: ClassTag](data: Iterable[T])
-                                                   (fn: SCollection[T] => Unit): Unit = {
-    val sc = ScioContext()
-    fn(sc.parallelize(data))
-    if (!sc.isClosed) sc.close()
-  }
-
-  private[scio] def captureOut[T](body: => T): Seq[String] = {
-    val bytes = new ByteArrayOutputStream()
-    val stream = new PrintStream(bytes)
-    Console.withOut(stream) { body }
-    bytes.toString(Charsets.UTF_8.toString).split(DisplayHelpers.newline)
-  }
-
-
-}
diff --git a/zeppelin-distribution/src/bin_license/LICENSE b/zeppelin-distribution/src/bin_license/LICENSE
index a80dc4f4ea..614c6652e9 100644
--- a/zeppelin-distribution/src/bin_license/LICENSE
+++ b/zeppelin-distribution/src/bin_license/LICENSE
@@ -175,11 +175,6 @@ The following components are provided under Apache License.
     (Apache 2.0) tez-yarn-timeline-history-with-acls (org.apache.tez:tez-yarn-timeline-history-with-acls:0.7.0 - http://tez.apache.org)
     (Apache 2.0) jna (net.java.dev.jna:jna:4.1.0 https://github.com/java-native-access/jna)
     (Apache 2.0) MathJax v2.7.0 - https://github.com/mathjax/MathJax/blob/2.7.0/LICENSE
-    (Apache 2.0) Scio REPL 0.2.4 (com.spotify:scio-repl:0.2.4 - https://github.com/spotify/scio)
-    (Apache 2.0) Scio BigQuery 0.2.4 (com.spotify:scio-bigquery:0.2.4 - https://github.com/spotify/scio)
-    (Apache 2.0) Scio Core 0.2.4 (com.spotify:scio-core:0.2.4 - https://github.com/spotify/scio)
-    (Apache 2.0) Scio Extra 0.2.4 (com.spotify:scio-extra:0.2.4 - https://github.com/spotify/scio)
-    (Apache 2.0) Scio Test 0.2.4 (com.spotify:scio-test:0.2.4 - https://github.com/spotify/scio)
     (Apache 2.0) Netty Http2 Codec 4.1.0.CR1 (io.netty:netty-codec-http2:4.1.0.CR1 - https://github.com/netty/netty)
     (Apache 2.0) Netty Http Codec 4.1.0.CR1 (io.netty:netty-codec-http:4.1.0.CR1 - https://github.com/netty/netty)
     (Apache 2.0) Netty Handler 4.1.0.CR1 (io.netty:netty-handler:4.1.0.CR1 - https://github.com/netty/netty)


Re: [zeppelin] branch master updated: [ZEPPELIN-5768] Remove scio interpreter (#4408)

Posted by emmanuel warreng <em...@gmail.com>.
Unsubscribe

On Fri, Jul 15, 2022, 09:37 <jo...@apache.org> wrote:

> This is an automated email from the ASF dual-hosted git repository.
>
> jongyoul pushed a commit to branch master
> in repository https://gitbox.apache.org/repos/asf/zeppelin.git
>
>
> The following commit(s) were added to refs/heads/master by this push:
>      new 9eb3aae092 [ZEPPELIN-5768] Remove scio interpreter (#4408)
> 9eb3aae092 is described below
>
> commit 9eb3aae092497eae2dce98f6aeb4feafc6c663f3
> Author: In-Kyu Kim <60...@users.noreply.github.com>
> AuthorDate: Fri Jul 15 16:37:21 2022 +0900
>
>     [ZEPPELIN-5768] Remove scio interpreter (#4408)
> ---
>  .github/workflows/core.yml                         |   2 +-
>  .github/workflows/frontend.yml                     |   2 +-
>  .gitignore                                         |   2 -
>  beam/pom.xml                                       |   6 -
>  beam/src/main/resources/interpreter-setting.json   |  24 -
>  conf/interpreter-list                              |   1 -
>  dev/create_release.sh                              |   3 +-
>  docs/_includes/themes/zeppelin/_navigation.html    |   1 -
>  docs/index.md                                      |   1 -
>  docs/interpreter/scio.md                           | 169 ------
>  docs/usage/interpreter/installation.md             |   5 -
>  pom.xml                                            |   5 +-
>  scio/README.md                                     |  18 -
>  scio/pom.xml                                       | 178 -------
>  .../org/apache/zeppelin/scio/ContextAndArgs.scala  |  41 --
>  .../org/apache/zeppelin/scio/DisplayHelpers.scala  | 167 ------
>  .../scio/DisplaySCollectionImplicits.scala         | 105 ----
>  .../apache/zeppelin/scio/DisplayTapImplicits.scala | 154 ------
>  .../org/apache/zeppelin/scio/ScioInterpreter.scala | 201 --------
>  scio/src/test/avro/schema.avsc                     |  12 -
>  .../apache/zeppelin/scio/ScioInterpreterTest.java  | 109 ----
>  scio/src/test/resources/log4j.properties           |  22 -
>  .../zeppelin/scio/DisplayHelpersTestScala211.scala |  55 --
>  .../org/apache/zeppelin/scio/TestCCScala211.scala  |  22 -
>  .../apache/zeppelin/scio/DisplayHelpersTest.scala  | 570
> ---------------------
>  .../scala/org/apache/zeppelin/scio/TestCC.scala    |  24 -
>  .../org/apache/zeppelin/scio/util/TestUtils.scala  |  50 --
>  zeppelin-distribution/src/bin_license/LICENSE      |   5 -
>  28 files changed, 6 insertions(+), 1948 deletions(-)
>
> diff --git a/.github/workflows/core.yml b/.github/workflows/core.yml
> index 78624b381d..bc5012f4c5 100644
> --- a/.github/workflows/core.yml
> +++ b/.github/workflows/core.yml
> @@ -82,7 +82,7 @@ jobs:
>    interpreter-test-non-core:
>      runs-on: ubuntu-20.04
>      env:
> -      INTERPRETERS:
> 'beam,hbase,pig,jdbc,file,flink-cmd,ignite,cassandra,elasticsearch,bigquery,alluxio,scio,livy,groovy,sap,java,geode,neo4j,hazelcastjet,submarine,sparql,mongodb,influxdb,ksql'
> +      INTERPRETERS:
> 'beam,hbase,pig,jdbc,file,flink-cmd,ignite,cassandra,elasticsearch,bigquery,alluxio,livy,groovy,sap,java,geode,neo4j,hazelcastjet,submarine,sparql,mongodb,influxdb,ksql'
>      steps:
>        - name: Checkout
>          uses: actions/checkout@v2
> diff --git a/.github/workflows/frontend.yml
> b/.github/workflows/frontend.yml
> index 11624c66b9..01c26164b2 100644
> --- a/.github/workflows/frontend.yml
> +++ b/.github/workflows/frontend.yml
> @@ -19,7 +19,7 @@ env:
>    SPARK_PRINT_LAUNCH_COMMAND: "true"
>    SPARK_LOCAL_IP: 127.0.0.1
>    ZEPPELIN_LOCAL_IP: 127.0.0.1
> -  INTERPRETERS:
> '!beam,!hbase,!pig,!jdbc,!file,!flink,!ignite,!cassandra,!elasticsearch,!bigquery,!alluxio,!scio,!livy,!groovy,!sap,!java,!geode,!neo4j,!hazelcastjet,!submarine,!sparql,!mongodb'
> +  INTERPRETERS:
> '!beam,!hbase,!pig,!jdbc,!file,!flink,!ignite,!cassandra,!elasticsearch,!bigquery,!alluxio,!livy,!groovy,!sap,!java,!geode,!neo4j,!hazelcastjet,!submarine,!sparql,!mongodb'
>
>  jobs:
>    run-e2e-tests-in-zeppelin-web:
> diff --git a/.gitignore b/.gitignore
> index e52d5a63a2..425d6fbaaa 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -55,8 +55,6 @@ zeppelin-web/yarn.lock
>  .Rhistory
>  /R/
>
> -# scio
> -.bigquery/
>
>  # project level
>  /logs/
> diff --git a/beam/pom.xml b/beam/pom.xml
> index 19b91bbe5f..58cfdcb30e 100644
> --- a/beam/pom.xml
> +++ b/beam/pom.xml
> @@ -116,12 +116,6 @@
>        <version>${project.version}</version>
>      </dependency>
>
> -    <dependency>
> -      <groupId>org.apache.zeppelin</groupId>
> -      <artifactId>zeppelin-scio</artifactId>
> -      <version>${project.version}</version>
> -    </dependency>
> -
>      <dependency>
>        <groupId>org.apache.hadoop</groupId>
>        <artifactId>hadoop-hdfs</artifactId>
> diff --git a/beam/src/main/resources/interpreter-setting.json
> b/beam/src/main/resources/interpreter-setting.json
> index e9b4a73c2a..189e08b5d8 100644
> --- a/beam/src/main/resources/interpreter-setting.json
> +++ b/beam/src/main/resources/interpreter-setting.json
> @@ -9,29 +9,5 @@
>      "editor": {
>        "editOnDblClick": false
>      }
> -  },
> -  {
> -    "group": "beam",
> -    "name": "scio",
> -    "className": "org.apache.zeppelin.scio.ScioInterpreter",
> -    "properties": {
> -      "zeppelin.scio.argz": {
> -        "envName": "ZEPPELIN_SCIO_ARGZ",
> -        "propertyName": "zeppelin.scio.argz",
> -        "defaultValue": "--runner=InProcessPipelineRunner",
> -        "description": "Scio interpreter wide arguments",
> -        "type": "textarea"
> -      },
> -      "zeppelin.scio.maxResult": {
> -        "envName": "ZEPPELIN_SCIO_MAXRESULT",
> -        "propertyName": "zeppelin.scio.maxResult",
> -        "defaultValue": "1000",
> -        "description": "Max number of SCollection results to display.",
> -        "type": "number"
> -      }
> -    },
> -    "editor": {
> -      "language": "scala"
> -    }
>    }
>  ]
> diff --git a/conf/interpreter-list b/conf/interpreter-list
> index 270d243b5c..766c66fa96 100644
> --- a/conf/interpreter-list
> +++ b/conf/interpreter-list
> @@ -39,7 +39,6 @@ neo4j
>  org.apache.zeppelin:zeppelin-neo4j:0.10.0                Neo4j i
>  pig             org.apache.zeppelin:zeppelin-pig:0.10.0
> Pig interpreter
>  python          org.apache.zeppelin:zeppelin-python:0.10.0
>  Python interpreter
>  sap             org.apache.zeppelin:zeppelin-sap:0.10.0
> SAP Support
> -scio            org.apache.zeppelin:zeppelin-scio:0.10.0
>  Scio interpreter
>  shell           org.apache.zeppelin:zeppelin-shell:0.10.0
> Shell command
>  sparql          org.apache.zeppelin:zeppelin-sparql:0.10.0
>  Sparql interpreter
>  submarine       org.apache.zeppelin:zeppelin-submarine:0.10.0
> Submarine interpreter
> diff --git a/dev/create_release.sh b/dev/create_release.sh
> index ae2162aa9b..a9571502b6 100755
> --- a/dev/create_release.sh
> +++ b/dev/create_release.sh
> @@ -97,7 +97,8 @@ function make_binary_release() {
>
>  git_clone
>  make_source_package
> -make_binary_release netinst "-Pweb-angular -Phadoop-2.6 -pl
> !beam,!hbase,!pig,!jdbc,!file,!flink,!ignite,!cassandra,!elasticsearch,!bigquery,!alluxio,!scio,!livy,!groovy,!sap,!java,!geode,!neo4j,!hazelcastjet,!submarine,!sparql,!mongodb,!ksql
> -am"
> +
> +make_binary_release netinst "-Pweb-angular -Phadoop-2.6 -pl
> !beam,!hbase,!pig,!jdbc,!file,!flink,!ignite,!cassandra,!elasticsearch,!bigquery,!alluxio,!livy,!groovy,!sap,!java,!geode,!neo4j,!hazelcastjet,!submarine,!sparql,!mongodb,!ksql
> -am"
>  make_binary_release all "-Pweb-angular -Phadoop-2.6"
>
>  # remove non release files and dirs
> diff --git a/docs/_includes/themes/zeppelin/_navigation.html
> b/docs/_includes/themes/zeppelin/_navigation.html
> index ceed569605..d7b0cb9fbc 100644
> --- a/docs/_includes/themes/zeppelin/_navigation.html
> +++ b/docs/_includes/themes/zeppelin/_navigation.html
> @@ -163,7 +163,6 @@
>                  <li><a
> href="{{BASE_PATH}}/interpreter/pig.html">Pig</a></li>
>                  <li><a
> href="{{BASE_PATH}}/interpreter/postgresql.html">Postgresql, HAWQ</a></li>
>                  <li><a
> href="{{BASE_PATH}}/interpreter/sap.html">SAP</a></li>
> -                <li><a
> href="{{BASE_PATH}}/interpreter/scio.html">Scio</a></li>
>                  <li><a
> href="{{BASE_PATH}}/interpreter/shell.html">Shell</a></li>
>                  <li><a
> href="{{BASE_PATH}}/interpreter/sparql.html">Sparql</a></li>
>                  <li><a
> href="{{BASE_PATH}}/interpreter/submarine.html">Submarine</a></li>
> diff --git a/docs/index.md b/docs/index.md
> index d3e5a461d5..8837b3b95b 100644
> --- a/docs/index.md
> +++ b/docs/index.md
> @@ -163,7 +163,6 @@ limitations under the License.
>    * [Python](./interpreter/python.html)
>    * [R](./interpreter/r.html)
>    * [SAP](./interpreter/sap.html)
> -  * [Scio](./interpreter/scio.html)
>    * [Shell](./interpreter/shell.html)
>    * [Spark](./interpreter/spark.html)
>    * [Sparql](./interpreter/sparql.html)
> diff --git a/docs/interpreter/scio.md b/docs/interpreter/scio.md
> deleted file mode 100644
> index cb8d1278ec..0000000000
> --- a/docs/interpreter/scio.md
> +++ /dev/null
> @@ -1,169 +0,0 @@
> ----
> -layout: page
> -title: "Scio Interpreter for Apache Zeppelin"
> -description: "Scio is a Scala DSL for Apache Beam/Google Dataflow model."
> -group: interpreter
> ----
> -<!--
> -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 %}
> -
> -# Scio Interpreter for Apache Zeppelin
> -
> -<div id="toc"></div>
> -
> -## Overview
> -Scio is a Scala DSL for [Google Cloud Dataflow](
> https://github.com/GoogleCloudPlatform/DataflowJavaSDK) and [Apache Beam](
> http://beam.incubator.apache.org/) inspired by [Spark](
> http://spark.apache.org/) and [Scalding](
> https://github.com/twitter/scalding). See the current [wiki](
> https://github.com/spotify/scio/wiki) and [API documentation](
> http://spotify.github.io/scio/) for more information.
> -
> -## Configuration
> -<table class="table-configuration">
> -  <tr>
> -    <th>Name</th>
> -    <th>Default Value</th>
> -    <th>Description</th>
> -  </tr>
> -  <tr>
> -    <td>zeppelin.scio.argz</td>
> -    <td>--runner=InProcessPipelineRunner</td>
> -    <td>Scio interpreter wide arguments. Documentation:
> https://github.com/spotify/scio/wiki#options and
> https://cloud.google.com/dataflow/pipelines/specifying-exec-params</td>
> -  </tr>
> -  <tr>
> -    <td>zeppelin.scio.maxResult</td>
> -    <td>1000</td>
> -    <td>Max number of SCollection results to display</td>
> -  </tr>
> -
> -</table>
> -
> -## Enabling the Scio Interpreter
> -
> -In a notebook, to enable the **Scio** interpreter, click the **Gear**
> icon and select **beam** (**beam.scio**).
> -
> -## Using the Scio Interpreter
> -
> -In a paragraph, use `%beam.scio` to select the **Scio** interpreter. You
> can use it much the same way as vanilla Scala REPL and [Scio REPL](
> https://github.com/spotify/scio/wiki/Scio-REPL). State (like variables,
> imports, execution etc) is shared among all *Scio* paragraphs. There is a
> special variable **argz** which holds arguments from Scio interpreter
> settings. The easiest way to proceed is to create a Scio context via
> standard `ContextAndArgs`.
> -
> -```scala
> -%beam.scio
> -val (sc, args) = ContextAndArgs(argz)
> -```
> -
> -Use `sc` context the way you would in a regular pipeline/REPL.
> -
> -Example:
> -
> -```scala
> -%beam.scio
> -val (sc, args) = ContextAndArgs(argz)
> -sc.parallelize(Seq("foo", "foo", "bar")).countByValue.closeAndDisplay()
> -```
> -
> -If you close Scio context, go ahead an create a new one using
> `ContextAndArgs`. Please refer to [Scio wiki](
> https://github.com/spotify/scio/wiki) for more complex examples. You can
> close Scio context much the same way as in Scio REPL, and use Zeppelin
> display helpers to synchronously close and display results - read more
> below.
> -
> -### Progress
> -
> -There can be only one paragraph running at once. There is no notion of
> overall progress, thus progress bar will show `0`.
> -
> -### SCollection display helpers
> -
> -Scio interpreter comes with display helpers to ease working with Zeppelin
> notebooks. Simply use `closeAndDisplay()` on `SCollection` to close context
> and display the results. The number of results is limited by
> `zeppelin.scio.maxResult` (by default 1000).
> -
> -Supported `SCollection` types:
> -
> - * Scio's typed BigQuery
> - * Scala's Products (case classes, tuples)
> - * Google BigQuery's TableRow
> - * Apache Avro
> - * All Scala's `AnyVal`
> -
> -#### Helper methods
> -
> -There are different helper methods for different objects. You can easily
> display results from `SCollection`, `Future[Tap]` and `Tap`.
> -
> -##### `SCollection` helper
> -
> -`SCollection` has `closeAndDisplay` Zeppelin helper method for types
> listed above. Use it to synchronously close Scio context, and once
> available pull and display results.
> -
> -##### `Future[Tap]` helper
> -
> -`Future[Tap]` has `waitAndDisplay` Zeppelin helper method for types
> listed above. Use it to synchronously wait for results, and once available
> pull and display results.
> -
> -##### `Tap` helper
> -
> -`Tap` has `display` Zeppelin helper method for types listed above. Use it
> to pull and display results.
> -
> -### Examples
> -
> -#### BigQuery example:
> -
> -```scala
> -%beam.scio
> -@BigQueryType.fromQuery("""|SELECT departure_airport,count(case when
> departure_delay>0 then 1 else 0 end) as no_of_delays
> -                           |FROM
> [bigquery-samples:airline_ontime_data.flights]
> -                           |group by departure_airport
> -                           |order by 2 desc
> -                           |limit 10""".stripMargin) class Flights
> -
> -val (sc, args) = ContextAndArgs(argz)
> -sc.bigQuerySelect(Flights.query).closeAndDisplay(Flights.schema)
> -```
> -
> -#### BigQuery typed example:
> -
> -```scala
> -%beam.scio
> -@BigQueryType.fromQuery("""|SELECT departure_airport,count(case when
> departure_delay>0 then 1 else 0 end) as no_of_delays
> -                           |FROM
> [bigquery-samples:airline_ontime_data.flights]
> -                           |group by departure_airport
> -                           |order by 2 desc
> -                           |limit 10""".stripMargin) class Flights
> -
> -val (sc, args) = ContextAndArgs(argz)
> -sc.typedBigQuery[Flights]().flatMap(_.no_of_delays).mean.closeAndDisplay()
> -```
> -
> -#### Avro example:
> -
> -```scala
> -%beam.scio
> -import com.spotify.data.ExampleAvro
> -
> -val (sc, args) = ContextAndArgs(argz)
>
> -sc.avroFile[ExampleAvro]("gs://<bucket>/tmp/my.avro").take(10).closeAndDisplay()
> -```
> -
> -#### Avro example with a view schema:
> -
> -```scala
> -%beam.scio
> -import com.spotify.data.ExampleAvro
> -import org.apache.avro.Schema
> -
> -val (sc, args) = ContextAndArgs(argz)
> -val view =
> Schema.parse("""{"type":"record","name":"ExampleAvro","namespace":"com.spotify.data","fields":[{"name":"track","type":"string"},
> {"name":"artist", "type":"string"}]}""")
> -
>
> -sc.avroFile[EndSongCleaned]("gs://<bucket>/tmp/my.avro").take(10).closeAndDisplay(view)
> -```
> -
> -### Google credentials
> -
> -Scio Interpreter will try to infer your Google Cloud credentials from its
> environment, it will take into the account:
> -
> - * `argz` interpreter settings ([doc](
> https://github.com/spotify/scio/wiki#options))
> - * environment variable (`GOOGLE_APPLICATION_CREDENTIALS`)
> - * gcloud configuration
> -
> -#### BigQuery macro credentials
> -
> -Currently BigQuery project for macro expansion is inferred using Google
> Dataflow's [DefaultProjectFactory().create()](
> https://github.com/GoogleCloudPlatform/DataflowJavaSDK/blob/master/sdk/src/main/java/com/google/cloud/dataflow/sdk/options/GcpOptions.java#L187
> )
> diff --git a/docs/usage/interpreter/installation.md
> b/docs/usage/interpreter/installation.md
> index aaea7b8ebc..a9705fee22 100644
> --- a/docs/usage/interpreter/installation.md
> +++ b/docs/usage/interpreter/installation.md
> @@ -212,11 +212,6 @@ You can also find the below community managed
> interpreter list in `conf/interpre
>      <td>org.apache.zeppelin:zeppelin-sap:0.10.0</td>
>      <td>SAP support</td>
>    </tr>
> -  <tr>
> -    <td>scio</td>
> -    <td>org.apache.zeppelin:zeppelin-scio:0.10.0</td>
> -    <td>Scio interpreter</td>
> -  </tr>
>    <tr>
>      <td>shell</td>
>      <td>org.apache.zeppelin:zeppelin-shell:0.10.0</td>
> diff --git a/pom.xml b/pom.xml
> index b4c1814c9a..c4f5a0f92c 100644
> --- a/pom.xml
> +++ b/pom.xml
> @@ -83,7 +83,6 @@
>      <module>elasticsearch</module>
>      <module>bigquery</module>
>      <module>alluxio</module>
> -    <module>scio</module>
>      <module>neo4j</module>
>      <module>sap</module>
>      <module>java</module>
> @@ -1455,7 +1454,7 @@
>              </goals>
>              <configuration>
>                <failOnViolation>true</failOnViolation>
> -
> <excludes>org/apache/zeppelin/interpreter/thrift/*,org/apache/zeppelin/scio/avro/*,org/apache/zeppelin/python/proto/*</excludes>
> +
> <excludes>org/apache/zeppelin/interpreter/thrift/*,org/apache/zeppelin/python/proto/*</excludes>
>              </configuration>
>            </execution>
>            <execution>
> @@ -1465,7 +1464,7 @@
>                <goal>checkstyle-aggregate</goal>
>              </goals>
>              <configuration>
> -
> <excludes>org/apache/zeppelin/interpreter/thrift/*,org/apache/zeppelin/scio/avro/*,org/apache/zeppelin/python/proto/*</excludes>
> +
> <excludes>org/apache/zeppelin/interpreter/thrift/*,org/apache/zeppelin/python/proto/*</excludes>
>              </configuration>
>            </execution>
>          </executions>
> diff --git a/scio/README.md b/scio/README.md
> deleted file mode 100644
> index 73d0cb67f1..0000000000
> --- a/scio/README.md
> +++ /dev/null
> @@ -1,18 +0,0 @@
> -Scio interpreter for Apache Zeppelin
> -====================================
> -
> -## Raison d'ĂȘtre:
> -
> -Provide Scio Interpreter for Zeppelin.
> -
> -## Build
> -
> -```
> -./mvnw -pl zeppelin-interpreter,zeppelin-display,scio -DskipTests package
> -```
> -
> -## Test
> -
> -```
> -./mvnw -pl scio,zeppelin-display,zeppelin-interpreter
> -Dtest='org.apache.zeppelin.scio.*' -DfailIfNoTests=false test
> -```
> diff --git a/scio/pom.xml b/scio/pom.xml
> deleted file mode 100644
> index d3c3c1a214..0000000000
> --- a/scio/pom.xml
> +++ /dev/null
> @@ -1,178 +0,0 @@
> -<?xml version="1.0" encoding="UTF-8"?>
> -<!--
> -  ~ Licensed to the Apache Software Foundation (ASF) under one or more
> -  ~ contributor license agreements.  See the NOTICE file distributed with
> -  ~ this work for additional information regarding copyright ownership.
> -  ~ The ASF licenses this file to You 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.
> -  -->
> -
> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
> http://www.w3.org/2001/XMLSchema-instance"
> -  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
> https://maven.apache.org/xsd/maven-4.0.0.xsd">
> -  <modelVersion>4.0.0</modelVersion>
> -
> -  <parent>
> -    <artifactId>zeppelin-interpreter-parent</artifactId>
> -    <groupId>org.apache.zeppelin</groupId>
> -    <version>0.11.0-SNAPSHOT</version>
> -    <relativePath>../zeppelin-interpreter-parent/pom.xml</relativePath>
> -  </parent>
> -
> -  <artifactId>zeppelin-scio</artifactId>
> -  <packaging>jar</packaging>
> -  <name>Zeppelin: Scio</name>
> -  <description>Zeppelin Scio support</description>
> -
> -  <properties>
> -    <interpreter.name>scio</interpreter.name>
> -    <!--library versions-->
> -    <scio.version>0.2.4</scio.version>
> -    <guava.version>14.0.1</guava.version> <!-- update needed -->
> -    <scio.scala.version>${scala.2.10.version}</scio.scala.version>
> -    <scio.scala.binary.version>2.10</scio.scala.binary.version>
> -
> -    <!--test library versions-->
> -    <hamcrest.all.version>1.3</hamcrest.all.version>
> -  </properties>
> -
> -  <dependencies>
> -
> -    <dependency>
> -      <groupId>com.spotify</groupId>
> -      <artifactId>scio-repl_${scio.scala.binary.version}</artifactId>
> -      <version>${scio.version}</version>
> -    </dependency>
> -
> -    <dependency>
> -      <groupId>com.google.guava</groupId>
> -      <artifactId>guava</artifactId>
> -      <version>${guava.version}</version>
> -    </dependency>
> -
> -    <dependency>
> -      <groupId>org.scala-lang</groupId>
> -      <artifactId>scala-library</artifactId>
> -      <version>${scala.2.10.version}</version>
> -    </dependency>
> -
> -    <dependency>
> -      <groupId>org.scala-lang</groupId>
> -      <artifactId>scala-compiler</artifactId>
> -      <version>${scala.2.10.version}</version>
> -    </dependency>
> -
> -    <dependency>
> -      <groupId>org.scala-lang</groupId>
> -      <artifactId>scala-reflect</artifactId>
> -      <version>${scala.2.10.version}</version>
> -    </dependency>
> -
> -    <!-- test libraries -->
> -    <dependency>
> -      <groupId>org.scalatest</groupId>
> -      <artifactId>scalatest_${scio.scala.binary.version}</artifactId>
> -      <version>${scalatest.version}</version>
> -      <scope>test</scope>
> -    </dependency>
> -
> -    <dependency>
> -      <groupId>org.hamcrest</groupId>
> -      <artifactId>hamcrest-all</artifactId>
> -      <version>${hamcrest.all.version}</version>
> -      <scope>test</scope>
> -    </dependency>
> -
> -    <dependency>
> -      <groupId>com.google.code.gson</groupId>
> -      <artifactId>gson</artifactId>
> -      <scope>test</scope>
> -    </dependency>
> -
> -    <dependency>
> -      <groupId>org.apache.commons</groupId>
> -      <artifactId>commons-lang3</artifactId>
> -      <scope>test</scope>
> -    </dependency>
> -
> -  </dependencies>
> -
> -  <build>
> -    <plugins>
> -      <plugin>
> -        <artifactId>maven-enforcer-plugin</artifactId>
> -      </plugin>
> -      <plugin>
> -        <artifactId>maven-resources-plugin</artifactId>
> -      </plugin>
> -      <plugin>
> -        <artifactId>maven-shade-plugin</artifactId>
> -      </plugin>
> -      <plugin>
> -        <groupId>org.apache.maven.plugins</groupId>
> -        <artifactId>maven-surefire-plugin</artifactId>
> -        <configuration>
> -          <forkCount>1</forkCount>
> -          <reuseForks>false</reuseForks>
> -          <argLine>-Xmx1024m -XX:MaxMetaspaceSize=512m</argLine>
> -        </configuration>
> -      </plugin>
> -
> -      <plugin>
> -        <groupId>org.scala-tools</groupId>
> -        <artifactId>maven-scala-plugin</artifactId>
> -        <configuration>
> -          <scalaVersion>${scio.scala.version}</scalaVersion>
> -        </configuration>
> -        <executions>
> -          <execution>
> -            <id>compile</id>
> -            <goals>
> -              <goal>compile</goal>
> -            </goals>
> -            <phase>compile</phase>
> -          </execution>
> -          <execution>
> -            <id>test-compile</id>
> -            <goals>
> -              <goal>testCompile</goal>
> -            </goals>
> -            <phase>test-compile</phase>
> -          </execution>
> -          <execution>
> -            <phase>process-resources</phase>
> -            <goals>
> -              <goal>compile</goal>
> -            </goals>
> -          </execution>
> -        </executions>
> -      </plugin>
> -
> -      <!-- plugin to compile avro for tests -->
> -      <plugin>
> -        <groupId>org.apache.avro</groupId>
> -        <artifactId>avro-maven-plugin</artifactId>
> -        <executions>
> -          <execution>
> -            <phase>generate-sources</phase>
> -            <goals>
> -              <goal>schema</goal>
> -            </goals>
> -            <configuration>
> -
> <sourceDirectory>${project.basedir}/src/test/avro/</sourceDirectory>
> -            </configuration>
> -          </execution>
> -        </executions>
> -      </plugin>
> -
> -    </plugins>
> -  </build>
> -</project>
> diff --git
> a/scio/src/main/scala/org/apache/zeppelin/scio/ContextAndArgs.scala
> b/scio/src/main/scala/org/apache/zeppelin/scio/ContextAndArgs.scala
> deleted file mode 100644
> index cb1b390be4..0000000000
> --- a/scio/src/main/scala/org/apache/zeppelin/scio/ContextAndArgs.scala
> +++ /dev/null
> @@ -1,41 +0,0 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements.  See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You 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.
> - */
> -
> -package org.apache.zeppelin.scio
> -
> -import com.google.cloud.dataflow.sdk.options.PipelineOptions
> -import com.spotify.scio.repl.ReplScioContext
> -import com.spotify.scio.{Args, ScioContext}
> -
> -/**
> - * Convenience object for creating [[com.spotify.scio.ScioContext]] and
> [[com.spotify.scio.Args]].
> - */
> -object ContextAndArgs {
> -  def apply(argz: Array[String]): (ScioContext, Args) = {
> -    val (dfOpts, args) = ScioContext.parseArguments[PipelineOptions](argz)
> -
> -    val nextReplJar = this
> -      .getClass
> -      .getClassLoader
> -      .asInstanceOf[{def getNextReplCodeJarPath:
> String}].getNextReplCodeJarPath
> -
> -    val sc = new ReplScioContext(dfOpts, List(nextReplJar))
> -    sc.setName("sciozeppelin")
> -
> -    (sc, args)
> -  }
> -}
> diff --git
> a/scio/src/main/scala/org/apache/zeppelin/scio/DisplayHelpers.scala
> b/scio/src/main/scala/org/apache/zeppelin/scio/DisplayHelpers.scala
> deleted file mode 100644
> index bfb4f9c73a..0000000000
> --- a/scio/src/main/scala/org/apache/zeppelin/scio/DisplayHelpers.scala
> +++ /dev/null
> @@ -1,167 +0,0 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements.  See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You 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.
> - */
> -
> -package org.apache.zeppelin.scio
> -
> -import com.google.api.services.bigquery.model.TableSchema
> -import com.spotify.scio.bigquery._
> -import org.apache.avro.Schema
> -import org.apache.avro.generic.GenericRecord
> -
> -import scala.reflect.ClassTag
> -
> -/**
> - * Set of helpers for Zeppelin Display system.
> - */
> -private[scio] object DisplayHelpers {
> -
> -  private[scio] val sCollectionEmptyMsg =
> -    "\n%html <font color=red>Result SCollection is empty!</font>\n"
> -  private val maxResults = Integer.getInteger("zeppelin.scio.maxResult",
> 1000)
> -  private[scio] val tab = "\t"
> -  private[scio] val newline = "\n"
> -  private[scio] val table = "%table"
> -  private[scio] val endTable = "\n%text"
> -  private[scio] val rowLimitReachedMsg =
> -    s"$newline<font color=red>Results are limited to " + maxResults + s"
> rows.</font>$newline"
> -  private[scio] val bQSchemaIncomplete =
> -    s"$newline<font color=red>Provided BigQuery Schema has not
> fields!</font>$newline"
> -
> -  private def notifyIfTruncated(it: Iterator[_]): Unit = {
> -    if(it.hasNext) println(rowLimitReachedMsg)
> -  }
> -
> -  /**
> -   * Displays [[AnyVal]] values from given [[Iterator]].
> -   */
> -  private[scio] def displayAnyVal[T: ClassTag](it: Iterator[T], printer:
> (T) => String): Unit = {
> -    if (it.isEmpty) {
> -      println(sCollectionEmptyMsg)
> -    } else {
> -      println(s"$table
> value$newline${it.take(maxResults).map(printer).mkString(newline)}")
> -      println(endTable)
> -      notifyIfTruncated(it)
> -    }
> -  }
> -
> -  /**
> -   * Displays [[String]] values from given [[Iterator]].
> -   */
> -  private[scio] def displayString[T: ClassTag](it: Iterator[T], printer:
> (T) => String): Unit = {
> -    if (it.isEmpty) {
> -      println(sCollectionEmptyMsg)
> -    } else {
> -      println(s"$table
> value$newline${it.take(maxResults).map(printer).mkString(newline)}")
> -      println(endTable)
> -      notifyIfTruncated(it)
> -    }
> -  }
> -
> -  /**
> -   * Displays [[com.google.cloud.dataflow.sdk.values.KV]] values from
> given [[Iterator]].
> -   */
> -  private[scio] def displayKV[K: ClassTag, V: ClassTag](it:
> Iterator[(K,V)]): Unit = {
> -    if (it.isEmpty) {
> -      println(sCollectionEmptyMsg)
> -    } else {
> -      val content = it.take(maxResults).map{ case (k, v) => s"$k$tab$v"
> }.mkString(newline)
> -      println(s"$table key${tab}value$newline$content")
> -      println(endTable)
> -      notifyIfTruncated(it)
> -    }
> -  }
> -
> -  /**
> -   * Displays [[Product]] values from given [[Iterator]].
> -   */
> -  private[scio] def displayProduct[T: ClassTag](it: Iterator[T])
> -                                               (implicit ev: T <:<
> Product): Unit = {
> -    if (it.isEmpty) {
> -      println(sCollectionEmptyMsg)
> -    } else {
> -      val first = it.next()
> -      //TODO is this safe field name to value iterator?
> -      val fieldNames = first.getClass.getDeclaredFields.map(_.getName)
> -
> -      val header = fieldNames.mkString(tab)
> -      val firstStr = first.productIterator.mkString(tab)
> -      val content = it.take(maxResults -
> 1).map(_.productIterator.mkString(tab)).mkString(newline)
> -      println(s"$table $header$newline$firstStr$newline$content")
> -      println(endTable)
> -      notifyIfTruncated(it)
> -    }
> -  }
> -
> -  /**
> -   * Displays Avro values from given [[Iterator]] using optional
> [[Schema]].
> -   * @param schema optional "view" schema, otherwise schema is inferred
> from the first object
> -   */
> -  private[scio] def displayAvro[T: ClassTag](it: Iterator[T], schema:
> Schema = null)
> -                                            (implicit ev: T <:<
> GenericRecord): Unit = {
> -    if (it.isEmpty) {
> -      println(sCollectionEmptyMsg)
> -    } else {
> -      val first = it.next()
> -      import collection.JavaConverters._
> -
> -      val fieldNames = if (schema != null) {
> -        schema.getFields.iterator().asScala.map(_.name()).toArray
> -      } else {
> -        first.getSchema.getFields.iterator.asScala.map(_.name()).toArray
> -      }
> -
> -      val header = fieldNames.mkString(tab)
> -      val firstStr = fieldNames.map(first.get).mkString(tab)
> -      val content = it.take(maxResults - 1)
> -        .map(r => fieldNames.map(r.get).mkString(tab))
> -        .mkString(newline)
> -      println(s"$table $header$newline$firstStr$newline$content")
> -      println(endTable)
> -      notifyIfTruncated(it)
> -    }
> -  }
> -
> -  /**
> -   * Displays [[TableRow]] values from given [[Iterator]] using specified
> [[TableSchema]].
> -   */
> -  private[scio] def displayBQTableRow[T: ClassTag](it: Iterator[T],
> schema: TableSchema)
> -                                                  (implicit ev: T <:<
> TableRow) : Unit = {
> -    if (it.isEmpty) {
> -      println(sCollectionEmptyMsg)
> -    } else {
> -      import collection.JavaConverters._
> -      val fieldsOp = Option(schema.getFields)
> -      fieldsOp match {
> -        case None => println(bQSchemaIncomplete)
> -        case Some(f) => {
> -          val fields = f.asScala.map(_.getName).toArray
> -
> -          val header = fields.mkString(tab)
> -
> -          val content = it.take(maxResults)
> -            .map(r => fields.map(r.get).mkString(tab))
> -            .mkString(newline)
> -
> -          println(s"$table $header$newline$content")
> -          println(endTable)
> -          notifyIfTruncated(it)
> -        }
> -      }
> -    }
> -  }
> -
> -}
> diff --git
> a/scio/src/main/scala/org/apache/zeppelin/scio/DisplaySCollectionImplicits.scala
> b/scio/src/main/scala/org/apache/zeppelin/scio/DisplaySCollectionImplicits.scala
> deleted file mode 100644
> index 566e106c57..0000000000
> ---
> a/scio/src/main/scala/org/apache/zeppelin/scio/DisplaySCollectionImplicits.scala
> +++ /dev/null
> @@ -1,105 +0,0 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements.  See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You 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.
> - */
> -
> -package org.apache.zeppelin.scio
> -
> -import com.google.api.services.bigquery.model.TableSchema
> -import com.spotify.scio._
> -import com.spotify.scio.bigquery._
> -import com.spotify.scio.values.SCollection
> -import org.apache.avro.Schema
> -import org.apache.avro.generic.GenericRecord
> -
> -import scala.reflect.ClassTag
> -
> -/**
> - * Implicit Zeppelin display helpers for SCollection.
> - */
> -object DisplaySCollectionImplicits {
> -
> -  private def materialize[T: ClassTag](self: SCollection[T]) = {
> -    val f = self.materialize
> -    self.context.close()
> -    f
> -  }
> -
> -  // TODO: scala 2.11
> -  // implicit class ZeppelinSCollection[T: ClassTag](private val self:
> SCollection[T])(implicit ev: T <:< AnyVal) extends AnyVal {
> -  implicit class ZeppelinSCollection[T: ClassTag](val self:
> SCollection[T])
> -                                                 (implicit ev: T <:<
> AnyVal) {
> -    /** Convenience method to close the current
> [[com.spotify.scio.ScioContext]]
> -     * and display elements from SCollection. */
> -    def closeAndDisplay(printer: (T) => String = (e: T) => e.toString):
> Unit = {
> -
> DisplayTapImplicits.ZeppelinTap(materialize(self).waitForResult()).display(printer)
> -    }
> -  }
> -
> -  // TODO: scala 2.11
> -  // implicit class ZeppelinSCollection[T: ClassTag](private val self:
> SCollection[T]) extends AnyVal {
> -  implicit class ZeppelinStringSCollection[T: ClassTag](val self:
> SCollection[T])
> -                                                       (implicit ev: T
> <:< String) {
> -    /** Convenience method to close the current
> [[com.spotify.scio.ScioContext]]
> -     * and display elements from SCollection. */
> -    def closeAndDisplay(printer: (T) => String = (e: T) => e.toString):
> Unit = {
> -
> DisplayTapImplicits.ZeppelinStringTap(materialize(self).waitForResult()).display(printer)
> -    }
> -  }
> -
> -  // TODO: scala 2.11
> -  // implicit class ZeppelinKVSCollection[K: ClassTag, V: ClassTag](val
> self: SCollection[(K, V)]) extends AnyVal {
> -  implicit class ZeppelinKVSCollection[K: ClassTag, V: ClassTag](val
> self: SCollection[(K, V)]) {
> -    /** Convenience method to close the current
> [[com.spotify.scio.ScioContext]]
> -     * and display elements from KV SCollection. */
> -    def closeAndDisplay(): Unit = {
> -
> DisplayTapImplicits.ZeppelinKVTap(materialize(self).waitForResult()).display()
> -    }
> -  }
> -
> -  // TODO: scala 2.11
> -  // implicit class ZeppelinProductSCollection[T: ClassTag](val self:
> SCollection[T])(implicit ev: T <:< Product) extends AnyVal {
> -  implicit class ZeppelinProductSCollection[T: ClassTag](val self:
> SCollection[T])
> -                                                        (implicit ev: T
> <:< Product) {
> -    /** Convenience method to close the current
> [[com.spotify.scio.ScioContext]]
> -     * and display elements from Product like SCollection */
> -    def closeAndDisplay(): Unit = {
> -
> DisplayTapImplicits.ZeppelinProductTap(materialize(self).waitForResult()).display()
> -    }
> -  }
> -
> -  // TODO: scala 2.11
> -  // implicit class ZeppelinAvroSCollection[T: ClassTag](val self:
> SCollection[T])(implicit ev: T <:< GenericRecord) extends AnyVal {
> -  implicit class ZeppelinAvroSCollection[T: ClassTag](val self:
> SCollection[T])
> -                                                     (implicit ev: T <:<
> GenericRecord) {
> -    /** Convenience method to close the current
> [[com.spotify.scio.ScioContext]]
> -     * and display elements from Avro like SCollection */
> -    def closeAndDisplay(schema: Schema = null): Unit = {
> -
> DisplayTapImplicits.ZeppelinAvroTap(materialize(self).waitForResult()).display(schema)
> -    }
> -  }
> -
> -  // TODO: scala 2.11
> -  // implicit class ZeppelinBQTableSCollection[T: ClassTag](val self:
> SCollection[T])(implicit ev: T <:< TableRow) extends AnyVal {
> -  implicit class ZeppelinBQTableSCollection[T: ClassTag](val self:
> SCollection[T])
> -                                                        (implicit ev: T
> <:< TableRow) {
> -    /** Convenience method to close the current
> [[com.spotify.scio.ScioContext]]
> -     * and display elements from TableRow like SCollection */
> -    def closeAndDisplay(schema: TableSchema): Unit = {
> -
> DisplayTapImplicits.ZeppelinBQTableTap(materialize(self).waitForResult()).display(schema)
> -    }
> -  }
> -
> -}
> diff --git
> a/scio/src/main/scala/org/apache/zeppelin/scio/DisplayTapImplicits.scala
> b/scio/src/main/scala/org/apache/zeppelin/scio/DisplayTapImplicits.scala
> deleted file mode 100644
> index 8aafc310a0..0000000000
> ---
> a/scio/src/main/scala/org/apache/zeppelin/scio/DisplayTapImplicits.scala
> +++ /dev/null
> @@ -1,154 +0,0 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements.  See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You 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.
> - */
> -
> -package org.apache.zeppelin.scio
> -
> -import com.google.api.services.bigquery.model.TableSchema
> -import com.spotify.scio.bigquery.TableRow
> -import com.spotify.scio.io.Tap
> -import com.spotify.scio._
> -import org.apache.avro.Schema
> -import org.apache.avro.generic.GenericRecord
> -
> -import scala.concurrent.Future
> -import scala.reflect.ClassTag
> -
> -/**
> - * Implicit Zeppelin display helpers for [[Tap]] and [[Future]] of a
> [[Tap]].
> - */
> -object DisplayTapImplicits {
> -
> -  // TODO: scala 2.11
> -  // implicit class ZeppelinTap[T: ClassTag](private val self:
> Tap[T])(implicit ev: T <:< AnyVal) extends AnyVal {
> -  implicit class ZeppelinTap[T: ClassTag](val self: Tap[T])
> -                                         (implicit ev: T <:< AnyVal) {
> -    /** Convenience method to display [[com.spotify.scio.io.Tap]] of
> AnyVal. */
> -    def display(printer: (T) => String = (e: T) => e.toString): Unit = {
> -      DisplayHelpers.displayAnyVal(self.value, printer)
> -    }
> -  }
> -
> -  // TODO: scala 2.11
> -  // implicit class ZeppelinFutureTap[T: ClassTag](private val self:
> Future[Tap[T]])(implicit ev: T <:< AnyVal) extends AnyVal {
> -  implicit class ZeppelinFutureTap[T: ClassTag](val self: Future[Tap[T]])
> -                                               (implicit ev: T <:<
> AnyVal) {
> -    /** Convenience method to display [[Future]] of a
> [[com.spotify.scio.io.Tap]] of AnyVal. */
> -    def waitAndDisplay(printer: (T) => String = (e: T) => e.toString):
> Unit = {
> -      ZeppelinTap(self.waitForResult()).display(printer)
> -    }
> -  }
> -
> -  // TODO: scala 2.11
> -  // implicit class ZeppelinStringTap[T: ClassTag](private val self:
> Tap[T])(implicit ev: T <:< String) extends AnyVal {
> -  implicit class ZeppelinStringTap[T: ClassTag](val self: Tap[T])
> -                                               (implicit ev: T <:<
> String) {
> -    /** Convenience method to display [[com.spotify.scio.io.Tap]] of
> Strings. */
> -    def display(printer: (T) => String = (e: T) => e.toString): Unit = {
> -      DisplayHelpers.displayString(self.value, printer)
> -    }
> -  }
> -
> -  // TODO: scala 2.11
> -  // implicit class ZeppelinFutureStringTap[T: ClassTag](private val
> self: Tap[T])(implicit ev: T <:< String) extends AnyVal {
> -  implicit class ZeppelinFutureStringTap[T: ClassTag](val self:
> Future[Tap[T]])
> -                                                     (implicit ev: T <:<
> String) {
> -    /** Convenience method to display [[Future]] of a
> [[com.spotify.scio.io.Tap]] of Strings. */
> -    def waitAndDisplay(printer: (T) => String = (e: T) => e.toString):
> Unit = {
> -      ZeppelinStringTap(self.waitForResult()).display(printer)
> -    }
> -  }
> -
> -  // TODO: scala 2.11
> -  // implicit class ZeppelinKVTap[K: ClassTag, V: ClassTag](val self:
> Tap[(K, V)]) extends AnyVal {
> -  implicit class ZeppelinKVTap[K: ClassTag, V: ClassTag](val self:
> Tap[(K, V)]) {
> -    /** Convenience method to display [[com.spotify.scio.io.Tap]] of KV.
> */
> -    def display(): Unit = {
> -      DisplayHelpers.displayKV(self.value)
> -    }
> -  }
> -
> -  // TODO: scala 2.11
> -  // implicit class ZeppelinFutureKVTap[K: ClassTag, V: ClassTag](val
> self: Future[Tap[(K, V)]]) extends AnyVal {
> -  implicit class ZeppelinFutureKVTap[K: ClassTag, V: ClassTag](val self:
> Future[Tap[(K, V)]]) {
> -    /** Convenience method to display [[Future]] of a
> [[com.spotify.scio.io.Tap]] of KV. */
> -    def waitAndDisplay(): Unit = {
> -      ZeppelinKVTap(self.waitForResult()).display()
> -    }
> -  }
> -
> -  // TODO: scala 2.11
> -  // implicit class ZeppelinProductTap[T: ClassTag](val self:
> Tap[T])(implicit ev: T <:< Product) extends AnyVal {
> -  implicit class ZeppelinProductTap[T: ClassTag](val self: Tap[T])
> -                                                (implicit ev: T <:<
> Product) {
> -    /** Convenience method to display [[com.spotify.scio.io.Tap]] of
> Product. */
> -    def display(): Unit = {
> -      DisplayHelpers.displayProduct(self.value)
> -    }
> -  }
> -
> -  // TODO: scala 2.11
> -  // implicit class ZeppelinFutureProductTap[T: ClassTag](val self:
> Future[Tap[T]])(implicit ev: T <:< Product) extends AnyVal {
> -  implicit class ZeppelinFutureProductTap[T: ClassTag](val self:
> Future[Tap[T]])
> -                                                      (implicit ev: T <:<
> Product) {
> -    /** Convenience method to display [[Future]] of a
> [[com.spotify.scio.io.Tap]] of Product. */
> -    def waitAndDisplay(): Unit = {
> -      ZeppelinProductTap(self.waitForResult()).display()
> -    }
> -  }
> -
> -  // TODO: scala 2.11
> -  // implicit class ZeppelinAvroTap[T: ClassTag](val self:
> Tap[T])(implicit ev: T <:< GenericRecord) extends AnyVal {
> -  implicit class ZeppelinAvroTap[T: ClassTag](val self: Tap[T])
> -                                             (implicit ev: T <:<
> GenericRecord) {
> -    /** Convenience method to display [[com.spotify.scio.io.Tap]] of
> Avro. */
> -    def display(schema: Schema = null): Unit = {
> -      DisplayHelpers.displayAvro(self.value, schema)
> -    }
> -  }
> -
> -  // TODO: scala 2.11
> -  // implicit class ZeppelinFutureAvroTap[T: ClassTag](val self:
> Future[Tap[T]])(implicit ev: T <:< GenericRecord) extends AnyVal {
> -  implicit class ZeppelinFutureAvroTap[T: ClassTag](val self:
> Future[Tap[T]])
> -                                                   (implicit ev: T <:<
> GenericRecord) {
> -    /** Convenience method to display [[Future]] of a
> [[com.spotify.scio.io.Tap]] of Avro. */
> -    def waitAndDisplay(schema: Schema = null): Unit = {
> -      ZeppelinAvroTap(self.waitForResult()).display(schema)
> -    }
> -  }
> -
> -  // TODO: scala 2.11
> -  // implicit class ZeppelinBQTableTap[T: ClassTag](val self:
> Tap[T])(implicit ev: T <:< TableRow) extends AnyVal {
> -  implicit class ZeppelinBQTableTap[T: ClassTag](val self: Tap[T])
> -                                                (implicit ev: T <:<
> TableRow) {
> -    /** Convenience method to display [[com.spotify.scio.io.Tap]] of
> BigQuery TableRow. */
> -    def display(schema: TableSchema): Unit = {
> -      DisplayHelpers.displayBQTableRow(self.value, schema)
> -    }
> -  }
> -
> -  // TODO: scala 2.11
> -  // implicit class ZeppelinFutureBQTableTap[T: ClassTag](val self:
> Future[Tap[T]])(implicit ev: T <:< TableRow) extends AnyVal {
> -  implicit class ZeppelinFutureBQTableTap[T: ClassTag](val self:
> Future[Tap[T]])
> -                                                      (implicit ev: T <:<
> TableRow) {
> -    /** Convenience method to display [[Future]] of a
> [[com.spotify.scio.io.Tap]] of BigQuery
> -     * TableRow. */
> -    def waitAndDisplay(schema: TableSchema): Unit = {
> -      ZeppelinBQTableTap(self.waitForResult()).display(schema)
> -    }
> -  }
> -
> -}
> diff --git
> a/scio/src/main/scala/org/apache/zeppelin/scio/ScioInterpreter.scala
> b/scio/src/main/scala/org/apache/zeppelin/scio/ScioInterpreter.scala
> deleted file mode 100644
> index f3400815b5..0000000000
> --- a/scio/src/main/scala/org/apache/zeppelin/scio/ScioInterpreter.scala
> +++ /dev/null
> @@ -1,201 +0,0 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements.  See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You 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.
> - */
> -
> -package org.apache.zeppelin.scio
> -
> -import java.beans.Introspector
> -import java.io.PrintStream
> -import java.util.Properties
> -
> -import com.google.cloud.dataflow.sdk.options.{PipelineOptions,
> PipelineOptionsFactory}
> -import
> com.google.cloud.dataflow.sdk.runners.inprocess.InProcessPipelineRunner
> -import com.spotify.scio.repl.{ScioILoop, ScioReplClassLoader}
> -import org.apache.zeppelin.interpreter.Interpreter.FormType
> -import org.apache.zeppelin.interpreter.util.InterpreterOutputStream
> -import org.apache.zeppelin.interpreter.{Interpreter, InterpreterContext,
> InterpreterResult}
> -import org.slf4j.LoggerFactory
> -
> -import scala.reflect.io.File
> -import scala.tools.nsc.GenericRunnerCommand
> -import scala.tools.nsc.interpreter.JPrintWriter
> -import scala.tools.nsc.util.ClassPath
> -
> -/**
> - * Scio interpreter for Zeppelin.
> - *
> - * <ul>
> - * <li>{@code zeppelin.scio.argz} - Scio interpreter wide arguments</li>
> - * <li>{@code zeppelin.scio.maxResult} - Max number of SCollection
> results to display.</li>
> - * </ul>
> - *
> - * <p>
> - * How to use: <br/>
> - * {@code
> - *  $beam.scio
> - *  val (sc, args) = ContextAndArgs(argz)
> - *  sc.parallelize(Seq("foo", "foo",
> "bar")).countByValue.closeAndDisplay()
> - * }
> - * </p>
> - *
> - */
> -
> -class ScioInterpreter(property: Properties) extends Interpreter(property)
> {
> -  private val logger = LoggerFactory.getLogger(classOf[ScioInterpreter])
> -  private var REPL: ScioILoop = _
> -
> -  val innerOut = new InterpreterOutputStream(logger)
> -
> -  override def open(): Unit = {
> -    val argz = Option(getProperty("zeppelin.scio.argz"))
> -
> .getOrElse(s"--runner=${classOf[InProcessPipelineRunner].getSimpleName}")
> -      .split(" ")
> -      .map(_.trim)
> -      .filter(_.nonEmpty)
> -      .toList
> -
> -    // Process command line arguments into a settings object, and use
> that to start the REPL.
> -    // We ignore params we don't care about - hence error function is
> empty
> -    val command = new GenericRunnerCommand(argz, _ => ())
> -    val settings = command.settings
> -
> -    settings.classpath.append(System.getProperty("java.class.path"))
> -    settings.usejavacp.value = true
> -
> -    def classLoaderURLs(cl: ClassLoader): Array[java.net.URL] = cl match {
> -      case null => Array()
> -      case u: java.net.URLClassLoader => u.getURLs ++
> classLoaderURLs(cl.getParent)
> -      case _ => classLoaderURLs(cl.getParent)
> -    }
> -
> -    classLoaderURLs(Thread.currentThread().getContextClassLoader)
> -      .foreach(u => settings.classpath.append(u.getPath))
> -
> -    // We have to make sure that scala macros are expandable. paradise
> plugin has to be added to
> -    // -Xplugin paths. In case of assembly - paradise is included in
> assembly jar - thus we add
> -    // itself to -Xplugin. If shell is started from sbt or classpath,
> paradise jar has to be in
> -    // classpath, we find it and add it to -Xplugin.
> -
> -    val thisJar =
> this.getClass.getProtectionDomain.getCodeSource.getLocation.getPath
> -    // In some cases this may be `target/classes`
> -    if(thisJar.endsWith(".jar")) settings.plugin.appendToValue(thisJar)
> -
> -    ClassPath
> -      .split(settings.classpath.value)
> -      .find(File(_).name.startsWith("paradise_"))
> -      .foreach(settings.plugin.appendToValue)
> -
> -    // Force the repl to be synchronous, so all cmds are executed in the
> same thread
> -    settings.Yreplsync.value = true
> -
> -    val jars = ClassPath.split(settings.classpath.value)
> -      .flatMap(ClassPath.specToURL)
> -      .toArray
> -
> -    val scioClassLoader = new ScioReplClassLoader(
> -      jars ++
> classLoaderURLs(Thread.currentThread().getContextClassLoader),
> -      null,
> -      Thread.currentThread.getContextClassLoader)
> -
> -    val (dfArgs, _) = parseAndPartitionArgs(argz)
> -
> -    REPL = new ScioILoop(scioClassLoader, dfArgs, None, new
> JPrintWriter(innerOut))
> -    scioClassLoader.setRepl(REPL)
> -
> -    // Set classloader chain - expose top level abstract class loader down
> -    // the chain to allow for readObject and latestUserDefinedLoader
> -    // See https://gist.github.com/harrah/404272
> -    settings.embeddedDefaults(scioClassLoader)
> -
> -    // No need for bigquery dumps
> -    sys.props("bigquery.plugin.disable.dump") = true.toString
> -
> -    REPL.settings_=(settings)
> -    REPL.createInterpreter()
> -    REPL.interpret(s"""val argz = Array("${argz.mkString("\", \"")}")""")
> -    REPL.interpret("import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits._")
> -    REPL.interpret("import
> org.apache.zeppelin.scio.DisplayTapImplicits._")
> -    REPL.interpret("import org.apache.zeppelin.scio.ContextAndArgs")
> -  }
> -
> -  private def parseAndPartitionArgs(args: List[String]): (List[String],
> List[String]) = {
> -    import scala.collection.JavaConverters._
> -    // Extract --pattern of all registered derived types of
> PipelineOptions
> -    val classes = PipelineOptionsFactory.getRegisteredOptions.asScala +
> classOf[PipelineOptions]
> -    val optPatterns = classes.flatMap { cls =>
> -      cls.getMethods.flatMap { m =>
> -        val n = m.getName
> -        if ((!n.startsWith("get") && !n.startsWith("is")) ||
> -          m.getParameterTypes.nonEmpty || m.getReturnType ==
> classOf[Unit]) None
> -        else Some(Introspector.decapitalize(n.substring(if
> (n.startsWith("is")) 2 else 3)))
> -      }.map(s => s"--$s($$|=)".r)
> -    }
> -
> -    // Split cmdlineArgs into 2 parts, optArgs for PipelineOptions and
> appArgs for Args
> -    args.partition(arg =>
> optPatterns.exists(_.findFirstIn(arg).isDefined))
> -  }
> -
> -  override def close(): Unit = {
> -    logger.info("Closing Scio interpreter!")
> -    REPL.closeInterpreter()
> -  }
> -
> -  override def interpret(code: String, context: InterpreterContext):
> InterpreterResult = {
> -    val paragraphId = context.getParagraphId
> -
> -    val consoleOut = new PrintStream(innerOut)
> -    System.setOut(consoleOut)
> -    innerOut.setInterpreterOutput(context.out)
> -
> -    try {
> -      import scala.tools.nsc.interpreter.Results._
> -      REPL.interpret(code) match {
> -        case Success => {
> -          logger.debug(s"Successfully executed `$code` in $paragraphId")
> -          new InterpreterResult(InterpreterResult.Code.SUCCESS)
> -        }
> -        case Error => {
> -          logger.error(s"Error executing `$code` in $paragraphId")
> -          new InterpreterResult(InterpreterResult.Code.ERROR,
> "Interpreter error")
> -        }
> -        case Incomplete => {
> -          logger.warn(s"Code `$code` not complete in $paragraphId")
> -          new InterpreterResult(InterpreterResult.Code.INCOMPLETE,
> "Incomplete expression")
> -        }
> -      }
> -    } catch {
> -      case e: Exception =>
> -        logger.info("Interpreter exception", e)
> -        new InterpreterResult(InterpreterResult.Code.ERROR, e.getMessage)
> -    } finally {
> -      innerOut.flush()
> -      innerOut.setInterpreterOutput(null)
> -      consoleOut.flush()
> -    }
> -  }
> -
> -  override def cancel(context: InterpreterContext): Unit = {
> -    // not implemented
> -  }
> -
> -  override def getFormType: FormType = FormType.NATIVE
> -
> -  override def getProgress(context: InterpreterContext): Int = {
> -    // not implemented
> -    0
> -  }
> -
> -}
> diff --git a/scio/src/test/avro/schema.avsc
> b/scio/src/test/avro/schema.avsc
> deleted file mode 100644
> index 07c3bea888..0000000000
> --- a/scio/src/test/avro/schema.avsc
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -{
> -  "type": "record",
> -  "name": "Account",
> -  "namespace": "org.apache.zeppelin.scio.avro",
> -  "doc": "Record for an account",
> -  "fields": [
> -    {"name": "id", "type": "int"},
> -    {"name": "type", "type": "string"},
> -    {"name": "name", "type": "string"},
> -    {"name": "amount", "type": "double"}
> -  ]
> -}
> diff --git
> a/scio/src/test/java/org/apache/zeppelin/scio/ScioInterpreterTest.java
> b/scio/src/test/java/org/apache/zeppelin/scio/ScioInterpreterTest.java
> deleted file mode 100644
> index 2e5c0d9bf0..0000000000
> --- a/scio/src/test/java/org/apache/zeppelin/scio/ScioInterpreterTest.java
> +++ /dev/null
> @@ -1,109 +0,0 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements.  See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You 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.
> - */
> -
> -package org.apache.zeppelin.scio;
> -
> -import org.apache.zeppelin.display.AngularObjectRegistry;
> -import org.apache.zeppelin.display.GUI;
> -import org.apache.zeppelin.interpreter.*;
> -import org.apache.zeppelin.resource.LocalResourcePool;
> -import org.apache.zeppelin.user.AuthenticationInfo;
> -import org.junit.Before;
> -import org.junit.Test;
> -
> -import java.util.HashMap;
> -import java.util.LinkedList;
> -import java.util.Properties;
> -
> -import static org.junit.Assert.assertEquals;
> -import static org.junit.Assert.assertTrue;
> -
> -public class ScioInterpreterTest {
> -  private static ScioInterpreter repl;
> -  private static InterpreterGroup intpGroup;
> -  private InterpreterContext context;
> -
> -  private final String newline = "\n";
> -
> -  private InterpreterContext getNewContext() {
> -    return InterpreterContext.builder()
> -        .setNoteId("noteId")
> -        .setParagraphId("paragraphId")
> -        .build();
> -  }
> -
> -  @Before
> -  public void setUp() throws Exception {
> -    if (repl == null) {
> -      intpGroup = new InterpreterGroup();
> -      intpGroup.put("note", new LinkedList<Interpreter>());
> -      repl = new ScioInterpreter(new Properties());
> -      repl.setInterpreterGroup(intpGroup);
> -      intpGroup.get("note").add(repl);
> -      repl.open();
> -    }
> -
> -    context = getNewContext();
> -  }
> -
> -  @Test
> -  public void testBasicSuccess() {
> -    assertEquals(InterpreterResult.Code.SUCCESS,
> -        repl.interpret("val a = 1" + newline + "val b = 2",
> context).code());
> -  }
> -
> -  @Test
> -  public void testBasicSyntaxError() {
> -    InterpreterResult error = repl.interpret("val a:Int = 'ds'", context);
> -    assertEquals(InterpreterResult.Code.ERROR, error.code());
> -    assertEquals("Interpreter error", error.message().get(0).getData());
> -  }
> -
> -  @Test
> -  public void testBasicIncomplete() {
> -    InterpreterResult incomplete = repl.interpret("val a = \"\"\"",
> context);
> -    assertEquals(InterpreterResult.Code.INCOMPLETE, incomplete.code());
> -    assertEquals("Incomplete expression",
> incomplete.message().get(0).getData());
> -  }
> -
> -  @Test
> -  public void testBasicPipeline() {
> -    assertEquals(InterpreterResult.Code.SUCCESS,
> -        repl.interpret("val (sc, _) = ContextAndArgs(argz)" + newline
> -            + "sc.parallelize(1 to 10).closeAndCollect().toList",
> context).code());
> -  }
> -
> -  @Test
> -  public void testBasicMultiStepPipeline() {
> -    final StringBuilder code = new StringBuilder();
> -    code.append("val (sc, _) = ContextAndArgs(argz)").append(newline)
> -        .append("val numbers = sc.parallelize(1 to 10)").append(newline)
> -        .append("val results =
> numbers.closeAndCollect().toList").append(newline)
> -        .append("println(results)");
> -    assertEquals(InterpreterResult.Code.SUCCESS,
> -        repl.interpret(code.toString(), context).code());
> -  }
> -
> -  @Test
> -  public void testException() {
> -    InterpreterResult exception = repl.interpret("val (sc, _) =
> ContextAndArgs(argz)" + newline
> -        + "throw new Exception(\"test\")", context);
> -    assertEquals(InterpreterResult.Code.ERROR, exception.code());
> -    assertTrue(exception.message().get(0).getData().length() > 0);
> -  }
> -
> -}
> diff --git a/scio/src/test/resources/log4j.properties
> b/scio/src/test/resources/log4j.properties
> deleted file mode 100644
> index 8daee59d60..0000000000
> --- a/scio/src/test/resources/log4j.properties
> +++ /dev/null
> @@ -1,22 +0,0 @@
> -#
> -# Licensed to the Apache Software Foundation (ASF) under one or more
> -# contributor license agreements.  See the NOTICE file distributed with
> -# this work for additional information regarding copyright ownership.
> -# The ASF licenses this file to You 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.
> -#
> -
> -log4j.rootLogger = INFO, stdout
> -
> -log4j.appender.stdout = org.apache.log4j.ConsoleAppender
> -log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
> -log4j.appender.stdout.layout.ConversionPattern=%5p [%d] ({%t} %F[%M]:%L)
> - %m%n
> diff --git
> a/scio/src/test/scala-2.11/org/apache/zeppelin/scio/DisplayHelpersTestScala211.scala
> b/scio/src/test/scala-2.11/org/apache/zeppelin/scio/DisplayHelpersTestScala211.scala
> deleted file mode 100644
> index 729dc87f5c..0000000000
> ---
> a/scio/src/test/scala-2.11/org/apache/zeppelin/scio/DisplayHelpersTestScala211.scala
> +++ /dev/null
> @@ -1,55 +0,0 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements.  See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You 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.
> - */
> -
> -package org.apache.zeppelin.scio
> -
> -import org.apache.zeppelin.scio.util.TestUtils
> -import org.junit.runner.RunWith
> -import org.scalatest.junit.JUnitRunner
> -import org.scalatest.{FlatSpec, Matchers}
> -
> -/**
> - * Scala 2.11 DisplayHelpersTest tests.
> - *
> - * Most tests have test scope implicit imports due to scala 2.10 bug
> - * https://issues.scala-lang.org/browse/SI-3346
> - *
> - * Note: we can't depend on the order of data coming from SCollection.
> - */
> -@RunWith(classOf[JUnitRunner]
> -class DisplayHelpersTestScala211 extends FlatSpec with Matchers {
> -  import TestUtils._
> -
> -  //
> -----------------------------------------------------------------------------------------------
> -  // Product SCollection Tests
> -  //
> -----------------------------------------------------------------------------------------------
> -
> -  it should "support SCollection of Case Class of 23" in {
> -    import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinProductSCollection
> -    val tupleHeader = s"$table " + (1 to 22).map(i =>
> s"a$i$tab").mkString + "a23"
> -    val o = captureOut {
> -      sideEffectWithData(
> -
> Seq.fill(3)(CC23(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23)))
> { in =>
> -        in.closeAndDisplay()
> -      }
> -    }
> -    o should contain theSameElementsAs (Seq(tupleHeader) ++
> -      Seq.fill(3)((1 to 22).map(i => s"$i$tab").mkString + "23"))
> -    o.head should be(tupleHeader)
> -  }
> -
> -}
> diff --git
> a/scio/src/test/scala-2.11/org/apache/zeppelin/scio/TestCCScala211.scala
> b/scio/src/test/scala-2.11/org/apache/zeppelin/scio/TestCCScala211.scala
> deleted file mode 100644
> index eca120598f..0000000000
> ---
> a/scio/src/test/scala-2.11/org/apache/zeppelin/scio/TestCCScala211.scala
> +++ /dev/null
> @@ -1,22 +0,0 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements.  See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You 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.
> - */
> -
> -package org.apache.zeppelin.scio
> -
> -case class CC23(a1: Int, a2: Int, a3: Int, a4: Int, a5: Int, a6: Int, a7:
> Int, a8: Int, a9: Int,
> -                a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, a15:
> Int, a16: Int, a17: Int,
> -                a18: Int, a19: Int, a20: Int, a21: Int, a22: Int, a23:
> Int)
> \ No newline at end of file
> diff --git
> a/scio/src/test/scala/org/apache/zeppelin/scio/DisplayHelpersTest.scala
> b/scio/src/test/scala/org/apache/zeppelin/scio/DisplayHelpersTest.scala
> deleted file mode 100644
> index a197fafc2d..0000000000
> --- a/scio/src/test/scala/org/apache/zeppelin/scio/DisplayHelpersTest.scala
> +++ /dev/null
> @@ -1,570 +0,0 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements.  See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You 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.
> - */
> -
> -package org.apache.zeppelin.scio
> -
> -import com.google.api.services.bigquery.model.{TableFieldSchema,
> TableSchema}
> -import com.spotify.scio.bigquery._
> -import org.apache.avro.Schema
> -import org.apache.avro.Schema.Parser
> -import org.apache.avro.generic.{GenericData, GenericRecord}
> -import org.apache.zeppelin.scio.avro.Account
> -import org.apache.zeppelin.scio.util.TestUtils
> -import org.junit.runner.RunWith
> -import org.scalatest.junit.JUnitRunner
> -import org.scalatest.{FlatSpec, Matchers}
> -
> -/**
> - * DisplayHelpersTest tests.
> - *
> - * Most tests have test scope implicit imports due to scala 2.10 bug
> - * https://issues.scala-lang.org/browse/SI-3346
> - *
> - * Note: we can't depend on the order of data coming from SCollection.
> - */
> -@RunWith(classOf[JUnitRunner])
> -class DisplayHelpersTest extends FlatSpec with Matchers {
> -  private val testRowLimit = 20
> -  sys.props("zeppelin.scio.maxResult") = 20.toString
> -
> -  import TestUtils._
> -
> -  //
> -----------------------------------------------------------------------------------------------
> -  // AnyVal SCollection Tests
> -  //
> -----------------------------------------------------------------------------------------------
> -
> -  private val anyValHeader = s"$table value"
> -  private val endTableFooter = DisplayHelpers.endTable.split("\\n").last
> -  private val endTableSeq = Seq("", endTableFooter)
> -
> -  "DisplayHelpers" should "support Integer SCollection via AnyVal" in {
> -    import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinSCollection
> -    val o = captureOut {
> -      sideEffectWithData(Seq(1, 2, 3)) { in =>
> -        in.closeAndDisplay()
> -      }
> -    }
> -    o should contain theSameElementsAs Seq(anyValHeader,
> -                                           "1",
> -                                           "2",
> -                                           "3") ++ endTableSeq
> -    o.head should be(anyValHeader)
> -    o.last should be(endTableFooter)
> -  }
> -
> -  it should "support Long SCollection via AnyVal" in {
> -    import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinSCollection
> -    val o = captureOut {
> -      sideEffectWithData(Seq(1L, 2L, 3L)) { in =>
> -        in.closeAndDisplay()
> -      }
> -    }
> -    o should contain theSameElementsAs Seq(anyValHeader,
> -                                           "1",
> -                                           "2",
> -                                           "3") ++ endTableSeq
> -    o.head should be(anyValHeader)
> -    o.last should be(endTableFooter)
> -  }
> -
> -  it should "support Double SCollection via AnyVal" in {
> -    import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinSCollection
> -    val o = captureOut {
> -      sideEffectWithData(Seq(1.0D, 2.0D, 3.0D)) { in =>
> -        in.closeAndDisplay()
> -      }
> -    }
> -    o should contain theSameElementsAs Seq(anyValHeader,
> -                                           "1.0",
> -                                           "2.0",
> -                                           "3.0") ++ endTableSeq
> -    o.head should be(anyValHeader)
> -    o.last should be(endTableFooter)
> -  }
> -
> -  it should "support Float SCollection via AnyVal" in {
> -    import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinSCollection
> -    val o = captureOut {
> -      sideEffectWithData(Seq(1.0F, 2.0F, 3.0F)) { in =>
> -        in.closeAndDisplay()
> -      }
> -    }
> -    o should contain theSameElementsAs Seq(anyValHeader,
> -                                           "1.0",
> -                                           "2.0",
> -                                           "3.0") ++ endTableSeq
> -    o.head should be(anyValHeader)
> -    o.last should be(endTableFooter)
> -  }
> -
> -  it should "support Short SCollection via AnyVal" in {
> -    import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinSCollection
> -    val o = captureOut {
> -      sideEffectWithData(Seq(1.toShort, 2.toShort, 3.toShort)) { in =>
> -        in.closeAndDisplay()
> -      }
> -    }
> -    o should contain theSameElementsAs Seq(anyValHeader,
> -                                           "1",
> -                                           "2",
> -                                           "3") ++ endTableSeq
> -    o.head should be(anyValHeader)
> -    o.last should be(endTableFooter)
> -  }
> -
> -  it should "support Byte SCollection via AnyVal" in {
> -    import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinSCollection
> -    val o = captureOut {
> -      sideEffectWithData(Seq(1.toByte, 2.toByte, 3.toByte)) { in =>
> -        in.closeAndDisplay()
> -      }
> -    }
> -    o should contain theSameElementsAs Seq(anyValHeader,
> -                                           "1",
> -                                           "2",
> -                                           "3") ++ endTableSeq
> -    o.head should be(anyValHeader)
> -    o.last should be(endTableFooter)
> -  }
> -
> -  it should "support Boolean SCollection via AnyVal" in {
> -    import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinSCollection
> -    val o = captureOut {
> -      sideEffectWithData(Seq(true, false, true)) { in =>
> -        in.closeAndDisplay()
> -      }
> -    }
> -    o should contain theSameElementsAs Seq(anyValHeader,
> -                                           "true",
> -                                           "false",
> -                                           "true") ++ endTableSeq
> -    o.head should be(anyValHeader)
> -    o.last should be(endTableFooter)
> -  }
> -
> -  it should "support Char SCollection via AnyVal" in {
> -    import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinSCollection
> -    val o = captureOut {
> -      sideEffectWithData(Seq('a', 'b', 'c')) { in =>
> -        in.closeAndDisplay()
> -      }
> -    }
> -    o should contain theSameElementsAs Seq(anyValHeader,
> -                                           "a",
> -                                           "b",
> -                                           "c") ++ endTableSeq
> -    o.head should be(anyValHeader)
> -    o.last should be(endTableFooter)
> -  }
> -
> -  it should "support SCollection of AnyVal over row limit" in {
> -    import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinSCollection
> -    val o = captureOut {
> -      sideEffectWithData(1 to 21) { in =>
> -        in.closeAndDisplay()
> -      }
> -    }
> -    o.size should be > testRowLimit
> -    o.head should be(anyValHeader)
> -    o.last should be(rowLimitReached)
> -  }
> -
> -  it should "support empty SCollection of AnyVal" in {
> -    import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinSCollection
> -    val o = captureOut {
> -      sideEffectWithData(Seq.empty[AnyVal]) { in =>
> -        in.closeAndDisplay()
> -      }
> -    }
> -    o should contain theSameElementsAs
> DisplayHelpers.sCollectionEmptyMsg.split(newline)
> -  }
> -
> -  //
> -----------------------------------------------------------------------------------------------
> -  // String SCollection Tests
> -  //
> -----------------------------------------------------------------------------------------------
> -
> -  private val stringHeader = s"$table value"
> -
> -  it should "support String SCollection" in {
> -    import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinStringSCollection
> -    val o = captureOut {
> -      sideEffectWithData(Seq("a","b","c")) { in =>
> -        in.closeAndDisplay()
> -      }
> -    }
> -    o should contain theSameElementsAs Seq(stringHeader,
> -                                           "a",
> -                                           "b",
> -                                           "c") ++ endTableSeq
> -    o.head should be (stringHeader)
> -    o.last should be (endTableFooter)
> -  }
> -
> -  it should "support empty SCollection of String" in {
> -    import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinStringSCollection
> -    val o = captureOut {
> -      sideEffectWithData(Seq.empty[String]) { in =>
> -        in.closeAndDisplay()
> -      }
> -    }
> -    o should contain theSameElementsAs
> DisplayHelpers.sCollectionEmptyMsg.split(newline)
> -  }
> -
> -  it should "support SCollection of String over row limit" in {
> -    import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinStringSCollection
> -    val o = captureOut {
> -      sideEffectWithData(Seq.fill(21)("a")) { in =>
> -        in.closeAndDisplay()
> -      }
> -    }
> -    o.size should be > testRowLimit
> -    o.head should be(stringHeader)
> -    o.last should be(rowLimitReached)
> -  }
> -
> -  //
> -----------------------------------------------------------------------------------------------
> -  // KV SCollection Tests
> -  //
> -----------------------------------------------------------------------------------------------
> -
> -  private val kvHeader = s"$table key${tab}value"
> -
> -  it should "support KV (ints) SCollection" in {
> -    import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinKVSCollection
> -    val o = captureOut {
> -      sideEffectWithData(Seq((1,2), (3,4))) { in =>
> -        in.closeAndDisplay()
> -      }
> -    }
> -    o should contain theSameElementsAs Seq(kvHeader,
> -                                           s"3${tab}4",
> -                                           s"1${tab}2") ++ endTableSeq
> -    o.head should be (kvHeader)
> -    o.last should be (endTableFooter)
> -  }
> -
> -  it should "support KV (str keys) SCollection" in {
> -    import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinKVSCollection
> -    val o = captureOut {
> -      sideEffectWithData(Seq(("foo",2), ("bar",4))) { in =>
> -        in.closeAndDisplay()
> -      }
> -    }
> -    o should contain theSameElementsAs Seq(kvHeader,
> -                                           s"foo${tab}2",
> -                                           s"bar${tab}4") ++ endTableSeq
> -    o.head should be (kvHeader)
> -    o.last should be (endTableFooter)
> -  }
> -
> -  it should "support KV (str values) SCollection" in {
> -    import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinKVSCollection
> -    val o = captureOut {
> -      sideEffectWithData(Seq((2,"foo"), (4,"bar"))) { in =>
> -        in.closeAndDisplay()
> -      }
> -    }
> -    o should contain theSameElementsAs Seq(kvHeader,
> -                                           s"2${tab}foo",
> -                                           s"4${tab}bar") ++ endTableSeq
> -    o.head should be (kvHeader)
> -    o.last should be (endTableFooter)
> -  }
> -
> -  it should "support empty KV SCollection" in {
> -    import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinKVSCollection
> -    captureOut {
> -      sideEffectWithData(Seq.empty[(Int, Int)]) { in =>
> -        in.closeAndDisplay()
> -      }
> -    } should contain theSameElementsAs
> DisplayHelpers.sCollectionEmptyMsg.split(newline)
> -  }
> -
> -  it should "support SCollection of KV over row limit" in {
> -    import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinKVSCollection
> -    val o = captureOut {
> -      sideEffectWithData(Seq.fill(21)(("foo", 1))) { in =>
> -        in.closeAndDisplay()
> -      }
> -    }
> -    o.size should be > testRowLimit
> -    o.head should be(kvHeader)
> -    o.last should be(rowLimitReached)
> -  }
> -
> -  //
> -----------------------------------------------------------------------------------------------
> -  // Product SCollection Tests
> -  //
> -----------------------------------------------------------------------------------------------
> -
> -  private val testCaseClassHeader = s"$table foo${tab}bar${tab}a"
> -
> -  it should "support SCollection of Tuple of 3" in {
> -    import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinProductSCollection
> -    val tupleHeader = s"$table _1${tab}_2${tab}_3"
> -    val o = captureOut {
> -      sideEffectWithData(Seq.fill(3)((1,2,3))) { in =>
> -        in.closeAndDisplay()
> -      }
> -    }
> -    o should contain theSameElementsAs
> -      (Seq(tupleHeader) ++ Seq.fill(3)(s"1${tab}2${tab}3") ++ endTableSeq)
> -    o.head should be(tupleHeader)
> -    o.last should be (endTableFooter)
> -  }
> -
> -  it should "support SCollection of Tuple of 22" in {
> -    import
> org.apache.zeppelin.scio.DisplaySCollectionImplicits.ZeppelinProductSCollection
> -    val tupleHeader = s"$table " + (1 to 21).map(i =>
> s"_$i$tab").mkString + "_22"
> -    val o = captureOut {
> -      sideEffectWithData(
> -
> Seq.fill(3)((1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22))) {
> in =>
> -          in.closeAndDisplay()
> -      }
> -    }
> -    o should contain theSameElementsAs (Seq(tupleHeader) ++
> -      Seq.fill(3)((1 to 21).map(i => s"$i$tab").mkString + "