You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by xi...@apache.org on 2019/11/03 08:07:50 UTC

[incubator-pinot] branch master updated: Adding superset demo example (#4779)

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

xiangfu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-pinot.git


The following commit(s) were added to refs/heads/master by this push:
     new 1c66672  Adding superset demo example (#4779)
1c66672 is described below

commit 1c6667229ef6da4f29eab123614a0053e162839b
Author: Xiang Fu <fx...@gmail.com>
AuthorDate: Sun Nov 3 01:07:45 2019 -0700

    Adding superset demo example (#4779)
    
    * Adding superset demo example
    
    * Address comments
---
 .gitignore                                         |    3 +
 .../pinot-superset/.dockerignore}                  |   13 +-
 .../pinot-superset/.python-version}                |   11 +-
 docker/images/pinot-superset/Dockerfile            |  112 +
 docker/images/pinot-superset/Makefile              |   64 +
 docker/images/pinot-superset/README.md             |   70 +
 .../pinot-superset/requirements-db.txt}            |   26 +-
 docker/{ => images/pinot}/Dockerfile               |    0
 docker/{ => images/pinot}/README.md                |    0
 docker/{ => images/pinot}/docker-build-and-push.sh |    0
 docker/{ => images/pinot}/docker-build.sh          |    0
 docker/{ => images/pinot}/docker-compose.yml       |    0
 docker/{ => images/pinot}/docker-push.sh           |    0
 kubernetes/examples/helm/README.md                 |   38 +
 .../examples/helm/open-superset-ui.sh              |   17 +-
 .../examples/helm/pinot-realtime-quickstart.yml    |  354 ++-
 kubernetes/examples/helm/superset.yaml             | 2322 ++++++++++++++++++++
 17 files changed, 2989 insertions(+), 41 deletions(-)

diff --git a/.gitignore b/.gitignore
index 78661c2e..74cb8d3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,3 +20,6 @@ docs/_build
 *.ipr
 *.iws
 .*.swp
+**/.docker/
+**/.env
+kubernetes/examples/helm/charts/
diff --git a/docker/docker-push.sh b/docker/images/pinot-superset/.dockerignore
old mode 100755
new mode 100644
similarity index 82%
copy from docker/docker-push.sh
copy to docker/images/pinot-superset/.dockerignore
index cfef8fe..46915c8
--- a/docker/docker-push.sh
+++ b/docker/images/pinot-superset/.dockerignore
@@ -1,4 +1,3 @@
-#!/bin/bash
 #
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
@@ -18,12 +17,6 @@
 # under the License.
 #
 
-
-if [[ "$#" -gt 0 ]]
-then
-  DOCKER_TAG=$1
-else
-  DOCKER_TAG="pinot:latest"
-fi
-echo "Trying to push docker image to ${DOCKER_TAG}"
-docker push ${DOCKER_TAG}
+*
+!bin/
+!requirements-db.txt
diff --git a/docker/docker-push.sh b/docker/images/pinot-superset/.python-version
old mode 100755
new mode 100644
similarity index 82%
copy from docker/docker-push.sh
copy to docker/images/pinot-superset/.python-version
index cfef8fe..c0bbf58
--- a/docker/docker-push.sh
+++ b/docker/images/pinot-superset/.python-version
@@ -1,4 +1,3 @@
-#!/bin/bash
 #
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
@@ -18,12 +17,4 @@
 # under the License.
 #
 
-
-if [[ "$#" -gt 0 ]]
-then
-  DOCKER_TAG=$1
-else
-  DOCKER_TAG="pinot:latest"
-fi
-echo "Trying to push docker image to ${DOCKER_TAG}"
-docker push ${DOCKER_TAG}
+3.6.8
diff --git a/docker/images/pinot-superset/Dockerfile b/docker/images/pinot-superset/Dockerfile
new file mode 100644
index 0000000..6578620
--- /dev/null
+++ b/docker/images/pinot-superset/Dockerfile
@@ -0,0 +1,112 @@
+#
+# 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.
+#
+
+ARG NODE_VERSION=latest
+ARG PYTHON_VERSION=latest
+
+# --- Build assets with NodeJS
+
+FROM node:${NODE_VERSION} AS build
+
+# Superset version to build
+ARG SUPERSET_VERSION=master
+ENV SUPERSET_HOME=/var/lib/superset/
+
+# Download source
+WORKDIR ${SUPERSET_HOME}
+RUN wget -O /tmp/superset.tar.gz https://github.com/apache/incubator-superset/archive/${SUPERSET_VERSION}.tar.gz && \
+    tar xzf /tmp/superset.tar.gz -C ${SUPERSET_HOME} --strip-components=1
+
+# Build assets
+WORKDIR ${SUPERSET_HOME}/superset/assets
+RUN npm install && \
+    npm run build
+
+# --- Build dist package with Python 3
+
+FROM python:${PYTHON_VERSION} AS dist
+
+# Copy prebuilt workspace into stage
+ENV SUPERSET_HOME=/var/lib/superset/
+WORKDIR ${SUPERSET_HOME}
+COPY --from=build ${SUPERSET_HOME} .
+COPY requirements-db.txt .
+
+# Create package to install
+RUN python setup.py sdist && \
+    tar czfv /tmp/superset.tar.gz requirements.txt requirements-db.txt dist
+
+# --- Install dist package and finalize app
+
+FROM python:${PYTHON_VERSION} AS final
+
+# Configure environment
+ENV GUNICORN_BIND=0.0.0.0:8088 \
+    GUNICORN_LIMIT_REQUEST_FIELD_SIZE=0 \
+    GUNICORN_LIMIT_REQUEST_LINE=0 \
+    GUNICORN_TIMEOUT=60 \
+    GUNICORN_WORKERS=3 \
+    GUNICORN_THREADS=4 \
+    LANG=C.UTF-8 \
+    LC_ALL=C.UTF-8 \
+    PYTHONPATH=/etc/superset:/home/superset:$PYTHONPATH \
+    SUPERSET_REPO=apache/incubator-superset \
+    SUPERSET_VERSION=${SUPERSET_VERSION} \
+    SUPERSET_HOME=/var/lib/superset
+ENV GUNICORN_CMD_ARGS="--workers ${GUNICORN_WORKERS} --threads ${GUNICORN_THREADS} --timeout ${GUNICORN_TIMEOUT} --bind ${GUNICORN_BIND} --limit-request-line ${GUNICORN_LIMIT_REQUEST_LINE} --limit-request-field_size ${GUNICORN_LIMIT_REQUEST_FIELD_SIZE}"
+
+# Create superset user & install dependencies
+WORKDIR /tmp/superset
+COPY --from=dist /tmp/superset.tar.gz .
+RUN useradd -U -m superset && \
+    mkdir -p /etc/superset && \
+    mkdir -p ${SUPERSET_HOME} && \
+    chown -R superset:superset /etc/superset && \
+    chown -R superset:superset ${SUPERSET_HOME} && \
+    apt-get update && \
+    apt-get install -y \
+        build-essential \
+        curl \
+        default-libmysqlclient-dev \
+        freetds-bin \
+        freetds-dev \
+        libffi-dev \
+        libldap2-dev \
+        libpq-dev \
+        libsasl2-2 \
+        libsasl2-dev \
+        libsasl2-modules-gssapi-mit \
+        libssl1.0 && \
+    apt-get clean && \
+    tar xzf superset.tar.gz && \
+    pip install dist/*.tar.gz -r requirements.txt -r requirements-db.txt && \
+    rm -rf ./*
+
+# Configure Filesystem
+COPY bin /usr/local/bin
+WORKDIR /home/superset
+VOLUME /etc/superset \
+       /home/superset \
+       /var/lib/superset
+
+# Finalize application
+EXPOSE 8088
+HEALTHCHECK CMD ["curl", "-f", "http://localhost:8088/health"]
+CMD ["gunicorn", "superset:app"]
+USER superset
diff --git a/docker/images/pinot-superset/Makefile b/docker/images/pinot-superset/Makefile
new file mode 100644
index 0000000..85fb778
--- /dev/null
+++ b/docker/images/pinot-superset/Makefile
@@ -0,0 +1,64 @@
+#
+# 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.
+#
+
+image  := fx19880617/pinot-superset
+stages := build dist final
+shells := $(foreach stage,$(stages),shell@$(stage))
+
+node_version     := latest
+python_version   := 3.6
+superset_version := 0.34.1
+
+.PHONY: all clean push $(stages) $(shells)
+
+all: latest
+
+.docker:
+	mkdir -p $@
+
+.docker/$(superset_version)@dist:  .docker/$(superset_version)@build
+.docker/$(superset_version)@final: .docker/$(superset_version)@dist
+.docker/$(superset_version)@%:   | .docker
+	docker build \
+	--build-arg NODE_VERSION=$(node_version) \
+	--build-arg PYTHON_VERSION=$(python_version) \
+	--build-arg SUPERSET_VERSION=$(superset_version) \
+	--iidfile $@ \
+	--tag $(image):$(superset_version)-$* \
+	--target $* .
+
+.docker/latest .docker/$(superset_version): .docker/$(superset_version)@final
+.docker/%:
+	docker tag $(shell cat $<) $(image):$*
+	cp $< $@
+
+clean:
+	-docker image rm -f $(shell awk {print} .docker/*)
+	-rm -rf .docker
+
+latest: .docker/latest .docker/$(superset_version)
+
+push: .docker/latest .docker/$(superset_version)
+	docker push $(image):$(superset_version)
+	docker push $(image):latest
+
+$(stages): %: .docker/$(superset_version)@%
+
+$(shells): shell@%: .docker/$(superset_version)@%
+	docker run --rm -it --entrypoint /bin/bash $(shell cat $<)
diff --git a/docker/images/pinot-superset/README.md b/docker/images/pinot-superset/README.md
new file mode 100644
index 0000000..8e35f3b
--- /dev/null
+++ b/docker/images/pinot-superset/README.md
@@ -0,0 +1,70 @@
+<!--
+
+    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.
+
+-->
+
+# Superset
+
+Docker image for [Superset](https://github.com/ApacheInfra/superset) with Pinot integration.
+
+This docker build project is based on Project [docker-superset](https://github.com/amancevice/docker-superset) and specialized for Pinot.
+
+## How to build
+
+Please modify file `Makefile` to change `image` and `superset_version` accordingly.
+
+Below command will build docker image and tag it as `superset_version` and `latest`.
+
+```bash
+make latest
+```
+
+You can also build directly with `docker build` command by setting arguments:
+```bash
+docker build \
+	--build-arg NODE_VERSION=latest \
+	--build-arg PYTHON_VERSION=3.6 \
+	--build-arg SUPERSET_VERSION=0.34.1 \
+	--tag fx19880617/pinot-superset:0.34.1 \
+	--target build .
+```
+## How to push
+
+```bash
+make push
+```
+
+## Configuration
+
+Follow the [instructions](https://superset.incubator.apache.org/installation.html#configuration) provided by Apache Superset for writing your own `superset_config.py`.
+
+Place this file in a local directory and mount this directory to `/etc/superset` inside the container. This location is included in the image's `PYTHONPATH`. Mounting this file to a different location is possible, but it will need to be in the `PYTHONPATH`.
+
+
+## Volumes
+
+The image defines two data volumes: one for mounting configuration into the container, and one for data (logs, SQLite DBs, &c).
+
+The configuration volume is located alternatively at `/etc/superset` or `/home/superset`; either is acceptable. Both of these directories are included in the `PYTHONPATH` of the image. Mount any configuration (specifically the `superset_config.py` file) here to have it read by the app on startup.
+
+The data volume is located at `/var/lib/superset` and it is where you would mount your SQLite file (if you are using that as your backend), or a volume to collect any logs that are routed there. This location is used as the value of the `SUPERSET_HOME` environmental variable.
+
+## Kubernetes Examples
+
+Please refer to [`superset.yaml`](../../../kubernetes/examples/helm/superset.yaml) as k8s deployment example.
diff --git a/docker/docker-push.sh b/docker/images/pinot-superset/requirements-db.txt
old mode 100755
new mode 100644
similarity index 74%
copy from docker/docker-push.sh
copy to docker/images/pinot-superset/requirements-db.txt
index cfef8fe..9eceb48
--- a/docker/docker-push.sh
+++ b/docker/images/pinot-superset/requirements-db.txt
@@ -1,4 +1,3 @@
-#!/bin/bash
 #
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
@@ -18,12 +17,19 @@
 # under the License.
 #
 
-
-if [[ "$#" -gt 0 ]]
-then
-  DOCKER_TAG=$1
-else
-  DOCKER_TAG="pinot:latest"
-fi
-echo "Trying to push docker image to ${DOCKER_TAG}"
-docker push ${DOCKER_TAG}
+flask-cors==3.0.3
+flask-mail==0.9.1
+flask-oauth==0.12
+flask_oauthlib==0.9.5
+gevent==1.2.2
+impyla==0.14.0
+mysqlclient==1.4.2
+psycopg2==2.7.6.1
+pyathena==1.5.1
+pybigquery==0.4.10
+pyhive==0.5.1
+pyldap==2.4.28
+pymssql==2.1.4
+redis==3.2.1
+sqlalchemy-redshift==0.7.1
+pinotdb==0.2.4
diff --git a/docker/Dockerfile b/docker/images/pinot/Dockerfile
similarity index 100%
rename from docker/Dockerfile
rename to docker/images/pinot/Dockerfile
diff --git a/docker/README.md b/docker/images/pinot/README.md
similarity index 100%
rename from docker/README.md
rename to docker/images/pinot/README.md
diff --git a/docker/docker-build-and-push.sh b/docker/images/pinot/docker-build-and-push.sh
similarity index 100%
rename from docker/docker-build-and-push.sh
rename to docker/images/pinot/docker-build-and-push.sh
diff --git a/docker/docker-build.sh b/docker/images/pinot/docker-build.sh
similarity index 100%
rename from docker/docker-build.sh
rename to docker/images/pinot/docker-build.sh
diff --git a/docker/docker-compose.yml b/docker/images/pinot/docker-compose.yml
similarity index 100%
rename from docker/docker-compose.yml
rename to docker/images/pinot/docker-compose.yml
diff --git a/docker/docker-push.sh b/docker/images/pinot/docker-push.sh
similarity index 100%
copy from docker/docker-push.sh
copy to docker/images/pinot/docker-push.sh
diff --git a/kubernetes/examples/helm/README.md b/kubernetes/examples/helm/README.md
index 7c32c3e..2499488 100644
--- a/kubernetes/examples/helm/README.md
+++ b/kubernetes/examples/helm/README.md
@@ -213,3 +213,41 @@ Alternatively a YAML file that specifies the values for the parameters can be pr
 ```bash
 helm install --name pinot -f values.yaml .
 ```
+
+## Use superset to query Pinot
+
+### Bring up Superset
+
+```bash
+kubectl apply -f superset.yaml
+```
+
+### Set up Admin account (First time)
+
+```bash
+kubectl exec -it pod/superset-0 -n pinot-quickstart -- bash -c 'export FLASK_APP=superset:app && flask fab create-admin'
+```
+
+### Init Superset (First time)
+
+```bash
+kubectl exec -it pod/superset-0 -n pinot-quickstart -- bash -c 'superset db upgrade'
+kubectl exec -it pod/superset-0 -n pinot-quickstart -- bash -c 'superset init'
+```
+
+### Load Demo Data source
+
+```bash
+kubectl exec -it pod/superset-0 -n pinot-quickstart -- bash -c 'superset import_datasources -p /etc/superset/pinot_example_datasource.yaml'
+kubectl exec -it pod/superset-0 -n pinot-quickstart -- bash -c 'superset import_dashboards -p /etc/superset/pinot_example_dashboard.json'
+```
+
+### Access Superset UI
+
+You can run below command to navigate superset in your browser with the previous admin credential.
+
+```bash
+./open-superset-ui.sh
+```
+
+You can open the imported dashboard by click `Dashboards` banner then click on `AirlineStats`.
diff --git a/docker/docker-push.sh b/kubernetes/examples/helm/open-superset-ui.sh
similarity index 72%
rename from docker/docker-push.sh
rename to kubernetes/examples/helm/open-superset-ui.sh
index cfef8fe..84975ad 100755
--- a/docker/docker-push.sh
+++ b/kubernetes/examples/helm/open-superset-ui.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
 #
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
@@ -18,12 +18,11 @@
 # under the License.
 #
 
-
-if [[ "$#" -gt 0 ]]
-then
-  DOCKER_TAG=$1
-else
-  DOCKER_TAG="pinot:latest"
+if [[ $(nc -z  localhost 8088) != 0 ]]; then
+  kubectl port-forward service/superset 8088:8088 -n pinot-quickstart > /dev/null &
 fi
-echo "Trying to push docker image to ${DOCKER_TAG}"
-docker push ${DOCKER_TAG}
+sleep 2
+open http://localhost:8088
+# Just for blocking
+tail -f /dev/null
+pkill -f "kubectl port-forward service/superset 8088:8088 -n pinot-quickstart"
diff --git a/kubernetes/examples/helm/pinot-realtime-quickstart.yml b/kubernetes/examples/helm/pinot-realtime-quickstart.yml
index b2453a2..7b47bb2 100644
--- a/kubernetes/examples/helm/pinot-realtime-quickstart.yml
+++ b/kubernetes/examples/helm/pinot-realtime-quickstart.yml
@@ -31,7 +31,7 @@ data:
         "timeColumnName": "DaysSinceEpoch",
         "timeType": "DAYS",
         "retentionTimeUnit": "DAYS",
-        "retentionTimeValue": "5",
+        "retentionTimeValue": "3650",
         "segmentPushType": "APPEND",
         "segmentAssignmentStrategy": "BalanceNumSegmentAssignmentStrategy",
         "schemaName": "airlineStats",
@@ -63,6 +63,353 @@ data:
       }
     }
 
+  airlineStats_schema.json: |-
+    {
+      "metricFieldSpecs": [
+      ],
+      "dimensionFieldSpecs": [
+        {
+          "dataType": "INT",
+          "name": "ActualElapsedTime"
+        },
+        {
+          "dataType": "INT",
+          "name": "AirTime"
+        },
+        {
+          "dataType": "INT",
+          "name": "AirlineID"
+        },
+        {
+          "dataType": "INT",
+          "name": "ArrDel15"
+        },
+        {
+          "dataType": "INT",
+          "name": "ArrDelay"
+        },
+        {
+          "dataType": "INT",
+          "name": "ArrDelayMinutes"
+        },
+        {
+          "dataType": "INT",
+          "name": "ArrTime"
+        },
+        {
+          "dataType": "STRING",
+          "name": "ArrTimeBlk"
+        },
+        {
+          "dataType": "INT",
+          "name": "ArrivalDelayGroups"
+        },
+        {
+          "dataType": "INT",
+          "name": "CRSArrTime"
+        },
+        {
+          "dataType": "INT",
+          "name": "CRSDepTime"
+        },
+        {
+          "dataType": "INT",
+          "name": "CRSElapsedTime"
+        },
+        {
+          "dataType": "STRING",
+          "name": "CancellationCode"
+        },
+        {
+          "dataType": "INT",
+          "name": "Cancelled"
+        },
+        {
+          "dataType": "STRING",
+          "name": "Carrier"
+        },
+        {
+          "dataType": "INT",
+          "name": "CarrierDelay"
+        },
+        {
+          "dataType": "INT",
+          "name": "DayOfWeek"
+        },
+        {
+          "dataType": "INT",
+          "name": "DayofMonth"
+        },
+        {
+          "dataType": "INT",
+          "name": "DepDel15"
+        },
+        {
+          "dataType": "INT",
+          "name": "DepDelay"
+        },
+        {
+          "dataType": "INT",
+          "name": "DepDelayMinutes"
+        },
+        {
+          "dataType": "INT",
+          "name": "DepTime"
+        },
+        {
+          "dataType": "STRING",
+          "name": "DepTimeBlk"
+        },
+        {
+          "dataType": "INT",
+          "name": "DepartureDelayGroups"
+        },
+        {
+          "dataType": "STRING",
+          "name": "Dest"
+        },
+        {
+          "dataType": "INT",
+          "name": "DestAirportID"
+        },
+        {
+          "dataType": "INT",
+          "name": "DestAirportSeqID"
+        },
+        {
+          "dataType": "INT",
+          "name": "DestCityMarketID"
+        },
+        {
+          "dataType": "STRING",
+          "name": "DestCityName"
+        },
+        {
+          "dataType": "STRING",
+          "name": "DestState"
+        },
+        {
+          "dataType": "INT",
+          "name": "DestStateFips"
+        },
+        {
+          "dataType": "STRING",
+          "name": "DestStateName"
+        },
+        {
+          "dataType": "INT",
+          "name": "DestWac"
+        },
+        {
+          "dataType": "INT",
+          "name": "Distance"
+        },
+        {
+          "dataType": "INT",
+          "name": "DistanceGroup"
+        },
+        {
+          "dataType": "INT",
+          "name": "DivActualElapsedTime"
+        },
+        {
+          "dataType": "INT",
+          "name": "DivAirportIDs",
+          "singleValueField": false
+        },
+        {
+          "dataType": "INT",
+          "name": "DivAirportLandings"
+        },
+        {
+          "dataType": "INT",
+          "name": "DivAirportSeqIDs",
+          "singleValueField": false
+        },
+        {
+          "dataType": "STRING",
+          "name": "DivAirports",
+          "singleValueField": false
+        },
+        {
+          "dataType": "INT",
+          "name": "DivArrDelay"
+        },
+        {
+          "dataType": "INT",
+          "name": "DivDistance"
+        },
+        {
+          "dataType": "INT",
+          "name": "DivLongestGTimes",
+          "singleValueField": false
+        },
+        {
+          "dataType": "INT",
+          "name": "DivReachedDest"
+        },
+        {
+          "dataType": "STRING",
+          "name": "DivTailNums",
+          "singleValueField": false
+        },
+        {
+          "dataType": "INT",
+          "name": "DivTotalGTimes",
+          "singleValueField": false
+        },
+        {
+          "dataType": "INT",
+          "name": "DivWheelsOffs",
+          "singleValueField": false
+        },
+        {
+          "dataType": "INT",
+          "name": "DivWheelsOns",
+          "singleValueField": false
+        },
+        {
+          "dataType": "INT",
+          "name": "Diverted"
+        },
+        {
+          "dataType": "INT",
+          "name": "FirstDepTime"
+        },
+        {
+          "dataType": "STRING",
+          "name": "FlightDate"
+        },
+        {
+          "dataType": "INT",
+          "name": "FlightNum"
+        },
+        {
+          "dataType": "INT",
+          "name": "Flights"
+        },
+        {
+          "dataType": "INT",
+          "name": "LateAircraftDelay"
+        },
+        {
+          "dataType": "INT",
+          "name": "LongestAddGTime"
+        },
+        {
+          "dataType": "INT",
+          "name": "Month"
+        },
+        {
+          "dataType": "INT",
+          "name": "NASDelay"
+        },
+        {
+          "dataType": "STRING",
+          "name": "Origin"
+        },
+        {
+          "dataType": "INT",
+          "name": "OriginAirportID"
+        },
+        {
+          "dataType": "INT",
+          "name": "OriginAirportSeqID"
+        },
+        {
+          "dataType": "INT",
+          "name": "OriginCityMarketID"
+        },
+        {
+          "dataType": "STRING",
+          "name": "OriginCityName"
+        },
+        {
+          "dataType": "STRING",
+          "name": "OriginState"
+        },
+        {
+          "dataType": "INT",
+          "name": "OriginStateFips"
+        },
+        {
+          "dataType": "STRING",
+          "name": "OriginStateName"
+        },
+        {
+          "dataType": "INT",
+          "name": "OriginWac"
+        },
+        {
+          "dataType": "INT",
+          "name": "Quarter"
+        },
+        {
+          "dataType": "STRING",
+          "name": "RandomAirports",
+          "singleValueField": false
+        },
+        {
+          "dataType": "INT",
+          "name": "SecurityDelay"
+        },
+        {
+          "dataType": "STRING",
+          "name": "TailNum"
+        },
+        {
+          "dataType": "INT",
+          "name": "TaxiIn"
+        },
+        {
+          "dataType": "INT",
+          "name": "TaxiOut"
+        },
+        {
+          "dataType": "INT",
+          "name": "Year"
+        },
+        {
+          "dataType": "INT",
+          "name": "WheelsOn"
+        },
+        {
+          "dataType": "INT",
+          "name": "WheelsOff"
+        },
+        {
+          "dataType": "INT",
+          "name": "WeatherDelay"
+        },
+        {
+          "dataType": "STRING",
+          "name": "UniqueCarrier"
+        },
+        {
+          "dataType": "INT",
+          "name": "TotalAddGTime"
+        },
+        {
+          "dataType": "INT",
+          "name": "DaysSinceEpoch"
+        }
+
+      ],
+      "timeFieldSpec": {
+        "incomingGranularitySpec": {
+          "dataType": "INT",
+          "timeType": "DAYS",
+          "name": "DaysSinceEpoch"
+        },
+        "outgoingGranularitySpec": {
+          "dataType": "LONG",
+          "timeType": "SECONDS",
+          "name": "SecondsSinceEpoch"
+        }
+      },
+      "schemaName": "airlineStats"
+    }
+
 ---
 apiVersion: batch/v1
 kind: Job
@@ -78,7 +425,10 @@ spec:
           args: [ "StreamAvroIntoKafka", "-avroFile", "sample_data/airlineStats_data.avro", "-kafkaTopic", "flights-realtime", "-kafkaBrokerList", "kafka:9092", "-zkAddress", "kafka-zookeeper:2181" ]
         - name: pinot-add-example-schema
           image: winedepot/pinot:0.1.13-SNAPSHOT
-          args: [ "AddSchema", "-schemaFile", "sample_data/airlineStats_schema.json", "-controllerHost", "pinot-controller", "-controllerPort", "9000", "-exec" ]
+          args: [ "AddSchema", "-schemaFile", "/var/pinot/examples/airlineStats_schema.json", "-controllerHost", "pinot-controller", "-controllerPort", "9000", "-exec" ]
+          volumeMounts:
+            - name: examples
+              mountPath: /var/pinot/examples
         - name: pinot-add-example-realtime-table
           image: winedepot/pinot:0.1.13-SNAPSHOT
           args: [ "AddTable", "-filePath", "/var/pinot/examples/airlineStats_realtime_table_config.json", "-controllerHost", "pinot-controller", "-controllerPort", "9000", "-exec" ]
diff --git a/kubernetes/examples/helm/superset.yaml b/kubernetes/examples/helm/superset.yaml
new file mode 100644
index 0000000..91e4630
--- /dev/null
+++ b/kubernetes/examples/helm/superset.yaml
@@ -0,0 +1,2322 @@
+#
+# 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.
+#
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: superset-config
+  namespace: pinot-quickstart
+data:
+  superset_config.py: |-
+    #---------------------------------------------------------
+    # Superset specific config
+    #---------------------------------------------------------
+    ROW_LIMIT = 5000
+
+    SUPERSET_WEBSERVER_PORT = 8088
+    SUPERSET_HOME = '/var/data/superset.db'
+    SUPERSET_ENV = 'production'
+    #---------------------------------------------------------
+
+    #---------------------------------------------------------
+    # Flask App Builder configuration
+    #---------------------------------------------------------
+    # Your App secret key
+    SECRET_KEY = '\2\1thisismyscretkey\1\2\e\y\y\h'
+
+    # The SQLAlchemy connection string to your database backend
+    # This connection defines the path to the database that stores your
+    # superset metadata (slices, connections, tables, dashboards, ...).
+    # Note that the connection information to connect to the datasources
+    # you want to explore are managed directly in the web UI
+    SQLALCHEMY_DATABASE_URI = 'sqlite:////var/data/superset.db'
+
+    # Flask-WTF flag for CSRF
+    WTF_CSRF_ENABLED = True
+    # Add endpoints that need to be exempt from CSRF protection
+    WTF_CSRF_EXEMPT_LIST = []
+    # A CSRF token that expires in 1 year
+    WTF_CSRF_TIME_LIMIT = 60 * 60 * 24 * 365
+
+    # Set this API key to enable Mapbox visualizations
+    MAPBOX_API_KEY = ''
+
+  pinot_example_datasource.yaml: |-
+    databases:
+    - database_name: pinot-quickstart
+      sqlalchemy_uri: pinot+http://pinot-broker:8099/query?server=http://pinot-controller:9000/
+      tables:
+        - columns:
+            - column_name: SecondsSinceEpoch
+              is_dttm: true
+              python_date_format: epoch_s
+              type: LONG
+            - column_name: ArrDel15
+              type: LONG
+            - column_name: DepDel15
+              type: LONG
+            - column_name: ArrTimeBlk
+              type: STRING
+            - column_name: CRSArrTime
+              type: LONG
+            - column_name: DestAirportSeqID
+              type: LONG
+            - column_name: DivAirportSeqIDs
+              type: LONG
+            - column_name: DestAirportID
+              type: LONG
+            - column_name: DivAirportIDs
+              type: LONG
+            - column_name: DivArrDelay
+              type: LONG
+            - column_name: DivActualElapsedTime
+              type: LONG
+            - column_name: ArrivalDelayGroups
+              type: LONG
+            - column_name: OriginAirportSeqID
+              type: LONG
+            - column_name: OriginAirportID
+              type: LONG
+            - column_name: AirlineID
+              type: LONG
+            - column_name: DivAirports
+              type: STRING
+            - column_name: LateAircraftDelay
+              type: LONG
+            - column_name: DivAirportLandings
+              type: LONG
+            - column_name: ArrDelayMinutes
+              type: LONG
+            - column_name: NASDelay
+              type: LONG
+            - column_name: ArrDelay
+              type: LONG
+            - column_name: ActualElapsedTime
+              type: LONG
+            - column_name: LongestAddGTime
+              type: LONG
+            - column_name: TotalAddGTime
+              type: LONG
+            - column_name: RandomAirports
+              type: STRING
+            - column_name: AirTime
+              type: LONG
+            - column_name: ArrTime
+              type: LONG
+            - column_name: DepTimeBlk
+              type: STRING
+            - column_name: CancellationCode
+              type: STRING
+            - column_name: DestCityMarketID
+              type: LONG
+            - column_name: OriginCityMarketID
+              type: LONG
+            - column_name: DestCityName
+              type: STRING
+            - column_name: CRSDepTime
+              type: LONG
+            - column_name: CarrierDelay
+              type: LONG
+            - column_name: CRSElapsedTime
+              type: LONG
+            - column_name: OriginCityName
+              type: STRING
+            - column_name: UniqueCarrier
+              type: STRING
+            - column_name: Carrier
+              type: STRING
+            - column_name: Cancelled
+              type: LONG
+            - column_name: DepartureDelayGroups
+              type: LONG
+            - column_name: DepDelayMinutes
+              type: LONG
+            - column_name: DivReachedDest
+              type: LONG
+            - column_name: DivDistance
+              type: LONG
+            - column_name: DepDelay
+              type: LONG
+            - column_name: DaysSinceEpoch
+              type: LONG
+            - column_name: FlightDate
+              type: STRING
+            - column_name: DestStateFips
+              type: LONG
+            - column_name: FirstDepTime
+              type: LONG
+            - column_name: DivLongestGTimes
+              type: LONG
+            - column_name: DivTotalGTimes
+              type: LONG
+            - column_name: DistanceGroup
+              type: LONG
+            - column_name: DestStateName
+              type: STRING
+            - column_name: DivTailNums
+              type: STRING
+            - column_name: DestState
+              type: STRING
+            - column_name: Dest
+              type: STRING
+            - column_name: DayofMonth
+              type: LONG
+            - column_name: DayOfWeek
+              type: LONG
+            - column_name: DivWheelsOffs
+              type: LONG
+            - column_name: DivWheelsOns
+              type: LONG
+            - column_name: SecurityDelay
+              type: LONG
+            - column_name: DepTime
+              type: LONG
+            - column_name: WeatherDelay
+              type: LONG
+            - column_name: DestWac
+              type: LONG
+            - column_name: Distance
+              type: LONG
+            - column_name: Diverted
+              type: LONG
+            - column_name: FlightNum
+              type: LONG
+            - column_name: OriginStateFips
+              type: LONG
+            - column_name: Flights
+              type: LONG
+            - column_name: TaxiIn
+              type: LONG
+            - column_name: OriginStateName
+              type: STRING
+            - column_name: TailNum
+              type: STRING
+            - column_name: OriginState
+              type: STRING
+            - column_name: Origin
+              type: STRING
+            - column_name: Month
+              type: LONG
+            - column_name: TaxiOut
+              type: LONG
+            - column_name: OriginWac
+              type: LONG
+            - column_name: WheelsOff
+              type: LONG
+            - column_name: WheelsOn
+              type: LONG
+            - column_name: Quarter
+              type: LONG
+            - column_name: Year
+              type: LONG
+          metrics:
+            - expression: COUNT(*)
+              metric_name: count
+              metric_type: count
+              verbose_name: COUNT(*)
+          table_name: airlineStats
+
+  pinot_example_dashboard.json: |-
+    {
+      "dashboards": [
+      {
+        "__Dashboard__": {
+          "css": "",
+          "dashboard_title": "AirlineStats",
+          "description": null,
+          "json_metadata": "{\"remote_id\": 2, \"import_time\": 1572681302, \"filter_immune_slices\": [], \"timed_refresh_immune_slices\": [], \"filter_immune_slice_fields\": {}, \"expanded_slices\": {}, \"refresh_frequency\": 0, \"default_filters\": \"{}\"}",
+          "position_json": "{\"CHART-EPWTG21UAl\":{\"children\":[],\"id\":\"CHART-EPWTG21UAl\",\"meta\":{\"chartId\":2,\"height\":50,\"sliceName\":\"Destination States Flight Time Series\",\"width\":4},\"parents\":[\"ROOT_ID\",\"GRID_ID\",\"ROW-DHJKqb0-2\"],\"type\":\"CHART\"},\"CHART-F0aEdk-eR-\":{\"children\":[],\"id\":\"CHART-F0aEdk-eR-\",\"meta\":{\"chartId\":3,\"height\":50,\"sliceName\":\"Flight Count Per City\",\"width\":4},\"parents\":[\"ROOT_ID\",\"GRID_ID\",\"ROW-DHJKqb0-2\"],\ [...]
+          "slices": [
+          {
+            "__Slice__": {
+              "cache_timeout": null,
+              "datasource_name": "airlineStats",
+              "datasource_type": "table",
+              "id": 1,
+              "params": "{\"adhoc_filters\": [], \"bar_stacked\": false, \"bottom_margin\": \"auto\", \"color_scheme\": \"bnbColors\", \"columns\": [], \"contribution\": false, \"datasource\": \"1__table\", \"granularity_sqla\": null, \"groupby\": [\"DestCityName\"], \"label_colors\": {}, \"metrics\": [\"count\"], \"order_bars\": false, \"reduce_x_ticks\": false, \"row_limit\": 10000, \"show_bar_value\": false, \"show_controls\": false, \"show_legend\": true, \"slice_id\": 1, \"time_grai [...]
+              "slice_name": "Flight Destination City Count",
+              "viz_type": "dist_bar"
+            }
+          },
+          {
+            "__Slice__": {
+              "cache_timeout": null,
+              "datasource_name": "airlineStats",
+              "datasource_type": "table",
+              "id": 2,
+              "params": "{\"adhoc_filters\": [], \"annotation_layers\": [], \"bottom_margin\": \"auto\", \"color_scheme\": \"bnbColors\", \"comparison_type\": \"values\", \"contribution\": false, \"datasource\": \"1__table\", \"granularity_sqla\": \"SecondsSinceEpoch\", \"groupby\": [\"DestStateName\"], \"label_colors\": {}, \"left_margin\": \"auto\", \"line_interpolation\": \"linear\", \"metrics\": [\"count\"], \"order_desc\": true, \"resample_method\": null, \"resample_rule\": null, \" [...]
+              "slice_name": "Destination States Flight Time Series",
+              "viz_type": "line"
+            }
+          },
+          {
+            "__Slice__": {
+              "cache_timeout": null,
+              "datasource_name": "airlineStats",
+              "datasource_type": "table",
+              "id": 3,
+              "params": "{\"adhoc_filters\": [], \"columns\": [], \"combine_metric\": false, \"datasource\": \"1__table\", \"granularity_sqla\": \"SecondsSinceEpoch\", \"groupby\": [\"DestCityName\"], \"metrics\": [\"count\"], \"number_format\": \"SMART_NUMBER\", \"pandas_aggfunc\": \"sum\", \"pivot_margins\": true, \"row_limit\": 50000, \"time_grain_sqla\": \"P1D\", \"time_range\": \"No filter\", \"transpose_pivot\": false, \"url_params\": {}, \"viz_type\": \"pivot_table\", \"remote_id\ [...]
+              "slice_name": "Flight Count Per City",
+              "viz_type": "pivot_table"
+            }
+          }
+          ],
+          "slug": null
+        }
+      }
+      ],
+      "datasources": [
+      {
+        "__SqlaTable__": {
+          "cache_timeout": null,
+          "columns": [
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "ActualElapsedTime",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 1,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "AirTime",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 2,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "AirlineID",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 3,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "ArrDel15",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 4,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "ArrDelay",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 5,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "ArrDelayMinutes",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 6,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "ArrTime",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 7,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "ArrTimeBlk",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 8,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "STRING",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "ArrivalDelayGroups",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 9,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "CRSArrTime",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 10,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "CRSDepTime",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 11,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "CRSElapsedTime",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 12,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "CancellationCode",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 13,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "STRING",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "Cancelled",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 14,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "Carrier",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 15,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "STRING",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "CarrierDelay",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 16,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DayOfWeek",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 17,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DayofMonth",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 18,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DepDel15",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 19,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DepDelay",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 20,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DepDelayMinutes",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 21,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DepTime",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 22,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DepTimeBlk",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 23,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "STRING",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DepartureDelayGroups",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 24,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "Dest",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 25,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "STRING",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DestAirportID",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 26,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DestAirportSeqID",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 27,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DestCityMarketID",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 28,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DestCityName",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 29,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "STRING",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DestState",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 30,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "STRING",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DestStateFips",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 31,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DestStateName",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 32,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "STRING",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DestWac",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 33,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "Distance",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 34,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DistanceGroup",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 35,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DivActualElapsedTime",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 36,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DivAirportIDs",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 37,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DivAirportLandings",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 38,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DivAirportSeqIDs",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 39,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DivAirports",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 40,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "STRING",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DivArrDelay",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 41,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DivDistance",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 42,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DivLongestGTimes",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 43,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DivReachedDest",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 44,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DivTailNums",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 45,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "STRING",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DivTotalGTimes",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 46,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DivWheelsOffs",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 47,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DivWheelsOns",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 48,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "Diverted",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 49,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "FirstDepTime",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 50,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "FlightDate",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 51,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "STRING",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "FlightNum",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 52,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "Flights",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 53,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "LateAircraftDelay",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 54,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "LongestAddGTime",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 55,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "Month",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 56,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "NASDelay",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 57,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "Origin",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 58,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "STRING",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "OriginAirportID",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 59,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "OriginAirportSeqID",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 60,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "OriginCityMarketID",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 61,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "OriginCityName",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 62,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "STRING",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "OriginState",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 63,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "STRING",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "OriginStateFips",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 64,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "OriginStateName",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 65,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "STRING",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "OriginWac",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 66,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "Quarter",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 67,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "RandomAirports",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 68,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "STRING",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "SecurityDelay",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 69,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "TailNum",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 70,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "STRING",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "TaxiIn",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 71,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "TaxiOut",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 72,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "Year",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 73,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "WheelsOn",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 74,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "WheelsOff",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 75,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "WeatherDelay",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 76,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "UniqueCarrier",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 77,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "STRING",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "TotalAddGTime",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 78,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "DaysSinceEpoch",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 79,
+              "is_active": true,
+              "is_dttm": false,
+              "python_date_format": null,
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          },
+          {
+            "__TableColumn__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "column_name": "SecondsSinceEpoch",
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "description": null,
+              "expression": null,
+              "filterable": true,
+              "groupby": true,
+              "id": 80,
+              "is_active": true,
+              "is_dttm": true,
+              "python_date_format": "epoch_s",
+              "table_id": 1,
+              "type": "LONG",
+              "verbose_name": null
+            }
+          }
+          ],
+          "database_id": 3,
+          "default_endpoint": null,
+          "description": null,
+          "fetch_values_predicate": null,
+          "filter_select_enabled": false,
+          "main_dttm_col": null,
+          "metrics": [
+          {
+            "__SqlMetric__": {
+              "changed_by_fk": 1,
+              "changed_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "created_by_fk": 1,
+              "created_on": {
+                "__datetime__": "2019-11-02T07:55:02"
+              },
+              "d3format": null,
+              "description": null,
+              "expression": "COUNT(*)",
+              "id": 1,
+              "is_restricted": false,
+              "metric_name": "count",
+              "metric_type": "count",
+              "table_id": 1,
+              "verbose_name": "COUNT(*)",
+              "warning_text": null
+            }
+          }
+          ],
+          "offset": 0,
+          "params": "{\"remote_id\": 1, \"database_name\": \"pinot-quickstart\", \"import_time\": 1572681302}",
+          "schema": null,
+          "sql": null,
+          "table_name": "airlineStats",
+          "template_params": null
+        }
+      }
+      ]
+    }
+
+---
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+  name: superset
+  namespace: pinot-quickstart
+spec:
+  selector:
+    matchLabels:
+      app: superset
+  serviceName: superset
+  replicas: 1
+  updateStrategy:
+    type: RollingUpdate
+  podManagementPolicy: Parallel
+  template:
+    metadata:
+      labels:
+        app: superset
+    spec:
+      terminationGracePeriodSeconds: 30
+      securityContext:
+        runAsGroup: 1000
+        fsGroup: 1000
+      containers:
+        - image: fx19880617/superset:0.34.1
+          imagePullPolicy: Always
+          name: superset
+          ports:
+            - containerPort: 8088
+              protocol: TCP
+          resources:
+            requests:
+              memory: 1Gi
+          volumeMounts:
+            - name: superset-storage-vol
+              mountPath: "/var/data"
+            - name: superset-config
+              mountPath: "/etc/superset"
+      nodeSelector: {}
+      restartPolicy: Always
+      volumes:
+        - name: superset-config
+          configMap:
+            name: superset-config
+  volumeClaimTemplates:
+    - metadata:
+        name: superset-storage-vol
+        annotations:
+          pv.beta.kubernetes.io/gid: "1000"
+          pv.beta.kubernetes.io/groups: "1000"
+      spec:
+        accessModes:
+          - ReadWriteOnce
+        storageClassName: "standard"
+        resources:
+          requests:
+            storage: 1Gi
+
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: superset
+  namespace: pinot-quickstart
+spec:
+  ports:
+    # [podname].superset.pinot-quickstart.svc.cluster.local
+    - port: 8088
+  clusterIP: None
+  selector:
+    app: superset


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org