From c5678d2299563c79efff9031c206da8956fd7dc7 Mon Sep 17 00:00:00 2001 From: liyuan <84758614+nvliyuan@users.noreply.github.com> Date: Thu, 11 May 2023 14:35:18 +0800 Subject: [PATCH 01/12] update snapshot version to v2306 (#291) * update snapshot version Signed-off-by: liyuan * revert changes for PCA demo Signed-off-by: liyuan * update udf version Signed-off-by: liyuan --------- Signed-off-by: liyuan --- examples/UDF-Examples/RAPIDS-accelerated-UDFs/pom.xml | 4 ++-- .../RAPIDS-accelerated-UDFs/src/main/cpp/CMakeLists.txt | 8 ++++---- examples/UDF-Examples/Spark-cuSpatial/Dockerfile.awsdb | 2 +- examples/UDF-Examples/Spark-cuSpatial/gpu-run.sh | 2 +- examples/UDF-Examples/Spark-cuSpatial/pom.xml | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/UDF-Examples/RAPIDS-accelerated-UDFs/pom.xml b/examples/UDF-Examples/RAPIDS-accelerated-UDFs/pom.xml index 86fe01fde..e4440ac14 100644 --- a/examples/UDF-Examples/RAPIDS-accelerated-UDFs/pom.xml +++ b/examples/UDF-Examples/RAPIDS-accelerated-UDFs/pom.xml @@ -25,7 +25,7 @@ user defined functions for use with the RAPIDS Accelerator for Apache Spark - 23.04.0-SNAPSHOT + 23.06.0-SNAPSHOT 1.8 @@ -37,7 +37,7 @@ cuda11 2.12 - 23.04.0-SNAPSHOT + 23.06.0-SNAPSHOT 3.1.1 2.12.15 ${project.build.directory}/cpp-build diff --git a/examples/UDF-Examples/RAPIDS-accelerated-UDFs/src/main/cpp/CMakeLists.txt b/examples/UDF-Examples/RAPIDS-accelerated-UDFs/src/main/cpp/CMakeLists.txt index 88b60addd..f03f2d8b4 100755 --- a/examples/UDF-Examples/RAPIDS-accelerated-UDFs/src/main/cpp/CMakeLists.txt +++ b/examples/UDF-Examples/RAPIDS-accelerated-UDFs/src/main/cpp/CMakeLists.txt @@ -16,7 +16,7 @@ cmake_minimum_required(VERSION 3.23.1 FATAL_ERROR) -file(DOWNLOAD https://raw.githubusercontent.com/rapidsai/rapids-cmake/branch-23.04/RAPIDS.cmake +file(DOWNLOAD https://raw.githubusercontent.com/rapidsai/rapids-cmake/branch-23.06/RAPIDS.cmake ${CMAKE_BINARY_DIR}/RAPIDS.cmake) include(${CMAKE_BINARY_DIR}/RAPIDS.cmake) @@ -32,7 +32,7 @@ if(DEFINED GPU_ARCHS) endif() rapids_cuda_init_architectures(UDFEXAMPLESJNI) -project(UDFEXAMPLESJNI VERSION 23.04.0 LANGUAGES C CXX CUDA) +project(UDFEXAMPLESJNI VERSION 23.06.0 LANGUAGES C CXX CUDA) option(PER_THREAD_DEFAULT_STREAM "Build with per-thread default stream" OFF) option(BUILD_UDF_BENCHMARKS "Build the benchmarks" OFF) @@ -84,10 +84,10 @@ set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -w --expt-extended-lambda --expt-relax set(CUDA_USE_STATIC_CUDA_RUNTIME OFF) rapids_cpm_init() -rapids_cpm_find(cudf 23.04.00 +rapids_cpm_find(cudf 23.06.00 CPM_ARGS GIT_REPOSITORY https://github.com/rapidsai/cudf.git - GIT_TAG branch-23.04 + GIT_TAG branch-23.06 GIT_SHALLOW TRUE SOURCE_SUBDIR cpp OPTIONS "BUILD_TESTS OFF" diff --git a/examples/UDF-Examples/Spark-cuSpatial/Dockerfile.awsdb b/examples/UDF-Examples/Spark-cuSpatial/Dockerfile.awsdb index cb238d440..39a6e736a 100644 --- a/examples/UDF-Examples/Spark-cuSpatial/Dockerfile.awsdb +++ b/examples/UDF-Examples/Spark-cuSpatial/Dockerfile.awsdb @@ -48,7 +48,7 @@ RUN wget -q https://repo.continuum.io/miniconda/Miniconda3-py38_4.9.2-Linux-x86_ conda config --system --set always_yes True && \ conda clean --all -RUN conda install -c rapidsai-nightly -c nvidia -c conda-forge -c defaults libcuspatial=23.04 +RUN conda install -c rapidsai-nightly -c nvidia -c conda-forge -c defaults libcuspatial=23.06 RUN conda install -c conda-forge libgdal==3.3.1 RUN pip install jupyter ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk-amd64 diff --git a/examples/UDF-Examples/Spark-cuSpatial/gpu-run.sh b/examples/UDF-Examples/Spark-cuSpatial/gpu-run.sh index 5a3a91265..deb093342 100755 --- a/examples/UDF-Examples/Spark-cuSpatial/gpu-run.sh +++ b/examples/UDF-Examples/Spark-cuSpatial/gpu-run.sh @@ -31,7 +31,7 @@ rm -rf $DATA_OUT_PATH # the path to keep the jars of spark-rapids & spark-cuspatial JARS=$ROOT_PATH/jars -JARS_PATH=${JARS_PATH:-$JARS/rapids-4-spark_2.12-23.04.0-SNAPSHOT.jar,$JARS/spark-cuspatial-23.04.0-SNAPSHOT.jar} +JARS_PATH=${JARS_PATH:-$JARS/rapids-4-spark_2.12-23.06.0-SNAPSHOT.jar,$JARS/spark-cuspatial-23.06.0-SNAPSHOT.jar} $SPARK_HOME/bin/spark-submit --master spark://$HOSTNAME:7077 \ --name "Gpu Spatial Join UDF" \ diff --git a/examples/UDF-Examples/Spark-cuSpatial/pom.xml b/examples/UDF-Examples/Spark-cuSpatial/pom.xml index 1eddb8909..729787eb2 100644 --- a/examples/UDF-Examples/Spark-cuSpatial/pom.xml +++ b/examples/UDF-Examples/Spark-cuSpatial/pom.xml @@ -24,13 +24,13 @@ UDF of the cuSpatial case for the RAPIDS Accelerator The RAPIDS accelerated user defined function of the cuSpatial case for use with the RAPIDS Accelerator for Apache Spark - 23.04.0-SNAPSHOT + 23.06.0-SNAPSHOT 1.8 1.8 8 - 23.04.0-SNAPSHOT + 23.06.0-SNAPSHOT 2.12 3.2.0 ${project.build.directory}/cpp-build From a2efeaaa79f7589b272fab62602008f5436b4d65 Mon Sep 17 00:00:00 2001 From: Bobby Wang Date: Mon, 15 May 2023 13:00:18 +0800 Subject: [PATCH 02/12] update xgb dep to the latest (#292) Signed-off-by: Bobby Wang --- examples/XGBoost-Examples/pom.xml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/examples/XGBoost-Examples/pom.xml b/examples/XGBoost-Examples/pom.xml index d6977f8c5..fccdd9891 100644 --- a/examples/XGBoost-Examples/pom.xml +++ b/examples/XGBoost-Examples/pom.xml @@ -38,7 +38,7 @@ UTF-8 - 1.7.1 + 2.0.0-SNAPSHOT 3.1.1 2.12.8 2.12 @@ -144,4 +144,13 @@ + + + + XGBoost4J Snapshot Repo + XGBoost4J Snapshot Repo + https://s3-us-west-2.amazonaws.com/xgboost-maven-repo/snapshot/ + + + From c6cd2d56bd578110867ad8ea4d6a45cd458afc46 Mon Sep 17 00:00:00 2001 From: eordentlich Date: Sun, 14 May 2023 23:28:36 -0700 Subject: [PATCH 03/12] update pip index for cudf (#294) * update pip index for cudf Signed-off-by: Erik Ordentlich * fix broken links Signed-off-by: Erik Ordentlich --------- Signed-off-by: Erik Ordentlich --- docs/get-started/xgboost-examples/csp/dataproc/gcp.md | 8 ++++---- .../xgboost-examples/notebook/python-notebook.md | 2 +- .../xgboost-examples/on-prem-cluster/standalone-python.md | 4 ++-- .../xgboost-examples/on-prem-cluster/yarn-python.md | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/get-started/xgboost-examples/csp/dataproc/gcp.md b/docs/get-started/xgboost-examples/csp/dataproc/gcp.md index f48ad2895..52539aba4 100644 --- a/docs/get-started/xgboost-examples/csp/dataproc/gcp.md +++ b/docs/get-started/xgboost-examples/csp/dataproc/gcp.md @@ -45,7 +45,7 @@ If you'd like to further accelerate init time to 4-5 minutes, create a custom Da ## Get Application Files, Jar and Dataset -Bash into the master node and make sure you have prepared the necessary packages and dataset by following this [guide](/docs/get-started/xgboost-examples/prepare-package-data/preparation-python.md). +Bash into the master node and make sure you have prepared the necessary packages and dataset by following this [guide](../../prepare-package-data/preparation-python.md). Note: Since there is no maven CLI in master node, so we need to manually install. ``` bash @@ -64,11 +64,11 @@ Then create a directory in HDFS, and run below commands, Please make sure to install the XGBoost, cudf-cu11, numpy libraries on all nodes before running XGBoost application. ``` bash pip install xgboost -pip install cudf-cu11 --extra-index-url=https://pypi.ngc.nvidia.com +pip install cudf-cu11 --extra-index-url=https://pypi.nvidia.com pip install numpy pip install scikit-learn ``` -You can also create an isolated python environment by using (Virtualenv)[https://virtualenv.pypa.io/en/latest/], +You can also create an isolated python environment by using [Virtualenv](https://virtualenv.pypa.io/en/latest/), and then directly pass/unpack the archive file and enable the environment on executors by leveraging the --archives option or spark.archives configuration. ``` bash @@ -76,7 +76,7 @@ by leveraging the --archives option or spark.archives configuration. python -m venv pyspark_venv source pyspark_venv/bin/activate pip install xgboost -pip install cudf-cu11 --extra-index-url=https://pypi.ngc.nvidia.com +pip install cudf-cu11 --extra-index-url=https://pypi.nvidia.com pip install numpy pip install scikit-learn pip install venv-pack diff --git a/docs/get-started/xgboost-examples/notebook/python-notebook.md b/docs/get-started/xgboost-examples/notebook/python-notebook.md index e00d3622f..551a37c79 100644 --- a/docs/get-started/xgboost-examples/notebook/python-notebook.md +++ b/docs/get-started/xgboost-examples/notebook/python-notebook.md @@ -16,7 +16,7 @@ and the home directory for Apache Spark respectively. 2. Prepare packages and dataset. - Make sure you have prepared the necessary packages and dataset by following this [guide](/docs/get-started/xgboost-examples/prepare-package-data/preparation-python.md) + Make sure you have prepared the necessary packages and dataset by following this [guide](../prepare-package-data/preparation-python.md) 3. Launch the notebook: diff --git a/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md b/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md index 597669665..70de42c19 100644 --- a/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md +++ b/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md @@ -53,7 +53,7 @@ And here are the steps to enable the GPU resources discovery for Spark 3.1+. ``` bash pip install xgboost -pip install cudf-cu11 --extra-index-url=https://pypi.ngc.nvidia.com +pip install cudf-cu11 --extra-index-url=https://pypi.nvidia.com pip install numpy pip install scikit-learn ``` @@ -61,7 +61,7 @@ pip install scikit-learn Get Application Files, Jar and Dataset ------------------------------- -Make sure you have prepared the necessary packages and dataset by following this [guide](/docs/get-started/xgboost-examples/prepare-package-data/preparation-python.md) +Make sure you have prepared the necessary packages and dataset by following this [guide](../prepare-package-data/preparation-python.md) #### Note: diff --git a/docs/get-started/xgboost-examples/on-prem-cluster/yarn-python.md b/docs/get-started/xgboost-examples/on-prem-cluster/yarn-python.md index 288b354a1..b5565d023 100644 --- a/docs/get-started/xgboost-examples/on-prem-cluster/yarn-python.md +++ b/docs/get-started/xgboost-examples/on-prem-cluster/yarn-python.md @@ -37,11 +37,11 @@ please refer to [here](https://hadoop.apache.org/docs/r3.1.0/hadoop-yarn/hadoop- Please make sure to install the XGBoost, cudf-cu11, numpy libraries on all nodes before running XGBoost application. ``` bash pip install xgboost -pip install cudf-cu11 --extra-index-url=https://pypi.ngc.nvidia.com +pip install cudf-cu11 --extra-index-url=https://pypi.nvidia.com pip install numpy pip install scikit-learn ``` -You can also create an isolated python environment by using (Virtualenv)[https://virtualenv.pypa.io/en/latest/], +You can also create an isolated python environment by using [Virtualenv](https://virtualenv.pypa.io/en/latest/), and then directly pass/unpack the archive file and enable the environment on executors by leveraging the --archives option or spark.archives configuration. ``` bash @@ -49,7 +49,7 @@ by leveraging the --archives option or spark.archives configuration. python -m venv pyspark_venv source pyspark_venv/bin/activate pip install xgboost -pip install cudf-cu11 --extra-index-url=https://pypi.ngc.nvidia.com +pip install cudf-cu11 --extra-index-url=https://pypi.nvidia.com pip install numpy pip install scikit-learn venv-pack -o pyspark_venv.tar.gz @@ -63,7 +63,7 @@ spark-submit --archives pyspark_venv.tar.gz#environment app.py Get Application Files, Jar and Dataset ------------------------------- -Make sure you have prepared the necessary packages and dataset by following this [guide](/docs/get-started/xgboost-examples/prepare-package-data/preparation-python.md) +Make sure you have prepared the necessary packages and dataset by following this [guide](../prepare-package-data/preparation-python.md) Then create a directory in HDFS, and run below commands, From dd10170c8ef9862017c23b43b634ed239d64987c Mon Sep 17 00:00:00 2001 From: Bobby Wang Date: Tue, 16 May 2023 05:34:52 +0800 Subject: [PATCH 04/12] Change the rabit tracker config accordingly (#295) Signed-off-by: Bobby Wang --- .../src/com/nvidia/spark/examples/utility/XGBoostArgs.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/XGBoost-Examples/utility/scala/src/com/nvidia/spark/examples/utility/XGBoostArgs.scala b/examples/XGBoost-Examples/utility/scala/src/com/nvidia/spark/examples/utility/XGBoostArgs.scala index a77a60add..5caf438e9 100644 --- a/examples/XGBoost-Examples/utility/scala/src/com/nvidia/spark/examples/utility/XGBoostArgs.scala +++ b/examples/XGBoost-Examples/utility/scala/src/com/nvidia/spark/examples/utility/XGBoostArgs.scala @@ -202,7 +202,7 @@ class XGBoostArgs private[utility] ( val hostIp = params.getOrElse("rabit_tracker_host", "").toString if (!hostIp.isEmpty) { - params ++ Map("tracker_conf" -> TrackerConf(0l, "python", hostIp)) + params ++ Map("tracker_conf" -> TrackerConf(0l, hostIp)) } else params } From f538775a652c3488b026990458c8ad3c7059697c Mon Sep 17 00:00:00 2001 From: liyuan <84758614+nvliyuan@users.noreply.github.com> Date: Fri, 19 May 2023 18:19:24 +0800 Subject: [PATCH 05/12] cmake build fail issue (#296) Signed-off-by: liyuan --- examples/UDF-Examples/RAPIDS-accelerated-UDFs/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/UDF-Examples/RAPIDS-accelerated-UDFs/pom.xml b/examples/UDF-Examples/RAPIDS-accelerated-UDFs/pom.xml index e4440ac14..d85b8ef3a 100644 --- a/examples/UDF-Examples/RAPIDS-accelerated-UDFs/pom.xml +++ b/examples/UDF-Examples/RAPIDS-accelerated-UDFs/pom.xml @@ -43,7 +43,7 @@ ${project.build.directory}/cpp-build OFF - ALL + RAPIDS ON 10 OFF From 6a85d43a08598bc25947d3b938233a19e2b44a9b Mon Sep 17 00:00:00 2001 From: Bobby Wang Date: Mon, 22 May 2023 17:51:45 +0800 Subject: [PATCH 06/12] update xgb dep to the latest (#298) Signed-off-by: Bobby Wang --- examples/XGBoost-Examples/pom.xml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/examples/XGBoost-Examples/pom.xml b/examples/XGBoost-Examples/pom.xml index d6977f8c5..fccdd9891 100644 --- a/examples/XGBoost-Examples/pom.xml +++ b/examples/XGBoost-Examples/pom.xml @@ -38,7 +38,7 @@ UTF-8 - 1.7.1 + 2.0.0-SNAPSHOT 3.1.1 2.12.8 2.12 @@ -144,4 +144,13 @@ + + + + XGBoost4J Snapshot Repo + XGBoost4J Snapshot Repo + https://s3-us-west-2.amazonaws.com/xgboost-maven-repo/snapshot/ + + + From cb716c895d8eebcaff91a3b46fb21ea0af5e4dfb Mon Sep 17 00:00:00 2001 From: Lee Yang Date: Mon, 22 May 2023 10:55:59 -0700 Subject: [PATCH 07/12] End-to-end example for DL training and inference using Spark 3.4 APIs (#293) add e2e example for DL training and inference Signed-off-by: Lee Yang --- .../Spark-DL/train_inference_e2e/README.md | 29 + .../Spark-DL/train_inference_e2e/init.sh | 15 + .../train_inference_e2e/spark_e2e.ipynb | 1268 +++++++++++++++++ 3 files changed, 1312 insertions(+) create mode 100644 examples/ML+DL-Examples/Spark-DL/train_inference_e2e/README.md create mode 100755 examples/ML+DL-Examples/Spark-DL/train_inference_e2e/init.sh create mode 100644 examples/ML+DL-Examples/Spark-DL/train_inference_e2e/spark_e2e.ipynb diff --git a/examples/ML+DL-Examples/Spark-DL/train_inference_e2e/README.md b/examples/ML+DL-Examples/Spark-DL/train_inference_e2e/README.md new file mode 100644 index 000000000..cfeb024aa --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/train_inference_e2e/README.md @@ -0,0 +1,29 @@ +# Spark DL Training and Inference + +This example is based on the [distributed training example](https://docs.databricks.com/machine-learning/train-model/distributed-training/spark-pytorch-distributor.html#end-to-end-distributed-training-on-databricks-notebook) from Databricks, with additional code to demonstrate: +- how to access datasets on a distributed store, like S3, using Petastorm and/or NVTabular. +- how to conduct parallel inference of a DL model on a Spark cluster, using a new API introduced in Spark 3.4. + +## Run example in Databricks +- Create an AWS S3 bucket to hold the dataset +- Create an AWS IAM User with access keys for the S3 bucket +- Add the AWS secrets to the [Databricks Secrets](https://docs.databricks.com/security/secrets/secrets.html) store using the [databricks CLI](https://docs.databricks.com/dev-tools/cli/index.html) + ``` + databricks secrets create-scope --scope aws-s3 + databricks secrets put --scope aws-s3 --key aws-access-key + databricks secrets put --scope aws-s3 --key aws-secret-key + ``` + **NOTE**: Do not hard-code the values of the secrets anywhere and avoid accidental logging of the values. + +- Copy the [init.sh](./init.sh) script to DBFS using the + ``` + databricks fs cp init.sh dbfs:/path/to/init.sh + ``` +- Create a multi-node Databricks cluster with the following configuration: + - Databricks Runtime Versions: `13.1 ML GPU Runtime` + - Worker type: `g4dn.xlarge` (x2) + - Driver type: `same as worker` + - Advanced options -> Init Scripts: `dbfs:/path/to/init.sh` +- Start the cluster +- Import the notebook into your Databricks workspace +- Attach the cluster to your notebook and run the notebook diff --git a/examples/ML+DL-Examples/Spark-DL/train_inference_e2e/init.sh b/examples/ML+DL-Examples/Spark-DL/train_inference_e2e/init.sh new file mode 100755 index 000000000..7800b2130 --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/train_inference_e2e/init.sh @@ -0,0 +1,15 @@ +!/bin/bash + +# install dependencies for petastorm and nvtabular data loaders +/databricks/python/bin/pip install cudf-cu11 dask-cudf-cu11 --extra-index-url=https://pypi.nvidia.com +/databricks/python/bin/pip install \ + merlin-dataloader \ + nvtabular \ + "numpy<1.24" \ + "protobuf<3.20" \ + "pyarrow==10.0.1" \ + s3fs \ + tritonclient + +# https://stackoverflow.com/questions/71759248/importerror-cannot-import-name-builder-from-google-protobuf-internal +wget https://raw.githubusercontent.com/protocolbuffers/protobuf/main/python/google/protobuf/internal/builder.py -O /databricks/python/lib/python3.10/site-packages/google/protobuf/internal/builder.py diff --git a/examples/ML+DL-Examples/Spark-DL/train_inference_e2e/spark_e2e.ipynb b/examples/ML+DL-Examples/Spark-DL/train_inference_e2e/spark_e2e.ipynb new file mode 100644 index 000000000..61bcda00f --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/train_inference_e2e/spark_e2e.ipynb @@ -0,0 +1,1268 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "18a99ee7-1b0d-447b-a27c-b46b0903af68", + "showTitle": false, + "title": "" + } + }, + "source": [ + "# Distributed Training and Inference with Spark 3.4\n", + "\n", + "Based on: https://docs.databricks.com/machine-learning/train-model/distributed-training/spark-pytorch-distributor.html#end-to-end-distributed-training-on-databricks-notebook" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "473535d4-472c-483f-897a-2a696f237989", + "showTitle": false, + "title": "" + } + }, + "source": [ + "## Setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "8abda0c7-147e-4485-afc6-6d16ac84ddb1", + "showTitle": false, + "title": "" + } + }, + "outputs": [], + "source": [ + "access_key = dbutils.secrets.get(scope=\"aws-s3\", key = \"aws-access-key\")\n", + "secret_key = dbutils.secrets.get(scope=\"aws-s3\", key = \"aws-secret-key\")\n", + "sc._jsc.hadoopConfiguration().set(\"fs.s3a.access.key\", access_key)\n", + "sc._jsc.hadoopConfiguration().set(\"fs.s3a.secret.key\", secret_key)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "b0c52671-2deb-4e9f-980d-a321fb586e8d", + "showTitle": false, + "title": "" + } + }, + "outputs": [], + "source": [ + "S3_BUCKET=\"s3a://path/to/bucket\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "a505372a-d7f5-469c-8f17-15376fecc077", + "showTitle": false, + "title": "" + } + }, + "source": [ + "### Define Model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "81ef8262-a624-4f9e-81ea-9f193e224f91", + "showTitle": false, + "title": "" + } + }, + "outputs": [], + "source": [ + "import os\n", + "import torch\n", + "import torch.nn as nn\n", + "import torch.nn.functional as F\n", + "import torch.optim as optim\n", + "from time import time\n", + "from torchvision import datasets, transforms\n", + "\n", + "PYTORCH_DIR = \"/dbfs/ml/pytorch\"\n", + "os.environ[\"TORCH_HOME\"] = PYTORCH_DIR\n", + "\n", + "batch_size = 100\n", + "num_epochs = 5\n", + "momentum = 0.5\n", + "log_interval = 100\n", + "learning_rate = 0.001\n", + "\n", + "\n", + "# Model definition\n", + "class Net(nn.Module):\n", + " def __init__(self):\n", + " super(Net, self).__init__()\n", + " self.conv1 = nn.Conv2d(1, 10, kernel_size=5)\n", + " self.conv2 = nn.Conv2d(10, 20, kernel_size=5)\n", + " self.conv2_drop = nn.Dropout2d()\n", + " self.fc1 = nn.Linear(320, 50)\n", + " self.fc2 = nn.Linear(50, 10)\n", + "\n", + " def forward(self, x):\n", + " x = F.relu(F.max_pool2d(self.conv1(x), 2))\n", + " x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))\n", + " x = x.view(-1, 320)\n", + " x = F.relu(self.fc1(x))\n", + " x = F.dropout(x, training=self.training)\n", + " x = self.fc2(x)\n", + " return F.log_softmax(x, dim=-1)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "8accd126-2ac5-41d6-a53f-18d53ef91e3d", + "showTitle": false, + "title": "" + } + }, + "source": [ + "### Define Common Functions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "9aa51c1b-d55e-4718-8e35-0773de29e1f9", + "showTitle": false, + "title": "" + } + }, + "outputs": [], + "source": [ + "def prepare_batch(batch):\n", + " # shim to allow transforming the output of the data loader in Advanced section below\n", + " # pass-through by default\n", + " return batch\n", + "\n", + "def train_one_epoch(model, device, data_loader, optimizer, epoch, prepare_batch):\n", + " model.train()\n", + " for batch_idx, batch in enumerate(data_loader):\n", + " data, target = prepare_batch(batch) # added prepare_batch for advanced data loading\n", + " data, target = data.to(device), target.to(device)\n", + " optimizer.zero_grad()\n", + " output = model(data)\n", + " loss = F.nll_loss(output, target)\n", + " loss.backward()\n", + " optimizer.step()\n", + " if batch_idx % log_interval == 0:\n", + " print(\n", + " \"Train Epoch: {} [{}]\\tLoss: {:.6f}\".format(\n", + " epoch,\n", + " batch_idx * len(data),\n", + " loss.item(),\n", + " )\n", + " )\n", + "\n", + "\n", + "def save_checkpoint(log_dir, model, optimizer, epoch):\n", + " filepath = log_dir + \"/checkpoint-{epoch}.pth.tar\".format(epoch=epoch)\n", + " state = {\n", + " \"model\": model.module.state_dict(),\n", + " \"optimizer\": optimizer.state_dict(),\n", + " }\n", + " torch.save(state, filepath)\n", + "\n", + "\n", + "def load_checkpoint(log_dir, epoch=num_epochs):\n", + " filepath = log_dir + \"/checkpoint-{epoch}.pth.tar\".format(epoch=epoch)\n", + " return torch.load(filepath)\n", + "\n", + "\n", + "def create_log_dir():\n", + " log_dir = os.path.join(PYTORCH_DIR, str(time()))\n", + " os.makedirs(log_dir)\n", + " return log_dir" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "3fc950d9-72c4-4b46-a23f-a4912132aa1a", + "showTitle": false, + "title": "" + } + }, + "source": [ + "## Distributed Training" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "772ce27d-ed0c-4909-b41f-31f60d0a9d0d", + "showTitle": false, + "title": "" + } + }, + "source": [ + "### Main Function\n", + "\n", + "The [conversion steps](https://pytorch.org/tutorials/intermediate/ddp_series_multinode.html) from single-node to distributed are highlighted in comments below.\n", + "\n", + "**Note**: the data loaders have been factored out, so we can swap in different implementations in the \"Advanced\" section below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "64fef046-c79e-4db0-b413-68d41a487374", + "showTitle": false, + "title": "" + } + }, + "outputs": [], + "source": [ + "def main_fn(directory):\n", + " #### Added Torch Distributed imports ####\n", + " import torch.distributed as dist\n", + " from torch.nn.parallel import DistributedDataParallel as DDP\n", + "\n", + " print(\"Running distributed training\")\n", + " dist.init_process_group(\"nccl\")\n", + "\n", + " local_rank = int(os.environ[\"LOCAL_RANK\"])\n", + " global_rank = int(os.environ[\"RANK\"])\n", + " world_size = int(os.environ[\"WORLD_SIZE\"])\n", + "\n", + " #### Adjust batch size per worker ####\n", + " adjusted_batch_size = batch_size // world_size\n", + " print(f\"{adjusted_batch_size=}\")\n", + "\n", + " if global_rank == 0:\n", + " train_parameters = {\n", + " \"batch_size\": adjusted_batch_size,\n", + " \"epochs\": num_epochs,\n", + " \"trainer\": \"TorchDistributor\",\n", + " }\n", + "\n", + " model = Net().to(local_rank)\n", + " #### Added Distributed Model ####\n", + " ddp_model = DDP(model, device_ids=[local_rank], output_device=local_rank)\n", + "\n", + " optimizer = optim.SGD(ddp_model.parameters(), lr=learning_rate, momentum=momentum)\n", + " for epoch in range(1, num_epochs + 1):\n", + " # train data_loader\n", + " data_loader = get_train_dataloader(adjusted_batch_size)\n", + "\n", + " train_one_epoch(ddp_model, local_rank, data_loader, optimizer, epoch, prepare_batch)\n", + "\n", + " if global_rank == 0:\n", + " save_checkpoint(directory, ddp_model, optimizer, epoch)\n", + "\n", + " if global_rank == 0:\n", + " ddp_model.eval()\n", + "\n", + " # test data_loader\n", + " data_loader = get_test_dataloader(batch_size)\n", + "\n", + " test_loss = 0\n", + " num_batches = 0\n", + " for batch in data_loader:\n", + " data, target = prepare_batch(batch)\n", + " device = torch.device(\"cuda\")\n", + " data, target = data.to(device), target.to(device)\n", + " output = ddp_model(data)\n", + " test_loss += F.nll_loss(output, target)\n", + " num_batches += 1\n", + "\n", + " test_loss /= num_batches\n", + " print(\"Average test loss: {}\".format(test_loss.item()))\n", + "\n", + " dist.destroy_process_group()\n", + "\n", + " return \"finished\" # can return any picklable object" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "129e940f-3b35-457e-9727-3caa3de34baf", + "showTitle": false, + "title": "" + } + }, + "source": [ + "### Torch Datasets Data Loader\n", + "This example just downloads the MNIST dataset to each worker and then uses the Torch DistributedSampler to shard the data.\n", + "\n", + "**Note**: that this only works if the dataset is small enough to be downloaded to each worker. For larger datasets, see the \"Advanced\" section below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "5def7d8d-69f9-47ca-8a21-ba31a9a4b6a9", + "showTitle": false, + "title": "" + } + }, + "outputs": [], + "source": [ + "def get_train_dataloader(batch_size, distributed=True):\n", + " if distributed:\n", + " from torch.utils.data.distributed import DistributedSampler\n", + "\n", + " train_dataset = datasets.MNIST(\n", + " \"data\",\n", + " train=True,\n", + " download=True,\n", + " transform=transforms.Compose(\n", + " [transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]\n", + " ),\n", + " )\n", + " \n", + " #### Added Distributed Dataloader ####\n", + " train_sampler = DistributedSampler(train_dataset) if distributed else None\n", + " data_loader = torch.utils.data.DataLoader(\n", + " train_dataset, batch_size=batch_size, sampler=train_sampler\n", + " )\n", + " return data_loader\n", + "\n", + "def get_test_dataloader(batch_size):\n", + " test_dataset = datasets.MNIST(\n", + " \"data\",\n", + " train=False,\n", + " download=True,\n", + " transform=transforms.Compose(\n", + " [transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]\n", + " ),\n", + " )\n", + " data_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size) \n", + " return data_loader" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "50af6897-8441-471e-bc76-513008b964f2", + "showTitle": false, + "title": "" + } + }, + "source": [ + "### Train with TorchDistributor\n", + "See: https://spark.apache.org/docs/latest//api/python/reference/api/pyspark.ml.torch.distributor.TorchDistributor.html" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "ffee450c-b4b7-4606-8d02-29807a5535e4", + "showTitle": false, + "title": "" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Log directory: /dbfs/ml/pytorch/1683755013.639396\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Started distributed training with 2 executor proceses\n", + "Running distributed training\n", + "Running distributed training\n", + "adjusted_batch_size=50\n", + "adjusted_batch_size=50\n", + "Train Epoch: 1 [0]\tLoss: 2.315846\n", + "Train Epoch: 1 [0]\tLoss: 2.328258\n", + "Train Epoch: 1 [5000]\tLoss: 2.318942\n", + "Train Epoch: 1 [5000]\tLoss: 2.305338\n", + "Train Epoch: 1 [10000]\tLoss: 2.295995\n", + "Train Epoch: 1 [10000]\tLoss: 2.291051\n", + "Train Epoch: 1 [15000]\tLoss: 2.282527\n", + "Train Epoch: 1 [15000]\tLoss: 2.305161\n", + "Train Epoch: 1 [20000]\tLoss: 2.282576\n", + "Train Epoch: 1 [20000]\tLoss: 2.280523\n", + "Train Epoch: 1 [25000]\tLoss: 2.272546\n", + "Train Epoch: 1 [25000]\tLoss: 2.324517\n", + "Train Epoch: 2 [0]\tLoss: 2.263000\n", + "Train Epoch: 2 [0]\tLoss: 2.253219\n", + "Train Epoch: 2 [5000]\tLoss: 2.269941\n", + "Train Epoch: 2 [5000]\tLoss: 2.256959\n", + "Train Epoch: 2 [10000]\tLoss: 2.222101\n", + "Train Epoch: 2 [10000]\tLoss: 2.250984\n", + "Train Epoch: 2 [15000]\tLoss: 2.173892\n", + "Train Epoch: 2 [15000]\tLoss: 2.258744\n", + "Train Epoch: 2 [20000]\tLoss: 2.161367\n", + "Train Epoch: 2 [20000]\tLoss: 2.194634\n", + "Train Epoch: 2 [25000]\tLoss: 2.214464\n", + "Train Epoch: 2 [25000]\tLoss: 2.104484\n", + "Train Epoch: 3 [0]\tLoss: 2.073377\n", + "Train Epoch: 3 [0]\tLoss: 2.065120\n", + "Train Epoch: 3 [5000]\tLoss: 2.067660\n", + "Train Epoch: 3 [5000]\tLoss: 2.036174\n", + "Train Epoch: 3 [10000]\tLoss: 1.958426\n", + "Train Epoch: 3 [10000]\tLoss: 1.914909\n", + "Train Epoch: 3 [15000]\tLoss: 1.715065\n", + "Train Epoch: 3 [15000]\tLoss: 1.934866\n", + "Train Epoch: 3 [20000]\tLoss: 1.745061\n", + "Train Epoch: 3 [20000]\tLoss: 1.685388\n", + "Train Epoch: 3 [25000]\tLoss: 1.668422\n", + "Train Epoch: 3 [25000]\tLoss: 1.605796\n", + "Train Epoch: 4 [0]\tLoss: 1.664934\n", + "Train Epoch: 4 [0]\tLoss: 1.377108\n", + "Train Epoch: 4 [5000]\tLoss: 1.495357\n", + "Train Epoch: 4 [5000]\tLoss: 1.586019\n", + "Train Epoch: 4 [10000]\tLoss: 1.228206\n", + "Train Epoch: 4 [10000]\tLoss: 1.422787\n", + "Train Epoch: 4 [15000]\tLoss: 1.213615\n", + "Train Epoch: 4 [15000]\tLoss: 1.411315\n", + "Train Epoch: 4 [20000]\tLoss: 1.170620\n", + "Train Epoch: 4 [20000]\tLoss: 1.348655\n", + "Train Epoch: 4 [25000]\tLoss: 1.186718\n", + "Train Epoch: 4 [25000]\tLoss: 1.093435\n", + "Train Epoch: 5 [0]\tLoss: 1.262350\n", + "Train Epoch: 5 [0]\tLoss: 1.168563\n", + "Train Epoch: 5 [5000]\tLoss: 1.026802\n", + "Train Epoch: 5 [5000]\tLoss: 1.100900\n", + "Train Epoch: 5 [10000]\tLoss: 1.011708\n", + "Train Epoch: 5 [10000]\tLoss: 0.810456\n", + "Train Epoch: 5 [15000]\tLoss: 0.761695\n", + "Train Epoch: 5 [15000]\tLoss: 0.966266\n", + "Train Epoch: 5 [20000]\tLoss: 1.110494\n", + "Train Epoch: 5 [20000]\tLoss: 0.952292\n", + "Train Epoch: 5 [25000]\tLoss: 0.948426\n", + "Train Epoch: 5 [25000]\tLoss: 0.963606\n", + "Average test loss: 0.4790334701538086\n", + "Finished distributed training with 2 executor proceses\n" + ] + } + ], + "source": [ + "from pyspark.ml.torch.distributor import TorchDistributor\n", + "\n", + "multi_node_multi_gpu_dir = create_log_dir()\n", + "print(\"Log directory: \", create_log_dir())\n", + "\n", + "# Set num_processes = NUM_WORKERS * NUM_GPUS_PER_WORKER\n", + "output_dist = TorchDistributor(num_processes=2, local_mode=False, use_gpu=True).run(main_fn, multi_node_multi_gpu_dir)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "a40e7c6d-f486-4142-9954-62a88cfaece8", + "showTitle": false, + "title": "" + } + }, + "source": [ + "## Distributed Inference" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "2dbd74bc-523f-4d80-9187-2546eb20063f", + "showTitle": false, + "title": "" + } + }, + "source": [ + "### Convert Test Data to Parquet\n", + "\n", + "To emulate the use case where the dataset resides on a distributed file system, save the dataset as Parquet files to an S3 bucket.\n", + "\n", + "**Note**: this only needs to be run once, so you can skip this section if you've already generated the test dataset on S3." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "79573819-64b1-41cb-a6f1-f3dca07f7351", + "showTitle": false, + "title": "" + } + }, + "outputs": [ + { + "data": { + "application/vnd.databricks.v1+bamboolib_hint": "{\"pd.DataFrames\": [], \"version\": \"0.0.1\"}", + "text/plain": [] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "from pyspark.sql.types import StructType, StructField, ArrayType, FloatType, LongType" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "754362a2-ad00-45f7-86bc-4a24e85281c0", + "showTitle": false, + "title": "" + } + }, + "outputs": [], + "source": [ + "def save_as_parquet(data_loader, bucket):\n", + " data, labels = next(iter(data_loader))\n", + "\n", + " # flatten images\n", + " np_data = np.array(data).reshape(-1, 784)\n", + "\n", + " # create pandas dataframe with single array column\n", + " pdf = pd.DataFrame(np_data)\n", + " pdf1 = pd.DataFrame()\n", + " pdf1['data'] = pdf.values.tolist()\n", + " pdf1['label'] = labels\n", + " \n", + " # convert to Spark DataFrame\n", + " schema = StructType([\n", + " StructField(\"data\",ArrayType(FloatType()), True),\n", + " StructField(\"label\", LongType(), True)\n", + " ])\n", + " df = spark.createDataFrame(pdf1, schema)\n", + "\n", + " # save DataFrame to S3 bucket as parquet\n", + " df.write.mode(\"overwrite\").parquet(bucket)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "de27976f-96de-44c6-931c-7467bc63d16f", + "showTitle": false, + "title": "" + } + }, + "outputs": [], + "source": [ + "# save test dataset as parquet to S3\n", + "test_data_loader = get_test_dataloader(batch_size=10000)\n", + "save_as_parquet(test_data_loader, f\"{S3_BUCKET}/test\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "3815be25-0e4f-4a6a-8348-50922c75375a", + "showTitle": false, + "title": "" + } + }, + "source": [ + "### Inference with predict_batch_udf\n", + "See: https://spark.apache.org/docs/latest//api/python/reference/api/pyspark.ml.functions.predict_batch_udf.html" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "28293bff-2e66-4a16-80d8-1f591a1db981", + "showTitle": false, + "title": "" + } + }, + "outputs": [], + "source": [ + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.functions import struct, col, array\n", + "from pyspark.sql.types import ArrayType, FloatType, Union, Dict" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "ce0837d6-2b18-4553-8803-f8cb773b3ef7", + "showTitle": false, + "title": "" + } + }, + "outputs": [], + "source": [ + "df = spark.read.parquet(\"${S3_BUCKET}/test\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "f8d8af05-9cc4-4c30-989a-ab917e56b3e2", + "showTitle": false, + "title": "" + } + }, + "outputs": [], + "source": [ + "def predict_batch_fn():\n", + " import torch \n", + " device = torch.device(\"cuda\")\n", + " model = Net().to(device)\n", + " checkpoint = load_checkpoint(multi_node_multi_gpu_dir)\n", + " model.load_state_dict(checkpoint['model'])\n", + "\n", + " def predict(inputs):\n", + " torch_inputs = torch.from_numpy(inputs).to(device)\n", + " outputs = model(torch_inputs)\n", + " return outputs.cpu().detach().numpy()\n", + " \n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "9f3b8672-7e84-4c7c-8020-3d552e30b934", + "showTitle": false, + "title": "" + } + }, + "outputs": [], + "source": [ + "mnist = predict_batch_udf(predict_batch_fn,\n", + " input_tensor_shapes=[[1,28,28]],\n", + " return_type=ArrayType(FloatType()),\n", + " batch_size=1000)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "7ce2e38c-2dfd-4daa-950b-f928a39cb874", + "showTitle": false, + "title": "" + } + }, + "outputs": [], + "source": [ + "preds = df.withColumn(\"preds\", mnist('data')).collect()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "a77c5663-c109-403d-a7d9-d1d967f53e25", + "showTitle": false, + "title": "" + } + }, + "source": [ + "### Check predictions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "56e06323-5694-4cc6-be8c-ae643c19b30d", + "showTitle": false, + "title": "" + } + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "1dbdda94-9726-49da-8734-9bfde8bbb9d0", + "showTitle": false, + "title": "" + } + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9EAAAIICAYAAABpdm0gAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABgo0lEQVR4nO3de3xU1bn/8W/uhCSEW0gIN8NVBQVBQEQRJEKhWFG0am0L2FaUi1xOveCpcqoesWoVxXhtC9qjxXL8IRURqwgoykUjtHIVFRSFBGhJgkhCklm/PzgE414DezKTzGV/3q/X/JFn1qy9dngWM8/syTNxxhgjAAAAAABwSvHhXgAAAAAAANGCIhoAAAAAAJcoogEAAAAAcIkiGgAAAAAAlyiiAQAAAABwiSIaAAAAAACXKKIBAAAAAHCJIhoAAAAAAJcoogEAAAAAcIkiOoKcdtppGjduXM3PK1euVFxcnFauXBmyY8TFxem//uu/QjYfEErsAXgZ+Q+vYw/Ay8j/6EIR/X/mz5+vuLi4mlujRo3UtWtXTZ48WcXFxeFeXkCWLl0aVRvk8ccf1xlnnKGUlBS1adNGM2bM0OHDh8O9LM9hD4QPeyD8yP/w2bp1q37wgx8oPT1dzZs3189+9jPt378/3MvyHPZAeDz77LO66KKLlJ2drZSUFOXl5Wn8+PHatWtXuJfmKeR/+FVWVurMM89UXFycHnrooXAv55QSw72ASHP33XcrLy9P5eXlWr16tZ588kktXbpUmzZtUuPGjRt0LYMGDdKRI0eUnJwc0OOWLl2qgoIC6wY6cuSIEhMj55/9tttu0wMPPKArr7xSU6dO1ZYtWzR37lxt3rxZb7zxRriX50nsgYbFHogs5H/D+uqrrzRo0CBlZmbqvvvu0zfffKOHHnpIH3/8sdavXx/wuSN47IGGtWHDBuXl5elHP/qRmjVrpp07d+rZZ5/VkiVL9I9//EO5ubnhXqKnkP/hM3fuXH355ZfhXoZrkflbDKMRI0bo3HPPlST98pe/VIsWLfTwww9r8eLFuvbaa62POXz4sNLS0kK+lvj4eDVq1Cikc4Z6vmDs3btXDz/8sH72s5/p+eefr4l37dpVU6ZM0auvvqpLL700jCv0JvZAw2EPRB7yv2Hdd999Onz4sAoLC9W+fXtJUr9+/XTJJZdo/vz5uuGGG8K8Qu9hDzSsJ554whEbPXq0zj33XD3//PO6/fbbw7Aq7yL/w2Pfvn26++67ddttt+muu+4K93Jc4ePcp3DxxRdLknbu3ClJGjdunNLT0/XZZ59p5MiRysjI0HXXXSdJ8vl8mjNnjrp3765GjRopOztbEyZM0MGDB2vNaYzRvffeq7Zt26px48YaMmSINm/e7Di2v7+FWLdunUaOHKlmzZopLS1NZ599th599NGa9RUUFEhSrY+lHGf7W4gNGzZoxIgRatKkidLT0zV06FCtXbu21pjjH3N57733NGPGDGVlZSktLU2XX36542N3paWl2rZtm0pLS0/6u12zZo2qqqp0zTXX1Iof/3nBggUnfTwaBnvgGPaAN5H/x9RH/kvSyy+/rFGjRtUU0JKUn5+vrl276q9//espH4/6xx44pr72gM1pp50mSSopKanT4xE65P8x9Z3/t99+u7p166af/vSnrh8TblyJPoXPPvtMktSiRYuaWFVVlYYPH64LLrhADz30UM3HOyZMmKD58+dr/Pjxuvnmm7Vz5049/vjj2rBhg9577z0lJSVJku666y7de++9GjlypEaOHKmPPvpIw4YN09GjR0+5njfffFOjRo1S69atNXXqVOXk5Gjr1q1asmSJpk6dqgkTJmjPnj1688039ec///mU823evFkXXnihmjRpoltvvVVJSUl6+umnNXjwYK1atUr9+/evNX7KlClq1qyZZs2apV27dmnOnDmaPHmyXnrppZoxixYt0vjx4zVv3rxaDRK+r6KiQpKUmppaK37891lYWHjK9aP+sQfYA15G/tdf/n/99dfat29fzVWf7+rXr5+WLl16yvWj/rEH6m8PfNe//vUvVVdX68svv9Tdd98tSRo6dKirx6L+kP/1n//r16/Xc889p9WrV9cq+COegTHGmHnz5hlJ5q233jL79+83u3fvNgsWLDAtWrQwqamp5quvvjLGGDN27Fgjydx+++21Hv/uu+8aSeaFF16oFV+2bFmt+L59+0xycrL54Q9/aHw+X824O+64w0gyY8eOrYmtWLHCSDIrVqwwxhhTVVVl8vLyTIcOHczBgwdrHee7c02aNMn4+6eVZGbNmlXz8+jRo01ycrL57LPPamJ79uwxGRkZZtCgQY7fT35+fq1jTZ8+3SQkJJiSkhLH2Hnz5lnXcFxhYaGRZO65555a8eO/s/T09JM+HqHFHmAPeBn53/D5/8EHHxhJ5vnnn3fcd8sttxhJpry8/KRzIHTYAw2/B74rJSXFSDKSTIsWLcxjjz3m+rEIHvkfnvz3+XymX79+5tprrzXGGLNz504jyTz44IOnfGy48XHu78nPz1dWVpbatWuna665Runp6Vq0aJHatGlTa9xNN91U6+eFCxcqMzNTl1xyiQ4cOFBz69Onj9LT07VixQpJ0ltvvaWjR49qypQptd5tmTZt2inXtmHDBu3cuVPTpk1T06ZNa91Xl3duqqur9fe//12jR49Wx44da+KtW7fWT37yE61evVplZWW1HnPDDTfUOtaFF16o6upqffHFFzWxcePGyRhzynefevfurf79++t3v/ud5s2bp127dun111/XhAkTlJSUpCNHjgR8Tggee4A94GXkf8Pl//H8TklJcdx3/O/22AMNjz3QcHvgu15//XUtXbpUv//979W+fXu+oSFMyP+Gzf/58+fr448/1u9+97uA1x9ufJz7ewoKCtS1a1clJiYqOztb3bp1U3x87fcaEhMT1bZt21qxHTt2qLS0VK1atbLOu2/fPkmqSbIuXbrUuj8rK0vNmjU76dqOf6SkR48e7k/oJPbv369vv/1W3bp1c9x3xhlnyOfzaffu3erevXtN/Lt/tyapZs3f/3sPt15++WVdffXVuv766yVJCQkJmjFjhlatWqXt27fXaU4Ehz1wDHvAm8j/Yxoi/4//GcPxP2v4rvLy8lpj0HDYA8c01HPAcUOGDJF0rLHVZZddph49eig9PV2TJ08Oal4Ehvw/piHyv6ysTDNnztQtt9yidu3aBfz4cKOI/p5+/fpZ/z7ru1JSUhwbyufzqVWrVnrhhResj8nKygrZGsMpISHBGjfG1Gm+Nm3aaPXq1dqxY4eKiorUpUsX5eTkKDc3V127dg1mqagj9sDJsQdiG/l/cqHM/9atW0s61qX++/bu3avmzZtbr1KjfrEHTi7UzwE2nTp10jnnnKMXXniBIrqBkf8nF8r8f+ihh3T06FFdffXVNd+L/tVXX0k6VpTv2rVLubm5EftVhxTRIdKpUye99dZbGjhw4EnfOe/QoYOkY+9YffejE/v37z/luzidOnWSJG3atEn5+fl+x7n9SEdWVpYaN25svdq1bds2xcfHN9g7Q126dKl5V27Lli3au3dvQB+DQvixB4LDHohu5H/g2rRpo6ysLH344YeO+9avX69evXrV27EReuyB0Dpy5Ij1UxqITOR/4L788ksdPHiw1pXu4+677z7dd9992rBhQ8Q+F/A30SHy4x//WNXV1brnnnsc91VVVdV8TUF+fr6SkpI0d+7cWu/azJkz55TH6N27t/Ly8jRnzhzH1x58d67j31V3qq9GSEhI0LBhw7R48eKad4Akqbi4WC+++KIuuOACNWnS5JTr+r5gvtrB5/Pp1ltvVePGjXXjjTcG/HiED3vgBPaA95D/JwSS/2PGjNGSJUu0e/fumtjy5cv1ySef6Kqrrgr42Agf9sAJbvdAVVWVtXBav369Pv7441NeEUXkIP9PcJv/N998sxYtWlTr9vTTT0s69nfVixYtUl5eXsDHbyhciQ6Riy66SBMmTNDs2bO1ceNGDRs2TElJSdqxY4cWLlyoRx99VFdeeaWysrL061//WrNnz9aoUaM0cuRIbdiwQa+//rpatmx50mPEx8frySef1KWXXqpevXpp/Pjxat26tbZt26bNmzfrjTfekCT16dNH0rHkHD58uBISEhzfQ3vcvffeqzfffFMXXHCBJk6cqMTERD399NOqqKjQAw88UKffRSCt7adOnary8nL16tVLlZWVevHFF2ta3X//7y4Q2dgDJ7AHvIf8PyGQ/L/jjju0cOFCDRkyRFOnTtU333yjBx98UGeddZbGjx9fp+MjPNgDJ7jdA998843atWunq6++Wt27d1daWpo+/vhjzZs3T5mZmbrzzjvrdHw0PPL/BLf537t3b/Xu3btW7Hgx3717d40ePbpOx28wDdsMPHIdb8f+wQcfnHTc2LFjTVpamt/7n3nmGdOnTx+TmppqMjIyzFlnnWVuvfVWs2fPnpox1dXV5re//a1p3bq1SU1NNYMHDzabNm0yHTp0OGlr++NWr15tLrnkEpORkWHS0tLM2WefbebOnVtzf1VVlZkyZYrJysoycXFxtdrc63ut7Y0x5qOPPjLDhw836enppnHjxmbIkCHm/fffd/X7sa0xkNb28+bNMz179jRpaWkmIyPDDB061Lz99tunfBxCjz3AHvAy8j88+W+MMZs2bTLDhg0zjRs3Nk2bNjXXXXedKSoqcvVYhA57oOH3QEVFhZk6dao5++yzTZMmTUxSUpLp0KGD+cUvfmF27tx50scitMj/8D0HfFc0fcVV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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(2,5)\n", + "for i, ax in enumerate(ax.flatten()):\n", + " img = np.array(preds[i].data).reshape(28,28)\n", + " prediction = np.argmax(preds[i].preds)\n", + " ax.set_title(f\"Prediction: {prediction}\")\n", + " ax.imshow(img)\n", + "\n", + "plt.rcParams[\"figure.figsize\"] = (12,7)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "883a1bc9-e091-4f11-869d-ef850cacf480", + "showTitle": false, + "title": "" + } + }, + "source": [ + "## Advanced\n", + "For most real-world use cases with Spark and DL, the training datasets will generally be much larger than can be hosted on a single box. Instead, they will typically be stored in a distributed filesystem, like HDFS, S3, or GCS. The following code demonstrates how to access a distributed dataset (hosted in S3) during training.\n", + "\n", + "**Note**: For simplicity, we will continue to use the MNIST dataset, but keep in mind that real-world datasets will be several orders of magnitude larger." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "ae4442ad-1a23-4732-9398-c5b580d85d29", + "showTitle": false, + "title": "" + } + }, + "source": [ + "### Convert Train Data to Parquet\n", + "\n", + "To emulate the use case where the dataset resides on a distributed file system, save the dataset as Parquet files to an S3 bucket.\n", + "\n", + "**Note**: this only needs to be run once, so you can skip this section if you've already generated the dataset on S3." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "445a0adf-ba40-4230-a923-cfd0cfe5730d", + "showTitle": false, + "title": "" + } + }, + "outputs": [], + "source": [ + "# save train dataset as parquet to S3\n", + "train_data_loader = get_train_dataloader(batch_size=60000, distributed=False)\n", + "save_as_parquet(train_data_loader, f\"{S3_BUCKET}/train\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "ef83e46a-a4f9-44d1-9ca2-d9287aaf7f2e", + "showTitle": false, + "title": "" + } + }, + "source": [ + "### Distributed Data Loader\n", + "Since the dataset is stored in a distributed filesystem, you will need to use a distributed data loader capable of sharding files across the workers. Currently, there are two main options (aside from custom data loaders):\n", + "- Petastorm\n", + "- NVTabular\n", + "\n", + "Since the cluster is already configured with GPUs, we will demonstrate using NVTabular here, since it provides GPU-accelerated data loading with built-in support for S3FS and Parquet files." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "2220bcd9-8cb8-4671-a613-f5f2c1f985bf", + "showTitle": false, + "title": "" + } + }, + "outputs": [], + "source": [ + "storage_options={\"key\": access_key, \"secret\": secret_key}\n", + "\n", + "def seed_fn():\n", + " \"\"\"\n", + " Generate consistent dataloader shuffle seeds across workers\n", + " Reseeds each worker's dataloader each epoch to get fresh a shuffle\n", + " that's consistent across workers.\n", + " \"\"\"\n", + " return 0\n", + "\n", + "def get_train_dataloader(batch_size,):\n", + " import nvtabular as nvt\n", + " from nvtabular.loader.torch import TorchAsyncItr, DLDataLoader\n", + "\n", + " global_rank = int(os.environ[\"RANK\"])\n", + " world_size = int(os.environ[\"WORLD_SIZE\"])\n", + "\n", + " train_dataset = TorchAsyncItr(\n", + " nvt.Dataset(f\"{S3_BUCKET}/train\", engine=\"parquet\", storage_options=storage_options),\n", + " batch_size=batch_size,\n", + " cats=[],\n", + " conts=[\"data\"],\n", + " labels=[\"label\"],\n", + " shuffle=True,\n", + " parts_per_chunk=1,\n", + " global_size=world_size,\n", + " global_rank=global_rank,\n", + " seed_fn=seed_fn\n", + " )\n", + " train_loader = DLDataLoader(\n", + " train_dataset, batch_size=None, collate_fn=lambda x: x, pin_memory=False, num_workers=0\n", + " )\n", + "\n", + " return train_loader\n", + "\n", + "\n", + "def get_test_dataloader(batch_size):\n", + " import nvtabular as nvt\n", + " from nvtabular.loader.torch import TorchAsyncItr, DLDataLoader\n", + "\n", + " global_rank = int(os.environ[\"RANK\"])\n", + " world_size = int(os.environ[\"WORLD_SIZE\"])\n", + "\n", + " train_dataset = TorchAsyncItr(\n", + " nvt.Dataset(f\"{S3_BUCKET}/test\", engine=\"parquet\", storage_options=storage_options),\n", + " batch_size=batch_size,\n", + " cats=[],\n", + " conts=[\"data\"],\n", + " labels=[\"label\"],\n", + " shuffle=False,\n", + " parts_per_chunk=1,\n", + " global_size=world_size,\n", + " global_rank=global_rank,\n", + " seed_fn=seed_fn\n", + " )\n", + " train_loader = DLDataLoader(\n", + " train_dataset, batch_size=None, collate_fn=lambda x: x, pin_memory=False, num_workers=0\n", + " )\n", + "\n", + " return train_loader\n", + "\n", + "def prepare_batch(batch):\n", + " data = batch[0]['data__values'].reshape(-1,1,28,28)\n", + " label = batch[1]\n", + " return data, label" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "4b98395c-a662-4d4f-89a2-7837af89a9ec", + "showTitle": false, + "title": "" + } + }, + "source": [ + "### Train with NVTabular Data Loader" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "2ebb1fb7-f7cc-4601-8e8b-9fb26f4072dc", + "showTitle": false, + "title": "" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Log directory: /dbfs/ml/pytorch/1683755103.642704\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Started distributed training with 2 executor proceses\n", + "Running distributed training\n", + "Running distributed training\n", + "adjusted_batch_size=50\n", + "adjusted_batch_size=50\n", + "2023-05-10 21:45:14.407035: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 AVX512F AVX512_VNNI FMA\n", + "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", + "2023-05-10 21:45:14.551173: I tensorflow/core/util/port.cc:104] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n", + "2023-05-10 21:45:15.573393: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 AVX512F AVX512_VNNI FMA\n", + "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", + "2023-05-10 21:45:15.733816: I tensorflow/core/util/port.cc:104] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n", + "/databricks/python/lib/python3.10/site-packages/tritonclient/grpc/__init__.py:60: UserWarning: Imported version of grpc is 1.48.1. There is a memory leak in certain Python GRPC versions (1.43.0 to be specific). Please use versions <1.43.0 or >=1.51.1 to avoid leaks (see https://github.com/grpc/grpc/issues/28513).\n", + " warnings.warn(\n", + "2023-05-10 21:45:16.309734: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:981] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", + "2023-05-10 21:45:16.310694: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:981] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", + "2023-05-10 21:45:16.311293: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:981] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", + "/databricks/python/lib/python3.10/site-packages/tritonclient/grpc/__init__.py:60: UserWarning: Imported version of grpc is 1.48.1. There is a memory leak in certain Python GRPC versions (1.43.0 to be specific). Please use versions <1.43.0 or >=1.51.1 to avoid leaks (see https://github.com/grpc/grpc/issues/28513).\n", + " warnings.warn(\n", + "2023-05-10 21:45:17.727073: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:981] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", + "2023-05-10 21:45:17.728005: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:981] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", + "2023-05-10 21:45:17.728554: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:981] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", + "Train Epoch: 1 [0]\tLoss: 2.305805\n", + "Train Epoch: 1 [0]\tLoss: 2.339357\n", + "Train Epoch: 1 [5000]\tLoss: 2.280867\n", + "Train Epoch: 1 [5000]\tLoss: 2.368357\n", + "Train Epoch: 1 [10000]\tLoss: 2.290627\n", + "Train Epoch: 1 [10000]\tLoss: 2.271626\n", + "Train Epoch: 1 [15000]\tLoss: 2.285692\n", + "Train Epoch: 1 [15000]\tLoss: 2.309556\n", + "Train Epoch: 1 [20000]\tLoss: 2.291195\n", + "Train Epoch: 1 [20000]\tLoss: 2.258479\n", + "Train Epoch: 1 [25000]\tLoss: 2.305413\n", + "Train Epoch: 1 [25000]\tLoss: 2.257723\n", + "Train Epoch: 2 [0]\tLoss: 2.235390\n", + "Train Epoch: 2 [0]\tLoss: 2.198956\n", + "Train Epoch: 2 [5000]\tLoss: 2.218740\n", + "Train Epoch: 2 [5000]\tLoss: 2.221195\n", + "Train Epoch: 2 [10000]\tLoss: 2.187166\n", + "Train Epoch: 2 [10000]\tLoss: 2.137402\n", + "Train Epoch: 2 [15000]\tLoss: 2.126111\n", + "Train Epoch: 2 [15000]\tLoss: 2.073809\n", + "Train Epoch: 2 [20000]\tLoss: 2.081784\n", + "Train Epoch: 2 [20000]\tLoss: 1.966479\n", + "Train Epoch: 2 [25000]\tLoss: 1.930605\n", + "Train Epoch: 2 [25000]\tLoss: 1.878074\n", + "Train Epoch: 3 [0]\tLoss: 1.694411\n", + "Train Epoch: 3 [0]\tLoss: 1.862214\n", + "Train Epoch: 3 [5000]\tLoss: 1.893949\n", + "Train Epoch: 3 [5000]\tLoss: 1.882721\n", + "Train Epoch: 3 [10000]\tLoss: 1.315645\n", + "Train Epoch: 3 [10000]\tLoss: 1.813671\n", + "Train Epoch: 3 [15000]\tLoss: 1.548722\n", + "Train Epoch: 3 [15000]\tLoss: 1.306659\n", + "Train Epoch: 3 [20000]\tLoss: 1.352624\n", + "Train Epoch: 3 [20000]\tLoss: 1.249572\n", + "Train Epoch: 3 [25000]\tLoss: 1.214441\n", + "Train Epoch: 3 [25000]\tLoss: 1.272143\n", + "Train Epoch: 4 [0]\tLoss: 1.395404\n", + "Train Epoch: 4 [0]\tLoss: 1.208001\n", + "Train Epoch: 4 [5000]\tLoss: 1.393423\n", + "Train Epoch: 4 [5000]\tLoss: 1.033216\n", + "Train Epoch: 4 [10000]\tLoss: 1.039255\n", + "Train Epoch: 4 [10000]\tLoss: 1.147518\n", + "Train Epoch: 4 [15000]\tLoss: 1.105749\n", + "Train Epoch: 4 [15000]\tLoss: 0.898317\n", + "Train Epoch: 4 [20000]\tLoss: 0.889672\n", + "Train Epoch: 4 [20000]\tLoss: 0.999275\n", + "Train Epoch: 4 [25000]\tLoss: 0.814816\n", + "Train Epoch: 4 [25000]\tLoss: 0.955990\n", + "Train Epoch: 5 [0]\tLoss: 1.236833\n", + "Train Epoch: 5 [0]\tLoss: 0.852844\n", + "Train Epoch: 5 [5000]\tLoss: 1.068169\n", + "Train Epoch: 5 [5000]\tLoss: 0.947117\n", + "Train Epoch: 5 [10000]\tLoss: 1.434625\n", + "Train Epoch: 5 [10000]\tLoss: 0.652500\n", + "Train Epoch: 5 [15000]\tLoss: 0.938174\n", + "Train Epoch: 5 [15000]\tLoss: 0.902604\n", + "Train Epoch: 5 [20000]\tLoss: 0.698800\n", + "Train Epoch: 5 [20000]\tLoss: 0.812113\n", + "Train Epoch: 5 [25000]\tLoss: 0.591616\n", + "Train Epoch: 5 [25000]\tLoss: 1.005589\n", + "Average test loss: 0.5255906581878662\n", + "Finished distributed training with 2 executor proceses\n" + ] + } + ], + "source": [ + "from pyspark.ml.torch.distributor import TorchDistributor\n", + "\n", + "multi_node_multi_gpu_dir = create_log_dir()\n", + "print(\"Log directory: \", create_log_dir())\n", + "\n", + "# Set num_processes = NUM_WORKERS * NUM_GPUS_PER_WORKER\n", + "output_dist = TorchDistributor(num_processes=2, local_mode=False, use_gpu=True).run(main_fn, multi_node_multi_gpu_dir)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "inputWidgets": {}, + "nuid": "7e66fc07-ee69-4cdc-81d6-3130e03df3b2", + "showTitle": false, + "title": "" + } + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "application/vnd.databricks.v1+notebook": { + "dashboards": [], + "language": "python", + "notebookMetadata": { + "mostRecentlyExecutedCommandWithImplicitDF": { + "commandId": 2919187681861530, + "dataframes": [ + "_sqldf" + ] + }, + "pythonIndentUnit": 2 + }, + "notebookName": "Spark 3.4 E2E S3", + "notebookOrigID": 2285149241771137, + "widgets": {} + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 7b267e4de6bef1d8ef5c4ebdee95cec2aaff93aa Mon Sep 17 00:00:00 2001 From: Lee Yang Date: Mon, 22 May 2023 10:56:28 -0700 Subject: [PATCH 08/12] add examples for Spark DL inference API (#297) add examples for Spark DL inference API Signed-off-by: Lee Yang --- .../Spark-DL/dl_inference/README.md | 73 + .../huggingface/conditional_generation.ipynb | 1801 +++++++++++++ .../models_config/hf_generation/1/model.py | 143 + .../models_config/hf_generation/config.pbtxt | 52 + .../models_config/hf_pipeline/1/model.py | 144 + .../models_config/hf_pipeline/config.pbtxt | 57 + .../models_config/hf_transformer/1/model.py | 137 + .../models_config/hf_transformer/config.pbtxt | 52 + .../dl_inference/huggingface/pipelines.ipynb | 885 ++++++ .../huggingface/sentence_transformers.ipynb | 937 +++++++ .../pytorch/image_classification.ipynb | 2180 +++++++++++++++ .../models_config/fashion_mnist/config.pbtxt | 16 + .../models_config/housing_model/config.pbtxt | 16 + .../dl_inference/pytorch/regression.ipynb | 2220 +++++++++++++++ .../Spark-DL/dl_inference/requirements.txt | 19 + .../tensorflow/feature_columns.ipynb | 1772 ++++++++++++ .../tensorflow/image_classification.ipynb | 2400 +++++++++++++++++ .../tensorflow/keras-metadata.ipynb | 1160 ++++++++ .../models_config/feature_columns/1/model.py | 162 ++ .../feature_columns/config.pbtxt | 111 + .../models_config/mnist_model/config.pbtxt | 3 + .../models_config/resnet50/config.pbtxt | 3 + .../text_classification/1/model.py | 158 ++ .../text_classification/config.pbtxt | 51 + .../tensorflow/text_classification.ipynb | 1638 +++++++++++ 25 files changed, 16190 insertions(+) create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/README.md create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/conditional_generation.ipynb create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_generation/1/model.py create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_generation/config.pbtxt create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_pipeline/1/model.py create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_pipeline/config.pbtxt create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_transformer/1/model.py create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_transformer/config.pbtxt create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/pipelines.ipynb create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/sentence_transformers.ipynb create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/pytorch/image_classification.ipynb create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/pytorch/models_config/fashion_mnist/config.pbtxt create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/pytorch/models_config/housing_model/config.pbtxt create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/pytorch/regression.ipynb create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/requirements.txt create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/feature_columns.ipynb create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/image_classification.ipynb create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/keras-metadata.ipynb create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/feature_columns/1/model.py create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/feature_columns/config.pbtxt create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/mnist_model/config.pbtxt create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/resnet50/config.pbtxt create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/text_classification/1/model.py create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/text_classification/config.pbtxt create mode 100644 examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/text_classification.ipynb diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/README.md b/examples/ML+DL-Examples/Spark-DL/dl_inference/README.md new file mode 100644 index 000000000..177af9072 --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/README.md @@ -0,0 +1,73 @@ +# Spark DL Inference Using External Frameworks + +Example notebooks for the [predict_batch_udf](https://spark.apache.org/docs/latest/api/python/reference/api/pyspark.ml.functions.predict_batch_udf.html#pyspark.ml.functions.predict_batch_udf) function introduced in Spark 3.4. + +## Overview + +This directory contains notebooks for each DL framework (based on their own published examples). The goal is to demonstrate how models trained and saved on single-node machines can be easily used for parallel inferencing on Spark clusters. + +For example, a basic model trained in TensorFlow and saved on disk as "mnist_model" can be used in Spark as follows: +``` +import numpy as np +from pyspark.sql.functions import predict_batch_udf +from pyspark.sql.types import ArrayType, FloatType + +def predict_batch_fn(): + import tensorflow as tf + model = tf.keras.models.load_model("/path/to/mnist_model") + def predict(inputs: np.ndarray) -> np.ndarray: + return model.predict(inputs) + return predict + +mnist = predict_batch_udf(predict_batch_fn, + return_type=ArrayType(FloatType()), + batch_size=1024, + input_tensor_shapes=[[784]]) + +df = spark.read.parquet("mnist_data") +predictions = df.withColumn("preds", mnist("data")).collect() +``` + +In this simple case, the `predict_batch_fn` will use TensorFlow APIs to load the model and return a simple `predict` function which operates on numpy arrays. The `predict_batch_udf` will automatically convert the Spark DataFrame columns to the expected numpy inputs. + +All notebooks have been saved with sample outputs for quick browsing. + +## Running the Notebooks + +If you want to run the notebooks yourself, please follow these instructions. + +**Note**: for demonstration purposes, these examples just use a local Spark Standalone cluster with a single executor, but you should be able to run them on any distributed Spark cluster. +``` +# install dependencies for example notebooks +pip install -r requirements.txt + +# setup environment variables +export SPARK_HOME=/path/to/spark +export MASTER=spark://$(hostname):7077 +export SPARK_WORKER_INSTANCES=1 +export CORES_PER_WORKER=8 +export PYSPARK_DRIVER_PYTHON=jupyter +export PYSPARK_DRIVER_PYTHON_OPTS='lab' + +# start spark standalone cluster +${SPARK_HOME}/sbin/start-master.sh; ${SPARK_HOME}/sbin/start-worker.sh -c ${CORES_PER_WORKER} -m 16G ${MASTER} + +# start jupyter with pyspark +${SPARK_HOME}/bin/pyspark --master ${MASTER} \ +--driver-memory 8G \ +--executor-memory 8G \ +--conf spark.python.worker.reuse=True + +# BROWSE to localhost:8888 to view/run notebooks + +# stop spark standalone cluster +${SPARK_HOME}/sbin/stop-worker.sh; ${SPARK_HOME}/sbin/stop-master.sh +``` + +## Triton Inference Server + +The example notebooks also demonstrate integration with [Triton Inference Server](https://developer.nvidia.com/nvidia-triton-inference-server), an open-source, GPU-accelerated serving solution for DL. + +**Note**: Some examples may require special configuration of server as highlighted in the notebooks. + +**Note**: for demonstration purposes, the Triton Inference Server integrations just launch the server in a docker container on the local host, so you will need to [install docker](https://docs.docker.com/engine/install/) on your local host. Most real-world deployments will likely be hosted on remote machines. \ No newline at end of file diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/conditional_generation.ipynb b/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/conditional_generation.ipynb new file mode 100644 index 000000000..d3949f846 --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/conditional_generation.ipynb @@ -0,0 +1,1801 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "777fc40d", + "metadata": {}, + "source": [ + "# PySpark Huggingface Inferencing\n", + "## Conditional generation\n", + "\n", + "From: https://huggingface.co/docs/transformers/model_doc/t5" + ] + }, + { + "cell_type": "markdown", + "id": "6bcbccb1-3f82-425b-a82d-12d4f2f91d6e", + "metadata": {}, + "source": [ + "### Using PyTorch" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "731faab7-a700-46f8-bba5-1c8764e5eacb", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/leey/.pyenv/versions/3.9.10/envs/spark_rapids_examples/lib/python3.9/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], + "source": [ + "from transformers import T5Tokenizer, T5ForConditionalGeneration\n", + "\n", + "tokenizer = T5Tokenizer.from_pretrained(\"t5-small\")\n", + "model = T5ForConditionalGeneration.from_pretrained(\"t5-small\")\n", + "\n", + "max_source_length = 512\n", + "max_target_length = 128\n", + "\n", + "task_prefix = \"translate English to German: \"\n", + "\n", + "lines = [\n", + " \"The house is wonderful\",\n", + " \"Welcome to NYC\",\n", + " \"HuggingFace is a company\"\n", + "]\n", + "\n", + "input_sequences = [task_prefix + l for l in lines]" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "45abfa26-02da-4d4a-a925-85b387de0ada", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/leey/.pyenv/versions/3.9.10/envs/spark_rapids_examples/lib/python3.9/site-packages/transformers/generation/utils.py:1346: UserWarning: Using `max_length`'s default (20) to control the generation length. This behaviour is deprecated and will be removed from the config in v5 of Transformers -- we recommend using `max_new_tokens` to control the maximum length of the generation.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "input_ids = tokenizer(input_sequences, \n", + " padding=\"longest\", \n", + " max_length=max_source_length,\n", + " return_tensors=\"pt\").input_ids\n", + "outputs = model.generate(input_ids)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "72972ade-3a97-4bb3-9efa-31039a1a9442", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Das Haus ist wunderbar',\n", + " 'Willkommen in NYC',\n", + " 'HuggingFace ist ein Unternehmen']" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[tokenizer.decode(o, skip_special_tokens=True) for o in outputs]" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "18d060a1-19ef-4101-a9a6-2fdc184e07b0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'pt'" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.framework" + ] + }, + { + "cell_type": "markdown", + "id": "05c79ac4-bf25-421e-b55e-020d6d9e15d5", + "metadata": {}, + "source": [ + "### Using TensorFlow" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "f6f0dbf3-712b-4c58-85eb-261ce15bb2be", + "metadata": {}, + "outputs": [], + "source": [ + "from transformers import T5Tokenizer, TFT5ForConditionalGeneration" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "2684fb41-9467-40c0-9d7e-a1cc867c5a3c", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "All model checkpoint layers were used when initializing TFT5ForConditionalGeneration.\n", + "\n", + "All the layers of TFT5ForConditionalGeneration were initialized from the model checkpoint at t5-small.\n", + "If your task is similar to the task the model of the checkpoint was trained on, you can already use TFT5ForConditionalGeneration for predictions without further training.\n" + ] + } + ], + "source": [ + "tokenizer = T5Tokenizer.from_pretrained(\"t5-small\")\n", + "model = TFT5ForConditionalGeneration.from_pretrained(\"t5-small\")\n", + "\n", + "max_source_length = 512\n", + "max_target_length = 128\n", + "\n", + "task_prefix = \"translate English to German: \"\n", + "\n", + "lines = [\n", + " \"The house is wonderful\",\n", + " \"Welcome to NYC\",\n", + " \"HuggingFace is a company\"\n", + "]\n", + "\n", + "input_sequences = [task_prefix + l for l in lines]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "6eb2dfdb-0ad3-4d0f-81a4-268d92c53759", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/leey/.pyenv/versions/3.9.10/envs/spark_rapids_examples/lib/python3.9/site-packages/transformers/generation/tf_utils.py:854: UserWarning: Using `max_length`'s default (20) to control the generation length. This behaviour is deprecated and will be removed from the config in v5 of Transformers -- we recommend using `max_new_tokens` to control the maximum length of the generation.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "input_ids = tokenizer(input_sequences, \n", + " padding=\"longest\", \n", + " max_length=max_source_length,\n", + " return_tensors=\"tf\").input_ids\n", + "outputs = model.generate(input_ids)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "720158d4-e0e0-4904-b096-e5aede756afd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Das Haus ist wunderbar',\n", + " 'Willkommen in NYC',\n", + " 'HuggingFace ist ein Unternehmen']" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[tokenizer.decode(o, skip_special_tokens=True) for o in outputs]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8d4b364b-13cb-48ea-a97a-ccfc9e408075", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'tf'" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.framework" + ] + }, + { + "cell_type": "markdown", + "id": "546eabe0", + "metadata": {}, + "source": [ + "## PySpark" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "2f6db1f0-7d68-4af7-8bd6-c9fa45906c61", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "from torchtext.datasets import IMDB" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "b8453111-d068-49bb-ab91-8ae3d8bcdb7a", + "metadata": {}, + "outputs": [], + "source": [ + "# load IMDB reviews (test) dataset\n", + "data = IMDB(split='test')" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "6d5bb49d-9a5b-4d1c-949e-24d01a7cd9a5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "25000" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# convert to nested array of string for pyspark\n", + "lines = []\n", + "for label, text in data:\n", + " # only take first sentence of IMDB review\n", + " lines.append([text])\n", + "len(lines)" + ] + }, + { + "cell_type": "markdown", + "id": "6fd5b472-47e8-4804-9907-772793fedb2b", + "metadata": {}, + "source": [ + "### Create PySpark DataFrame" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "68121304-f1df-466e-9347-c9d2b36a9b3a", + "metadata": {}, + "outputs": [], + "source": [ + "from pyspark.sql.types import *" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "d24d9404-0269-476e-a9dd-1842667c915a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "StructType([StructField('lines', StringType(), True)])" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = spark.createDataFrame(lines, ['lines']).repartition(10)\n", + "df.schema" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "4384c762-1f79-4f60-876c-94b1f552e8fb", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/05/19 19:03:36 WARN TaskSetManager: Stage 0 contains a task of very large size (3858 KiB). The maximum recommended task size is 1000 KiB.\n", + " \r" + ] + }, + { + "data": { + "text/plain": [ + "[Row(lines='Now and again, a film comes around purely by accident that makes you doubt your sanity. We just finished studying the novel, \"Northanger Abbey\", at school and decided to refresh our memory of this unexciting piece of humourless garbage with the BBC adaptation.

The funny thing about Northanger Abbey is that it actually makes you want to kill yourself. The film is NOTHING like the book, for example, the subtly evil characters seem to have been turned into transparent stereotypes. John Thorpe looks like a leprechaun on acid while Isabella plays the role of slut. Catherine, the main character, is the most depressingly stupid and irritating actress on god\\'s earth (she looks like a coffee addict, her eyes are like basketballs) whilst Mr Tilney looks and acts like a retired porno stunt double. The plot goes completely off the rails at certain points of the film, I don\\'t know what the hell the director was thinking when for no reason at all, a 7 year old black kid who we\\'ve never met before takes the main character out of the abbey and starts cartwheeling in front of her. Yes, that\\'s right, cartwheeling. Nonsense of this kind is occasionally interrupted by Catherines \"fantasies\" in which she is being carried around a cathedral by an ogre.

Northanger Abbey is basically visual euthanasia so if you want to murder your boss or something like that, BBC have basically discovered a new way to kill someone. Northanger is a barely laughably bad film. Don\\'t watch it unless you\\'re in a padded cell.')]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.take(1)" + ] + }, + { + "cell_type": "markdown", + "id": "42ba3513-82dd-47e7-8193-eb4389458757", + "metadata": {}, + "source": [ + "### Save the test dataset as parquet files" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "e7eec8ec-4126-4890-b957-025809fad67d", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/05/19 19:03:39 WARN TaskSetManager: Stage 3 contains a task of very large size (3858 KiB). The maximum recommended task size is 1000 KiB.\n", + " \r" + ] + } + ], + "source": [ + "df.write.mode(\"overwrite\").parquet(\"imdb_test\")" + ] + }, + { + "cell_type": "markdown", + "id": "304e1fc8-42a3-47dd-b3c0-47efd5be1040", + "metadata": {}, + "source": [ + "### Check arrow memory configuration" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "20554ea5-01be-4a30-8607-db5d87786fec", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/05/19 19:03:40 WARN TaskSetManager: Stage 6 contains a task of very large size (3858 KiB). The maximum recommended task size is 1000 KiB.\n" + ] + } + ], + "source": [ + "spark.conf.set(\"spark.sql.execution.arrow.maxRecordsPerBatch\", \"512\")\n", + "# This line will fail if the vectorized reader runs out of memory\n", + "assert len(df.head()) > 0, \"`df` should not be empty\"" + ] + }, + { + "cell_type": "markdown", + "id": "06a4ecab-c9d9-466f-ba49-902ad1fd5488", + "metadata": {}, + "source": [ + "## Inference using Spark DL API (PyTorch)\n", + "Note: you can restart the kernel and run from this point to simulate running in a different node or environment." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "e7a00479-1347-4de8-8431-faa77f8cdf4c", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.functions import col, pandas_udf, struct\n", + "from pyspark.sql.types import StringType" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "b9a0889a-35b4-493a-8197-1146fc7efd53", + "metadata": {}, + "outputs": [], + "source": [ + "# only use first sentence and add prefix for conditional generation\n", + "def preprocess(text: pd.Series, prefix: str = \"\") -> pd.Series:\n", + " @pandas_udf(\"string\")\n", + " def _preprocess(text: pd.Series) -> pd.Series:\n", + " return pd.Series([prefix + s.split(\".\")[0] for s in text])\n", + " return _preprocess(text)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "c483e4d4-9ab1-416f-a766-694e17490fd3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------------------------------------------------------------------------------------------------------------------+\n", + "| lines|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "|...But not this one! I always wanted to know \"what happened\" next. We will never know for sure what happened because ...|\n", + "|Hard up, No proper jobs going down at the pit, why not rent your kids! DIY pimp story without the gratuitous sex scen...|\n", + "|I watched this movie to see the direction one of the most promising young talents in movies was going. Unfortunately,...|\n", + "|This movie makes you wish imdb would let you vote a zero. One of the two movies I've ever walked out of. It's very ha...|\n", + "|I never want to see this movie again!

Not only is it dreadfully bad, but I can't stand seeing my hero Stan...|\n", + "|(As a note, I'd like to say that I saw this movie at my annual church camp, where the entire youth group laughed at i...|\n", + "|Don't get me wrong, I love the TV series of League Of Gentlemen. It was funny, twisted and completely inspired. I was...|\n", + "|Did you ever think, like after watching a horror movie with a group of friends: \"Wow, this is so cool! We have got to...|\n", + "|Awful, awful, awful...

I loved the original film. It was funny, charming, and had heart... this piece of j...|\n", + "|This movie seems a little clunky around the edges, like not quite enough zaniness was thrown it when it should have b...|\n", + "|I rented this movie hoping that it would provide some good entertainment and some cool poker knowledge or stories. Wh...|\n", + "|Well, where to start describing this celluloid debacle? You already know the big fat NADA passing as a plot, so let's...|\n", + "|I hoped for this show to be somewhat realistic. It stroke me as just another mainstream show after I watched it. I di...|\n", + "|All I have to say is one word...SUCKS!!!!. The only reason I gave this a 2 is because Josh Hartnett was in it and he'...|\n", + "|Honestly awful film, bad editing, awful lighting, dire dialog and scrappy screenplay.

The lighting at is s...|\n", + "|This critique tells the story of 4 little friends who went to watch Angels and Demons the movie on the first night it...|\n", + "|This review contains a partial spoiler.

Shallow from the outset, 'D.O.A.' at least starts as if it might b...|\n", + "|I'm rather surprised that anybody found this film touching or moving.

The basic premise of the film sounde...|\n", + "|If you like bad movies (and you must to watch this one) here's a good one. Not quite as funny as the first, but much ...|\n", + "|This is really bad, the characters were bland, the story was boring, and there is no sex scene. Furthermore, it lacks...|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "only showing top 20 rows\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "100" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# only use first N examples, since this is slow\n", + "df = spark.read.parquet(\"imdb_test\").limit(100)\n", + "df.show(truncate=120)\n", + "df.count()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "831bc52c-a5c6-4c29-a6da-0566b5167773", + "metadata": {}, + "outputs": [], + "source": [ + "# only use first 100 rows, since generation takes a while\n", + "df1 = df.withColumn(\"input\", preprocess(col(\"lines\"), \"Translate English to German: \")).select(\"input\").limit(100).cache()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "46dac59c-5a54-4576-91e0-279c8b375b95", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "100" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df1.count()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "fef1d846-5852-4762-8527-602f32c0d7cd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------------------------------------------------------------------------------------------------------------------+\n", + "| input|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "| Translate English to German: |\n", + "|Translate English to German: Hard up, No proper jobs going down at the pit, why not rent your kids! DIY pimp story wi...|\n", + "|Translate English to German: I watched this movie to see the direction one of the most promising young talents in mov...|\n", + "| Translate English to German: This movie makes you wish imdb would let you vote a zero|\n", + "|Translate English to German: I never want to see this movie again!

Not only is it dreadfully bad, but I ca...|\n", + "|Translate English to German: (As a note, I'd like to say that I saw this movie at my annual church camp, where the en...|\n", + "| Translate English to German: Don't get me wrong, I love the TV series of League Of Gentlemen|\n", + "|Translate English to German: Did you ever think, like after watching a horror movie with a group of friends: \"Wow, th...|\n", + "| Translate English to German: Awful, awful, awful|\n", + "|Translate English to German: This movie seems a little clunky around the edges, like not quite enough zaniness was th...|\n", + "|Translate English to German: I rented this movie hoping that it would provide some good entertainment and some cool p...|\n", + "|Translate English to German: Well, where to start describing this celluloid debacle? You already know the big fat NAD...|\n", + "| Translate English to German: I hoped for this show to be somewhat realistic|\n", + "| Translate English to German: All I have to say is one word|\n", + "| Translate English to German: Honestly awful film, bad editing, awful lighting, dire dialog and scrappy screenplay|\n", + "|Translate English to German: This critique tells the story of 4 little friends who went to watch Angels and Demons th...|\n", + "| Translate English to German: This review contains a partial spoiler|\n", + "| Translate English to German: I'm rather surprised that anybody found this film touching or moving|\n", + "| Translate English to German: If you like bad movies (and you must to watch this one) here's a good one|\n", + "|Translate English to German: This is really bad, the characters were bland, the story was boring, and there is no sex...|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "df1.show(truncate=120)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "e7ae69d3-70c2-4765-928f-c96a7ba59829", + "metadata": {}, + "outputs": [], + "source": [ + "def predict_batch_fn():\n", + " import numpy as np\n", + " from transformers import T5ForConditionalGeneration, T5Tokenizer\n", + " model = T5ForConditionalGeneration.from_pretrained(\"t5-small\")\n", + " tokenizer = T5Tokenizer.from_pretrained(\"t5-small\")\n", + "\n", + " def predict(inputs):\n", + " flattened = np.squeeze(inputs).tolist() # convert 2d numpy array of string into flattened python list\n", + " input_ids = tokenizer(flattened, \n", + " padding=\"longest\", \n", + " max_length=128,\n", + " return_tensors=\"pt\").input_ids\n", + " output_ids = model.generate(input_ids)\n", + " string_outputs = np.array([tokenizer.decode(o, skip_special_tokens=True) for o in output_ids])\n", + " print(\"predict: {}\".format(len(flattened)))\n", + " return string_outputs\n", + " \n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "36684f59-d947-43f8-a2e8-c7a423764e88", + "metadata": {}, + "outputs": [], + "source": [ + "generate = predict_batch_udf(predict_batch_fn,\n", + " return_type=StringType(),\n", + " batch_size=10)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "6a01c855-8fa1-4765-a3a5-2c9dd872df10", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 21:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 23.1 ms, sys: 4.47 ms, total: 27.6 ms\n", + "Wall time: 22.6 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "# first pass caches model/fn\n", + "preds = df1.withColumn(\"preds\", generate(struct(\"input\")))\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "d912d4b0-cd0b-44ea-859a-b23455cc2700", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 23:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 15.7 ms, sys: 2.96 ms, total: 18.7 ms\n", + "Wall time: 16 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "preds = df1.withColumn(\"preds\", generate(\"input\"))\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "5fe3d88b-30f7-468f-8db8-1f4118d0f26c", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 25:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 9.34 ms, sys: 4.6 ms, total: 13.9 ms\n", + "Wall time: 16 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "preds = df1.withColumn(\"preds\", generate(col(\"input\")))\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "4ad9b365-4b9a-438e-8fdf-47da55cb1cf4", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 27:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------------------------------------------------------+------------------------------------------------------------+\n", + "| input| preds|\n", + "+------------------------------------------------------------+------------------------------------------------------------+\n", + "| Translate English to German: | Übersetzen Sie Englisch.|\n", + "|Translate English to German: Hard up, No proper jobs goin...| Warum nicht die Kinder mieten?|\n", + "|Translate English to German: I watched this movie to see ...|Ich habe diesen Film gesehen, um zu sehen, in welche Rich...|\n", + "|Translate English to German: This movie makes you wish im...|Dieser Film macht Sie sich wünschen, dass imdb Sie es Ihn...|\n", + "|Translate English to German: I never want to see this mov...| Ich möchte diesen Film nie wieder sehen!br />br|\n", + "|Translate English to German: (As a note, I'd like to say ...| (Als eine Bemerkung, möchte ich sagen, dass ich diesen|\n", + "|Translate English to German: Don't get me wrong, I love t...|Verstehen Sie mich nicht falsch, ich liebe die TV-Serie L...|\n", + "|Translate English to German: Did you ever think, like aft...|Haben Sie jemals glaubt, wie nach einem Horrorfilm mit ei...|\n", + "| Translate English to German: Awful, awful, awful| Wüstenlos, schrecklich, schrecklich|\n", + "|Translate English to German: This movie seems a little cl...|Dieser Film scheint etwas schlank um die Ecken zu sein, w...|\n", + "|Translate English to German: I rented this movie hoping t...|Ich miete diesen Film in der Hoffnung, dass er einige gut...|\n", + "|Translate English to German: Well, where to start describ...| Wie kann man dieses Celluloid-Debakel beschreiben?|\n", + "|Translate English to German: I hoped for this show to be ...| Ich hoffe, dass diese Show etwas realistisch sein wird.|\n", + "| Translate English to German: All I have to say is one word| Ich muss nur ein Wort sagen|\n", + "|Translate English to German: Honestly awful film, bad edi...|Honestly awful film, bad editing, awful lighting, dire di...|\n", + "|Translate English to German: This critique tells the stor...|Diese Kritik erzählt die Geschichte von 4 kleinen Freunde...|\n", + "|Translate English to German: This review contains a parti...| Dieses Review enthält einen Teil-Störer|\n", + "|Translate English to German: I'm rather surprised that an...|Ich bin ziemlich überrascht, dass jemand diesen Film berü...|\n", + "|Translate English to German: If you like bad movies (and ...|Wenn Sie schlechte Filme (und Sie müssen diesen schauen) ...|\n", + "|Translate English to German: This is really bad, the char...|Das ist wirklich schlecht, die Charaktere waren schmeiche...|\n", + "+------------------------------------------------------------+------------------------------------------------------------+\n", + "only showing top 20 rows\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "preds.show(truncate=60)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "1eb0c83b-d91b-4f8c-a5e7-c35f55c88108", + "metadata": {}, + "outputs": [], + "source": [ + "# only use first 100 rows, since generation takes a while\n", + "df2 = df.withColumn(\"input\", preprocess(col(\"lines\"), \"Translate English to French: \")).select(\"input\").limit(100).cache()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "054f94fd-fe79-41e7-b1c7-6124083acc72", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 28:=============================================> (8 + 2) / 10]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------------------------------------------------------------------------------------------------------------------+\n", + "| input|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "| Translate English to French: |\n", + "|Translate English to French: Hard up, No proper jobs going down at the pit, why not rent your kids! DIY pimp story wi...|\n", + "|Translate English to French: I watched this movie to see the direction one of the most promising young talents in mov...|\n", + "| Translate English to French: This movie makes you wish imdb would let you vote a zero|\n", + "|Translate English to French: I never want to see this movie again!

Not only is it dreadfully bad, but I ca...|\n", + "|Translate English to French: (As a note, I'd like to say that I saw this movie at my annual church camp, where the en...|\n", + "| Translate English to French: Don't get me wrong, I love the TV series of League Of Gentlemen|\n", + "|Translate English to French: Did you ever think, like after watching a horror movie with a group of friends: \"Wow, th...|\n", + "| Translate English to French: Awful, awful, awful|\n", + "|Translate English to French: This movie seems a little clunky around the edges, like not quite enough zaniness was th...|\n", + "|Translate English to French: I rented this movie hoping that it would provide some good entertainment and some cool p...|\n", + "|Translate English to French: Well, where to start describing this celluloid debacle? You already know the big fat NAD...|\n", + "| Translate English to French: I hoped for this show to be somewhat realistic|\n", + "| Translate English to French: All I have to say is one word|\n", + "| Translate English to French: Honestly awful film, bad editing, awful lighting, dire dialog and scrappy screenplay|\n", + "|Translate English to French: This critique tells the story of 4 little friends who went to watch Angels and Demons th...|\n", + "| Translate English to French: This review contains a partial spoiler|\n", + "| Translate English to French: I'm rather surprised that anybody found this film touching or moving|\n", + "| Translate English to French: If you like bad movies (and you must to watch this one) here's a good one|\n", + "|Translate English to French: This is really bad, the characters were bland, the story was boring, and there is no sex...|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "only showing top 20 rows\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "df2.show(truncate=120)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "6f6b70f9-188a-402b-9143-78a5788140e4", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 31:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 20.3 ms, sys: 0 ns, total: 20.3 ms\n", + "Wall time: 22 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "# first pass caches model/fn\n", + "preds = df2.withColumn(\"preds\", generate(struct(\"input\")))\n", + "result = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "031a6a5e-7999-4653-b394-19ed478d8c96", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 33:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 16.8 ms, sys: 0 ns, total: 16.8 ms\n", + "Wall time: 15.4 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "preds = df2.withColumn(\"preds\", generate(\"input\"))\n", + "result = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "229b6515-82f6-4e9c-90f0-a9c3cfb26301", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 35:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 12.6 ms, sys: 791 µs, total: 13.3 ms\n", + "Wall time: 15.4 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "preds = df2.withColumn(\"preds\", generate(col(\"input\")))\n", + "result = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "8be750ac-fa39-452e-bb4c-c2270bc2f70d", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 37:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------------------------------------------------------+------------------------------------------------------------+\n", + "| input| preds|\n", + "+------------------------------------------------------------+------------------------------------------------------------+\n", + "| Translate English to French: | :|\n", + "|Translate English to French: Hard up, No proper jobs goin...| Vous ne pouvez pas louer vos enfants!|\n", + "|Translate English to French: I watched this movie to see ...|J’ai regardé ce film pour voir la direction d’un des jeun...|\n", + "|Translate English to French: This movie makes you wish im...|Ce film vous fait envie de voir imdb vous laisser voter zéro|\n", + "|Translate English to French: I never want to see this mov...| Je ne veux jamais voir ce film à nouveau!br /|\n", + "|Translate English to French: (As a note, I'd like to say ...| ( titre de note, je voudrais dire que j'ai vu ce film|\n", + "|Translate English to French: Don't get me wrong, I love t...|Ne m'oubliez pas, je m'aime la série de télévision de League|\n", + "|Translate English to French: Did you ever think, like aft...|Vous avez jamais pensé, comme après avoir vu un film d'horre|\n", + "| Translate English to French: Awful, awful, awful| Awful, awful, awful|\n", + "|Translate English to French: This movie seems a little cl...| Ce film semble un peu cloné autour des bords, comme il|\n", + "|Translate English to French: I rented this movie hoping t...| J'ai loué ce film en espérant qu'il fournirait|\n", + "|Translate English to French: Well, where to start describ...|Vous savez déjà que la grande graisse NADA passe comme un...|\n", + "|Translate English to French: I hoped for this show to be ...| J'espère que ce spectacle sera quelque peu réaliste|\n", + "| Translate English to French: All I have to say is one word| Je n'ai qu'à dire un mot|\n", + "|Translate English to French: Honestly awful film, bad edi...| l'instar de l'arrière-plan, il|\n", + "|Translate English to French: This critique tells the stor...|Cette critique raconte l'histoire de 4 petits amis qui on...|\n", + "|Translate English to French: This review contains a parti...| Cet examen contient un spoiler partiel|\n", + "|Translate English to French: I'm rather surprised that an...|Je suis plutôt surpris que quelqu'un ait trouvé ce film t...|\n", + "|Translate English to French: If you like bad movies (and ...|Si vous aimez des films mauvais (et vous devez regarder c...|\n", + "|Translate English to French: This is really bad, the char...| C'est vraiment mauvais, les personnages étaient bourds, l|\n", + "+------------------------------------------------------------+------------------------------------------------------------+\n", + "only showing top 20 rows\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "preds.show(truncate=60)" + ] + }, + { + "cell_type": "markdown", + "id": "bcabb2a8-3880-46ec-8e01-5a10f71fe83d", + "metadata": {}, + "source": [ + "### Using Triton Inference Server\n", + "\n", + "Note: you can restart the kernel and run from this point to simulate running in a different node or environment." + ] + }, + { + "cell_type": "markdown", + "id": "5d98fa52-7665-49bf-865a-feec86effe23", + "metadata": {}, + "source": [ + "This notebook uses the [Python backend with a custom execution environment](https://github.com/triton-inference-server/python_backend#creating-custom-execution-environments), using a conda-pack environment created as follows:\n", + "```\n", + "conda create -n huggingface -c conda-forge python=3.8\n", + "conda activate huggingface\n", + "\n", + "export PYTHONUSERSITE=True\n", + "pip install conda-pack sentencepiece sentence_transformers transformers\n", + "\n", + "conda-pack # huggingface.tar.gz\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "b858cf85-82e6-41ef-905b-d8c5d6fea492", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import os\n", + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.functions import col, struct, pandas_udf\n", + "from pyspark.sql.types import FloatType, StringType, StructField, StructType" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "05ce7c77-d562-45e8-89bb-cd656aba5a5f", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "# copy custom model to expected layout for Triton\n", + "rm -rf models\n", + "mkdir -p models\n", + "cp -r models_config/hf_generation models\n", + "\n", + "# add custom execution environment\n", + "cp huggingface.tar.gz models" + ] + }, + { + "cell_type": "markdown", + "id": "a552865c-5dad-4f25-8834-f41e253ac2f6", + "metadata": { + "tags": [] + }, + "source": [ + "#### Start Triton Server on each executor" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "afd00b7e-8150-4c95-a2e4-037e9c90f92a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "[True]" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "num_executors = 1\n", + "triton_models_dir = \"{}/models\".format(os.getcwd())\n", + "huggingface_cache_dir = \"{}/.cache/huggingface\".format(os.path.expanduser('~'))\n", + "nodeRDD = sc.parallelize(list(range(num_executors)), num_executors)\n", + "\n", + "def start_triton(it):\n", + " import docker\n", + " import time\n", + " import tritonclient.grpc as grpcclient\n", + " \n", + " client=docker.from_env()\n", + " containers=client.containers.list(filters={\"name\": \"spark-triton\"})\n", + " if containers:\n", + " print(\">>>> containers: {}\".format([c.short_id for c in containers]))\n", + " else:\n", + " container=client.containers.run(\n", + " \"nvcr.io/nvidia/tritonserver:23.04-py3\", \"tritonserver --model-repository=/models\",\n", + " detach=True,\n", + " device_requests=[docker.types.DeviceRequest(device_ids=[\"0\"], capabilities=[['gpu']])],\n", + " environment=[\n", + " \"TRANSFORMERS_CACHE=/cache\"\n", + " ],\n", + " name=\"spark-triton\",\n", + " network_mode=\"host\",\n", + " remove=True,\n", + " shm_size=\"256M\",\n", + " volumes={\n", + " triton_models_dir: {\"bind\": \"/models\", \"mode\": \"ro\"},\n", + " huggingface_cache_dir: {\"bind\": \"/cache\", \"mode\": \"rw\"}\n", + " }\n", + " )\n", + " print(\">>>> starting triton: {}\".format(container.short_id))\n", + "\n", + " # wait for triton to be running\n", + " time.sleep(15)\n", + " client = grpcclient.InferenceServerClient(\"localhost:8001\")\n", + " ready = False\n", + " while not ready:\n", + " try:\n", + " ready = client.is_server_ready()\n", + " except Exception as e:\n", + " time.sleep(5)\n", + "\n", + " return [True]\n", + "\n", + "nodeRDD.barrier().mapPartitions(start_triton).collect()" + ] + }, + { + "cell_type": "markdown", + "id": "528d2df6-49fc-4be7-a534-a087dfe31c84", + "metadata": {}, + "source": [ + "#### Run inference" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "1a997c33-5202-466d-8304-b8c30f32978f", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from functools import partial\n", + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.functions import col, pandas_udf, struct\n", + "from pyspark.sql.types import StringType" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "9dea1875-6b95-4fc0-926d-a625a441b33d", + "metadata": {}, + "outputs": [], + "source": [ + "# only use first N examples, since this is slow\n", + "df = spark.read.parquet(\"imdb_test\").limit(100).cache()" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "5d6c54e7-534d-406f-b8e6-fd592efd0ab2", + "metadata": {}, + "outputs": [], + "source": [ + "# only use first sentence and add prefix for conditional generation\n", + "def preprocess(text: pd.Series, prefix: str = \"\") -> pd.Series:\n", + " @pandas_udf(\"string\")\n", + " def _preprocess(text: pd.Series) -> pd.Series:\n", + " return pd.Series([prefix + s.split(\".\")[0] for s in text])\n", + " return _preprocess(text)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "dc1bbbe3-4232-49e5-80f6-99976524b73b", + "metadata": {}, + "outputs": [], + "source": [ + "# only use first 100 rows, since generation takes a while\n", + "df1 = df.withColumn(\"input\", preprocess(col(\"lines\"), \"Translate English to German: \")).select(\"input\").limit(100)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "5d10c61c-6102-4d19-8dd6-0c7b5b65343e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------------------------------------------------------------------------------------------------------------------+\n", + "| input|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "| Translate English to German: |\n", + "|Translate English to German: Hard up, No proper jobs going down at the pit, why not rent your kids! DIY pimp story wi...|\n", + "|Translate English to German: I watched this movie to see the direction one of the most promising young talents in mov...|\n", + "| Translate English to German: This movie makes you wish imdb would let you vote a zero|\n", + "|Translate English to German: I never want to see this movie again!

Not only is it dreadfully bad, but I ca...|\n", + "|Translate English to German: (As a note, I'd like to say that I saw this movie at my annual church camp, where the en...|\n", + "| Translate English to German: Don't get me wrong, I love the TV series of League Of Gentlemen|\n", + "|Translate English to German: Did you ever think, like after watching a horror movie with a group of friends: \"Wow, th...|\n", + "| Translate English to German: Awful, awful, awful|\n", + "|Translate English to German: This movie seems a little clunky around the edges, like not quite enough zaniness was th...|\n", + "|Translate English to German: I rented this movie hoping that it would provide some good entertainment and some cool p...|\n", + "|Translate English to German: Well, where to start describing this celluloid debacle? You already know the big fat NAD...|\n", + "| Translate English to German: I hoped for this show to be somewhat realistic|\n", + "| Translate English to German: All I have to say is one word|\n", + "| Translate English to German: Honestly awful film, bad editing, awful lighting, dire dialog and scrappy screenplay|\n", + "|Translate English to German: This critique tells the story of 4 little friends who went to watch Angels and Demons th...|\n", + "| Translate English to German: This review contains a partial spoiler|\n", + "| Translate English to German: I'm rather surprised that anybody found this film touching or moving|\n", + "| Translate English to German: If you like bad movies (and you must to watch this one) here's a good one|\n", + "|Translate English to German: This is really bad, the characters were bland, the story was boring, and there is no sex...|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "df1.show(truncate=120)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "2e0907da-a5d9-4c3b-9db4-ce5e70ca9bb4", + "metadata": {}, + "outputs": [], + "source": [ + "def triton_fn(triton_uri, model_name):\n", + " import numpy as np\n", + " import tritonclient.grpc as grpcclient\n", + " \n", + " np_types = {\n", + " \"BOOL\": np.dtype(np.bool8),\n", + " \"INT8\": np.dtype(np.int8),\n", + " \"INT16\": np.dtype(np.int16),\n", + " \"INT32\": np.dtype(np.int32),\n", + " \"INT64\": np.dtype(np.int64),\n", + " \"FP16\": np.dtype(np.float16),\n", + " \"FP32\": np.dtype(np.float32),\n", + " \"FP64\": np.dtype(np.float64),\n", + " \"FP64\": np.dtype(np.double),\n", + " \"BYTES\": np.dtype(object)\n", + " }\n", + "\n", + " client = grpcclient.InferenceServerClient(triton_uri)\n", + " model_meta = client.get_model_metadata(model_name)\n", + " \n", + " def predict(inputs):\n", + " if isinstance(inputs, np.ndarray):\n", + " # single ndarray input\n", + " request = [grpcclient.InferInput(model_meta.inputs[0].name, inputs.shape, model_meta.inputs[0].datatype)]\n", + " request[0].set_data_from_numpy(inputs.astype(np_types[model_meta.inputs[0].datatype]))\n", + " else:\n", + " # dict of multiple ndarray inputs\n", + " request = [grpcclient.InferInput(i.name, inputs[i.name].shape, i.datatype) for i in model_meta.inputs]\n", + " for i in request:\n", + " i.set_data_from_numpy(inputs[i.name()].astype(np_types[i.datatype()]))\n", + " \n", + " response = client.infer(model_name, inputs=request)\n", + " \n", + " if len(model_meta.outputs) > 1:\n", + " # return dictionary of numpy arrays\n", + " return {o.name: response.as_numpy(o.name) for o in model_meta.outputs}\n", + " else:\n", + " # return single numpy array\n", + " return response.as_numpy(model_meta.outputs[0].name)\n", + " \n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "9308bdd7-6f67-484d-8b51-dd1e1b2960ba", + "metadata": {}, + "outputs": [], + "source": [ + "generate = predict_batch_udf(partial(triton_fn, triton_uri=\"localhost:8001\", model_name=\"hf_generation\"),\n", + " return_type=StringType(),\n", + " input_tensor_shapes=[[1]],\n", + " batch_size=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "38484ffd-370d-492b-8ca4-9eff9f242a9f", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 43:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 22.3 ms, sys: 4.66 ms, total: 27 ms\n", + "Wall time: 4.47 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "# first pass caches model/fn\n", + "preds = df1.withColumn(\"preds\", generate(struct(\"input\")))\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "ebcb6699-3ac2-4529-ab0f-fab0a5e792da", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 45:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 9.54 ms, sys: 4.29 ms, total: 13.8 ms\n", + "Wall time: 4.31 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "preds = df1.withColumn(\"preds\", generate(\"input\"))\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "e2ed18ad-d00b-472c-b2c3-047932f2105d", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 47:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 11.7 ms, sys: 9.72 ms, total: 21.4 ms\n", + "Wall time: 4.22 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "preds = df1.withColumn(\"preds\", generate(col(\"input\")))\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "0cd64a1c-beb8-47d5-ac6f-e8525bb61176", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------------------------------------------------------+------------------------------------------------------------+\n", + "| input| preds|\n", + "+------------------------------------------------------------+------------------------------------------------------------+\n", + "| Translate English to German: | Übersetzen Sie Englisch.|\n", + "|Translate English to German: Hard up, No proper jobs goin...| Warum nicht die Kinder mieten?|\n", + "|Translate English to German: I watched this movie to see ...|Ich habe diesen Film gesehen, um zu sehen, in welche Rich...|\n", + "|Translate English to German: This movie makes you wish im...|Dieser Film macht Sie sich wünschen, dass imdb Sie es Ihn...|\n", + "|Translate English to German: I never want to see this mov...| Ich möchte diesen Film nie wieder sehen!br />br|\n", + "|Translate English to German: (As a note, I'd like to say ...| (Als eine Bemerkung, möchte ich sagen, dass ich diesen|\n", + "|Translate English to German: Don't get me wrong, I love t...|Verstehen Sie mich nicht falsch, ich liebe die TV-Serie L...|\n", + "|Translate English to German: Did you ever think, like aft...|Haben Sie jemals glaubt, wie nach einem Horrorfilm mit ei...|\n", + "| Translate English to German: Awful, awful, awful| Wüstenlos, schrecklich, schrecklich|\n", + "|Translate English to German: This movie seems a little cl...|Dieser Film scheint etwas schlank um die Ecken zu sein, w...|\n", + "|Translate English to German: I rented this movie hoping t...|Ich miete diesen Film in der Hoffnung, dass er einige gut...|\n", + "|Translate English to German: Well, where to start describ...| Wie kann man dieses Celluloid-Debakel beschreiben?|\n", + "|Translate English to German: I hoped for this show to be ...| Ich hoffe, dass diese Show etwas realistisch sein wird.|\n", + "| Translate English to German: All I have to say is one word| Ich muss nur ein Wort sagen|\n", + "|Translate English to German: Honestly awful film, bad edi...|Honestly awful film, bad editing, awful lighting, dire di...|\n", + "|Translate English to German: This critique tells the stor...|Diese Kritik erzählt die Geschichte von 4 kleinen Freunde...|\n", + "|Translate English to German: This review contains a parti...| Dieses Review enthält einen Teil-Störer|\n", + "|Translate English to German: I'm rather surprised that an...|Ich bin ziemlich überrascht, dass jemand diesen Film berü...|\n", + "|Translate English to German: If you like bad movies (and ...|Wenn Sie schlechte Filme (und Sie müssen diesen schauen) ...|\n", + "|Translate English to German: This is really bad, the char...|Das ist wirklich schlecht, die Charaktere waren schmeiche...|\n", + "+------------------------------------------------------------+------------------------------------------------------------+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "preds.show(truncate=60)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "af70fed8-0f2b-4ea7-841c-476afdf9b1c0", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/05/19 19:06:28 WARN CacheManager: Asked to cache already cached data.\n" + ] + } + ], + "source": [ + "# only use first 100 rows, since generation takes a while\n", + "df2 = df.withColumn(\"input\", preprocess(col(\"lines\"), \"Translate English to French: \")).select(\"input\").limit(100).cache()" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "ef075e10-e22c-4236-9e0b-cb47cf2d3d06", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------------------------------------------------------------------------------------------------------------------+\n", + "| input|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "| Translate English to French: |\n", + "|Translate English to French: Hard up, No proper jobs going down at the pit, why not rent your kids! DIY pimp story wi...|\n", + "|Translate English to French: I watched this movie to see the direction one of the most promising young talents in mov...|\n", + "| Translate English to French: This movie makes you wish imdb would let you vote a zero|\n", + "|Translate English to French: I never want to see this movie again!

Not only is it dreadfully bad, but I ca...|\n", + "|Translate English to French: (As a note, I'd like to say that I saw this movie at my annual church camp, where the en...|\n", + "| Translate English to French: Don't get me wrong, I love the TV series of League Of Gentlemen|\n", + "|Translate English to French: Did you ever think, like after watching a horror movie with a group of friends: \"Wow, th...|\n", + "| Translate English to French: Awful, awful, awful|\n", + "|Translate English to French: This movie seems a little clunky around the edges, like not quite enough zaniness was th...|\n", + "|Translate English to French: I rented this movie hoping that it would provide some good entertainment and some cool p...|\n", + "|Translate English to French: Well, where to start describing this celluloid debacle? You already know the big fat NAD...|\n", + "| Translate English to French: I hoped for this show to be somewhat realistic|\n", + "| Translate English to French: All I have to say is one word|\n", + "| Translate English to French: Honestly awful film, bad editing, awful lighting, dire dialog and scrappy screenplay|\n", + "|Translate English to French: This critique tells the story of 4 little friends who went to watch Angels and Demons th...|\n", + "| Translate English to French: This review contains a partial spoiler|\n", + "| Translate English to French: I'm rather surprised that anybody found this film touching or moving|\n", + "| Translate English to French: If you like bad movies (and you must to watch this one) here's a good one|\n", + "|Translate English to French: This is really bad, the characters were bland, the story was boring, and there is no sex...|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "df2.show(truncate=120)" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "2e7e4af8-b815-4375-b851-8368309ee8e1", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 53:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 8.14 ms, sys: 12.6 ms, total: 20.8 ms\n", + "Wall time: 4.75 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "preds = df2.withColumn(\"preds\", generate(struct(\"input\")))\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "7b0aefb0-a96b-4791-a23c-1ce9b24eb20c", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 55:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 11.6 ms, sys: 3 ms, total: 14.6 ms\n", + "Wall time: 3.87 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "preds = df2.withColumn(\"preds\", generate(\"input\"))\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "1214b75b-a373-4579-b4c6-0cb8627da776", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 57:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 13.1 ms, sys: 4.3 ms, total: 17.4 ms\n", + "Wall time: 3.9 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "preds = df2.withColumn(\"preds\", generate(col(\"input\")))\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "c9dbd21f-9e37-4221-b765-80ba8c80b884", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------------------------------------------------------+------------------------------------------------------------+\n", + "| input| preds|\n", + "+------------------------------------------------------------+------------------------------------------------------------+\n", + "| Translate English to French: | :|\n", + "|Translate English to French: Hard up, No proper jobs goin...| Vous ne pouvez pas louer vos enfants!|\n", + "|Translate English to French: I watched this movie to see ...|J’ai regardé ce film pour voir la direction d’un des jeun...|\n", + "|Translate English to French: This movie makes you wish im...|Ce film vous fait envie de voir imdb vous laisser voter zéro|\n", + "|Translate English to French: I never want to see this mov...| Je ne veux jamais voir ce film à nouveau!br /|\n", + "|Translate English to French: (As a note, I'd like to say ...| ( titre de note, je voudrais dire que j'ai vu ce film|\n", + "|Translate English to French: Don't get me wrong, I love t...|Ne m'oubliez pas, je m'aime la série de télévision de League|\n", + "|Translate English to French: Did you ever think, like aft...|Vous avez jamais pensé, comme après avoir vu un film d'horre|\n", + "| Translate English to French: Awful, awful, awful| Awful, awful, awful|\n", + "|Translate English to French: This movie seems a little cl...| Ce film semble un peu cloné autour des bords, comme il|\n", + "|Translate English to French: I rented this movie hoping t...| J'ai loué ce film en espérant qu'il fournirait|\n", + "|Translate English to French: Well, where to start describ...|Vous savez déjà que la grande graisse NADA passe comme un...|\n", + "|Translate English to French: I hoped for this show to be ...| J'espère que ce spectacle sera quelque peu réaliste|\n", + "| Translate English to French: All I have to say is one word| Je n'ai qu'à dire un mot|\n", + "|Translate English to French: Honestly awful film, bad edi...| l'instar de l'arrière-plan, il|\n", + "|Translate English to French: This critique tells the stor...|Cette critique raconte l'histoire de 4 petits amis qui on...|\n", + "|Translate English to French: This review contains a parti...| Cet examen contient un spoiler partiel|\n", + "|Translate English to French: I'm rather surprised that an...|Je suis plutôt surpris que quelqu'un ait trouvé ce film t...|\n", + "|Translate English to French: If you like bad movies (and ...|Si vous aimez des films mauvais (et vous devez regarder c...|\n", + "|Translate English to French: This is really bad, the char...| C'est vraiment mauvais, les personnages étaient bourds, l|\n", + "+------------------------------------------------------------+------------------------------------------------------------+\n", + "only showing top 20 rows\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "preds.show(truncate=60)" + ] + }, + { + "cell_type": "markdown", + "id": "919e3113-64dd-482a-9233-6607b3f63c1e", + "metadata": { + "tags": [] + }, + "source": [ + "#### Stop Triton Server on each executor" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "425d3b28-7705-45ba-8a18-ad34fc895219", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "[True]" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def stop_triton(it):\n", + " import docker\n", + " import time\n", + " \n", + " client=docker.from_env()\n", + " containers=client.containers.list(filters={\"name\": \"spark-triton\"})\n", + " print(\">>>> stopping containers: {}\".format([c.short_id for c in containers]))\n", + " if containers:\n", + " container=containers[0]\n", + " container.stop(timeout=120)\n", + "\n", + " return [True]\n", + "\n", + "nodeRDD.barrier().mapPartitions(stop_triton).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "2dec80ca-7a7c-46a9-97c0-7afb1572f5b9", + "metadata": {}, + "outputs": [], + "source": [ + "spark.stop()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f43118ab-fc0a-4f64-a126-4302e615654a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_generation/1/model.py b/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_generation/1/model.py new file mode 100644 index 000000000..e7ae472fe --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_generation/1/model.py @@ -0,0 +1,143 @@ +# Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of NVIDIA CORPORATION nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import numpy as np +import json + +# triton_python_backend_utils is available in every Triton Python model. You +# need to use this module to create inference requests and responses. It also +# contains some utility functions for extracting information from model_config +# and converting Triton input/output types to numpy types. +import triton_python_backend_utils as pb_utils + + +class TritonPythonModel: + """Your Python model must use the same class name. Every Python model + that is created must have "TritonPythonModel" as the class name. + """ + + def initialize(self, args): + """`initialize` is called only once when the model is being loaded. + Implementing `initialize` function is optional. This function allows + the model to intialize any state associated with this model. + + Parameters + ---------- + args : dict + Both keys and values are strings. The dictionary keys and values are: + * model_config: A JSON string containing the model configuration + * model_instance_kind: A string containing model instance kind + * model_instance_device_id: A string containing model instance device ID + * model_repository: Model repository path + * model_version: Model version + * model_name: Model name + """ + import torch + print("torch: {}".format(torch.__version__)) + print("cuda: {}".format(torch.cuda.is_available())) + + import transformers + print("transformers: {}".format(transformers.__version__)) + + from transformers import T5Tokenizer, T5ForConditionalGeneration + self.tokenizer = T5Tokenizer.from_pretrained("t5-small") + self.model = T5ForConditionalGeneration.from_pretrained("t5-small") + + # You must parse model_config. JSON string is not parsed here + self.model_config = model_config = json.loads(args['model_config']) + + # Get output configuration + output_config = pb_utils.get_output_config_by_name(model_config, "output") + + # Convert Triton types to numpy types + self.output_dtype = pb_utils.triton_string_to_numpy(output_config['data_type']) + + def execute(self, requests): + """`execute` MUST be implemented in every Python model. `execute` + function receives a list of pb_utils.InferenceRequest as the only + argument. This function is called when an inference request is made + for this model. Depending on the batching configuration (e.g. Dynamic + Batching) used, `requests` may contain multiple requests. Every + Python model, must create one pb_utils.InferenceResponse for every + pb_utils.InferenceRequest in `requests`. If there is an error, you can + set the error argument when creating a pb_utils.InferenceResponse + + Parameters + ---------- + requests : list + A list of pb_utils.InferenceRequest + + Returns + ------- + list + A list of pb_utils.InferenceResponse. The length of this list must + be the same as `requests` + """ + + output_dtype = self.output_dtype + + responses = [] + + # Every Python backend must iterate over everyone of the requests + # and create a pb_utils.InferenceResponse for each of them. + for request in requests: + # Get input numpy + sentence_input = pb_utils.get_input_tensor_by_name(request, "input") + sentences = list(sentence_input.as_numpy()) + sentences = np.squeeze(sentences, -1).tolist() + sentences = [s.decode('utf-8') for s in sentences] + + input_ids = self.tokenizer(sentences, + padding="longest", + max_length=512, + return_tensors="pt").input_ids + output_ids = self.model.generate(input_ids) + outputs = np.array([self.tokenizer.decode(o, skip_special_tokens=True) for o in output_ids]) + + # Create output tensors. You need pb_utils.Tensor + # objects to create pb_utils.InferenceResponse. + output_tensor = pb_utils.Tensor("output", outputs.astype(output_dtype)) + + # Create InferenceResponse. You can set an error here in case + # there was a problem with handling this inference request. + # Below is an example of how you can set errors in inference + # response: + # + # pb_utils.InferenceResponse( + # output_tensors=..., TritonError("An error occured")) + inference_response = pb_utils.InferenceResponse(output_tensors=[output_tensor]) + responses.append(inference_response) + + # You should return a list of pb_utils.InferenceResponse. Length + # of this list must match the length of `requests` list. + return responses + + def finalize(self): + """`finalize` is called only once when the model is being unloaded. + Implementing `finalize` function is OPTIONAL. This function allows + the model to perform any necessary clean ups before exit. + """ + print('Cleaning up...') diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_generation/config.pbtxt b/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_generation/config.pbtxt new file mode 100644 index 000000000..380af49c5 --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_generation/config.pbtxt @@ -0,0 +1,52 @@ +# Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of NVIDIA CORPORATION nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +name: "hf_generation" +backend: "python" +max_batch_size: 8192 + +input [ + { + name: "input" + data_type: TYPE_STRING + dims: [1] + } +] +output [ + { + name: "output" + data_type: TYPE_STRING + dims: [1] + } +] + +instance_group [{ kind: KIND_GPU }] + +parameters: { + key: "EXECUTION_ENV_PATH", + value: {string_value: "$$TRITON_MODEL_DIRECTORY/../huggingface.tar.gz"} +} + diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_pipeline/1/model.py b/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_pipeline/1/model.py new file mode 100644 index 000000000..79faa0306 --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_pipeline/1/model.py @@ -0,0 +1,144 @@ +# Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of NVIDIA CORPORATION nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import numpy as np +import json + +# triton_python_backend_utils is available in every Triton Python model. You +# need to use this module to create inference requests and responses. It also +# contains some utility functions for extracting information from model_config +# and converting Triton input/output types to numpy types. +import triton_python_backend_utils as pb_utils + + +class TritonPythonModel: + """Your Python model must use the same class name. Every Python model + that is created must have "TritonPythonModel" as the class name. + """ + + def initialize(self, args): + """`initialize` is called only once when the model is being loaded. + Implementing `initialize` function is optional. This function allows + the model to intialize any state associated with this model. + + Parameters + ---------- + args : dict + Both keys and values are strings. The dictionary keys and values are: + * model_config: A JSON string containing the model configuration + * model_instance_kind: A string containing model instance kind + * model_instance_device_id: A string containing model instance device ID + * model_repository: Model repository path + * model_version: Model version + * model_name: Model name + """ + import torch + print("torch: {}".format(torch.__version__)) + print("cuda: {}".format(torch.cuda.is_available())) + + import transformers + print("transformers: {}".format(transformers.__version__)) + + from transformers import pipeline + self.pipe = pipeline("text-classification", device=0) + + # You must parse model_config. JSON string is not parsed here + self.model_config = model_config = json.loads(args['model_config']) + + # Get output configuration + label_config = pb_utils.get_output_config_by_name(model_config, "label") + score_config = pb_utils.get_output_config_by_name(model_config, "score") + + # Convert Triton types to numpy types + self.label_dtype = pb_utils.triton_string_to_numpy(label_config['data_type']) + self.score_dtype = pb_utils.triton_string_to_numpy(score_config['data_type']) + + def execute(self, requests): + """`execute` MUST be implemented in every Python model. `execute` + function receives a list of pb_utils.InferenceRequest as the only + argument. This function is called when an inference request is made + for this model. Depending on the batching configuration (e.g. Dynamic + Batching) used, `requests` may contain multiple requests. Every + Python model, must create one pb_utils.InferenceResponse for every + pb_utils.InferenceRequest in `requests`. If there is an error, you can + set the error argument when creating a pb_utils.InferenceResponse + + Parameters + ---------- + requests : list + A list of pb_utils.InferenceRequest + + Returns + ------- + list + A list of pb_utils.InferenceResponse. The length of this list must + be the same as `requests` + """ + + label_dtype = self.label_dtype + score_dtype = self.score_dtype + + responses = [] + + # Every Python backend must iterate over everyone of the requests + # and create a pb_utils.InferenceResponse for each of them. + for request in requests: + # Get input numpy + sentence_input = pb_utils.get_input_tensor_by_name(request, "sentence") + sentences = list(sentence_input.as_numpy()) + sentences = np.squeeze(sentences).tolist() + sentences = [s.decode('utf-8') for s in sentences] + + results = self.pipe(sentences) + + label = np.array([res['label'] for res in results]) + score = np.array([res['score'] for res in results]) + + # Create output tensors. You need pb_utils.Tensor + # objects to create pb_utils.InferenceResponse. + label_tensor = pb_utils.Tensor("label", label.astype(label_dtype)) + score_tensor = pb_utils.Tensor("score", score.astype(score_dtype)) + + # Create InferenceResponse. You can set an error here in case + # there was a problem with handling this inference request. + # Below is an example of how you can set errors in inference + # response: + # + # pb_utils.InferenceResponse( + # output_tensors=..., TritonError("An error occured")) + inference_response = pb_utils.InferenceResponse(output_tensors=[label_tensor, score_tensor]) + responses.append(inference_response) + + # You should return a list of pb_utils.InferenceResponse. Length + # of this list must match the length of `requests` list. + return responses + + def finalize(self): + """`finalize` is called only once when the model is being unloaded. + Implementing `finalize` function is OPTIONAL. This function allows + the model to perform any necessary clean ups before exit. + """ + print('Cleaning up...') diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_pipeline/config.pbtxt b/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_pipeline/config.pbtxt new file mode 100644 index 000000000..5caae44f2 --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_pipeline/config.pbtxt @@ -0,0 +1,57 @@ +# Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of NVIDIA CORPORATION nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +name: "hf_pipeline" +backend: "python" +max_batch_size: 8192 + +input [ + { + name: "sentence" + data_type: TYPE_STRING + dims: [1] + } +] +output [ + { + name: "label" + data_type: TYPE_STRING + dims: [1] + }, + { + name: "score" + data_type: TYPE_FP32 + dims: [1] + } +] + +instance_group [{ kind: KIND_GPU }] + +parameters: { + key: "EXECUTION_ENV_PATH", + value: {string_value: "$$TRITON_MODEL_DIRECTORY/../huggingface.tar.gz"} +} + diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_transformer/1/model.py b/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_transformer/1/model.py new file mode 100644 index 000000000..f49805deb --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_transformer/1/model.py @@ -0,0 +1,137 @@ +# Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of NVIDIA CORPORATION nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import numpy as np +import json + +# triton_python_backend_utils is available in every Triton Python model. You +# need to use this module to create inference requests and responses. It also +# contains some utility functions for extracting information from model_config +# and converting Triton input/output types to numpy types. +import triton_python_backend_utils as pb_utils + + +class TritonPythonModel: + """Your Python model must use the same class name. Every Python model + that is created must have "TritonPythonModel" as the class name. + """ + + def initialize(self, args): + """`initialize` is called only once when the model is being loaded. + Implementing `initialize` function is optional. This function allows + the model to intialize any state associated with this model. + + Parameters + ---------- + args : dict + Both keys and values are strings. The dictionary keys and values are: + * model_config: A JSON string containing the model configuration + * model_instance_kind: A string containing model instance kind + * model_instance_device_id: A string containing model instance device ID + * model_repository: Model repository path + * model_version: Model version + * model_name: Model name + """ + import torch + print("torch: {}".format(torch.__version__)) + print("cuda: {}".format(torch.cuda.is_available())) + + import transformers + print("transformers: {}".format(transformers.__version__)) + + from sentence_transformers import SentenceTransformer + self.model = SentenceTransformer('paraphrase-MiniLM-L6-v2') + + # You must parse model_config. JSON string is not parsed here + self.model_config = model_config = json.loads(args['model_config']) + + # Get output configuration + embedding_config = pb_utils.get_output_config_by_name(model_config, "embedding") + + # Convert Triton types to numpy types + self.embedding_dtype = pb_utils.triton_string_to_numpy(embedding_config['data_type']) + + def execute(self, requests): + """`execute` MUST be implemented in every Python model. `execute` + function receives a list of pb_utils.InferenceRequest as the only + argument. This function is called when an inference request is made + for this model. Depending on the batching configuration (e.g. Dynamic + Batching) used, `requests` may contain multiple requests. Every + Python model, must create one pb_utils.InferenceResponse for every + pb_utils.InferenceRequest in `requests`. If there is an error, you can + set the error argument when creating a pb_utils.InferenceResponse + + Parameters + ---------- + requests : list + A list of pb_utils.InferenceRequest + + Returns + ------- + list + A list of pb_utils.InferenceResponse. The length of this list must + be the same as `requests` + """ + + embedding_dtype = self.embedding_dtype + + responses = [] + + # Every Python backend must iterate over everyone of the requests + # and create a pb_utils.InferenceResponse for each of them. + for request in requests: + # Get input numpy + sentence_input = pb_utils.get_input_tensor_by_name(request, "sentence") + sentences = list(sentence_input.as_numpy()) + sentences = np.squeeze(sentences, -1).tolist() + sentences = [s.decode('utf-8') for s in sentences] + + embedding = self.model.encode(sentences) + + # Create output tensors. You need pb_utils.Tensor + # objects to create pb_utils.InferenceResponse. + embedding_tensor = pb_utils.Tensor("embedding", embedding.astype(embedding_dtype)) + + # Create InferenceResponse. You can set an error here in case + # there was a problem with handling this inference request. + # Below is an example of how you can set errors in inference + # response: + # + # pb_utils.InferenceResponse( + # output_tensors=..., TritonError("An error occured")) + inference_response = pb_utils.InferenceResponse(output_tensors=[embedding_tensor]) + responses.append(inference_response) + + # You should return a list of pb_utils.InferenceResponse. Length + # of this list must match the length of `requests` list. + return responses + + def finalize(self): + """`finalize` is called only once when the model is being unloaded. + Implementing `finalize` function is OPTIONAL. This function allows + the model to perform any necessary clean ups before exit. + """ + print('Cleaning up...') diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_transformer/config.pbtxt b/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_transformer/config.pbtxt new file mode 100644 index 000000000..ccdee3a50 --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/models_config/hf_transformer/config.pbtxt @@ -0,0 +1,52 @@ +# Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of NVIDIA CORPORATION nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +name: "hf_transformer" +backend: "python" +max_batch_size: 8192 + +input [ + { + name: "sentence" + data_type: TYPE_STRING + dims: [1] + } +] +output [ + { + name: "embedding" + data_type: TYPE_FP32 + dims: [384] + } +] + +instance_group [{ kind: KIND_GPU }] + +parameters: { + key: "EXECUTION_ENV_PATH", + value: {string_value: "$$TRITON_MODEL_DIRECTORY/../huggingface.tar.gz"} +} + diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/pipelines.ipynb b/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/pipelines.ipynb new file mode 100644 index 000000000..51b8feb8e --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/pipelines.ipynb @@ -0,0 +1,885 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "60f7ac5d-4a95-4170-a0ac-a7faac9d9ef4", + "metadata": {}, + "source": [ + "# PySpark Huggingface Inferencing\n", + "### Text Classification using Pipelines\n", + "\n", + "Based on: https://huggingface.co/docs/transformers/quicktour#pipeline-usage" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "0dd0f77b-ee1b-4477-a038-d25a4f1da0ea", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/leey/.pyenv/versions/3.9.10/envs/spark_rapids_examples/lib/python3.9/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "from inspect import signature\n", + "from pyspark.sql.functions import col, pandas_udf\n", + "from transformers import pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "553b28d2-a5d1-4d07-8a49-8f82b808e738", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "No model was supplied, defaulted to distilbert-base-uncased-finetuned-sst-2-english and revision af0f99b (https://huggingface.co/distilbert-base-uncased-finetuned-sst-2-english).\n", + "Using a pipeline without specifying a model name and revision in production is not recommended.\n", + "Xformers is not installed correctly. If you want to use memorry_efficient_attention to accelerate training use the following command to install Xformers\n", + "pip install xformers.\n" + ] + } + ], + "source": [ + "pipe = pipeline(\"text-classification\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "3b91fe91-b725-4564-ae93-56e3fb51e47c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'label': 'POSITIVE', 'score': 0.9994712471961975}]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pipe(\"What can I say that hasn't been said already. I think this place is totally worth the hype.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "0be39eb3-462c-42ff-b8f4-09f4e4fe3a3c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'label': 'NEGATIVE', 'score': 0.9997401833534241}]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pipe(\"I will not say much about this film, because there is not much to say, because there is not much there to talk about.\")" + ] + }, + { + "cell_type": "markdown", + "id": "ae92b15e-0da0-46c3-81a3-fabaedbfc42c", + "metadata": {}, + "source": [ + "## Inference using Spark DL API" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "69dd6a1a-f450-47f0-9dbf-ad250585a011", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from pyspark.sql.functions import col, struct, pandas_udf\n", + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.types import FloatType, StringType, StructField, StructType" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "9665b7b6-d7e9-4bd4-b29d-7a449ac5b574", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 1:====================================================> (9 + 1) / 10]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------------------------------------------------------------------+\n", + "| sentence|\n", + "+--------------------------------------------------------------------------------+\n", + "| |\n", + "|Hard up, No proper jobs going down at the pit, why not rent your kids! DIY pi...|\n", + "|I watched this movie to see the direction one of the most promising young tal...|\n", + "| This movie makes you wish imdb would let you vote a zero|\n", + "|I never want to see this movie again!

Not only is it dreadfully ba...|\n", + "|(As a note, I'd like to say that I saw this movie at my annual church camp, w...|\n", + "| Don't get me wrong, I love the TV series of League Of Gentlemen|\n", + "|Did you ever think, like after watching a horror movie with a group of friend...|\n", + "| Awful, awful, awful|\n", + "|This movie seems a little clunky around the edges, like not quite enough zani...|\n", + "|I rented this movie hoping that it would provide some good entertainment and ...|\n", + "|Well, where to start describing this celluloid debacle? You already know the ...|\n", + "| I hoped for this show to be somewhat realistic|\n", + "| All I have to say is one word|\n", + "|Honestly awful film, bad editing, awful lighting, dire dialog and scrappy scr...|\n", + "|This critique tells the story of 4 little friends who went to watch Angels an...|\n", + "| This review contains a partial spoiler|\n", + "| I'm rather surprised that anybody found this film touching or moving|\n", + "| If you like bad movies (and you must to watch this one) here's a good one|\n", + "|This is really bad, the characters were bland, the story was boring, and ther...|\n", + "+--------------------------------------------------------------------------------+\n", + "only showing top 20 rows\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "# only use first sentence of IMDB reviews\n", + "@pandas_udf(\"string\")\n", + "def first_sentence(text: pd.Series) -> pd.Series:\n", + " return pd.Series([s.split(\".\")[0] for s in text])\n", + "\n", + "df = spark.read.parquet(\"imdb_test\").withColumn(\"sentence\", first_sentence(col(\"lines\"))).select(\"sentence\").limit(100).cache()\n", + "df.show(truncate=80)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "0da9d25c-5ebe-4503-bb19-154fcc047cbf", + "metadata": {}, + "outputs": [], + "source": [ + "def predict_batch_fn():\n", + " from transformers import pipeline\n", + " pipe = pipeline(\"text-classification\")\n", + " def predict(inputs):\n", + " return pipe(inputs.tolist())\n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "78afef29-ee30-4267-9fb6-be2dcb86cbba", + "metadata": {}, + "outputs": [], + "source": [ + "classify = predict_batch_udf(predict_batch_fn,\n", + " return_type=StructType([\n", + " StructField(\"label\", StringType(), True),\n", + " StructField(\"score\", FloatType(), True)\n", + " ]),\n", + " batch_size=10)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "a5bc327e-89cf-4731-82e6-e66cb93deef1", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 4:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 21.2 ms, sys: 4.33 ms, total: 25.5 ms\n", + "Wall time: 12.3 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "# note: expanding the \"struct\" return_type to top-level columns\n", + "preds = df.withColumn(\"preds\", classify(struct(\"sentence\"))).select(\"sentence\", \"preds.*\")\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "ac642895-cfd6-47ee-9b21-02e7835424e4", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 6:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 8.67 ms, sys: 4.24 ms, total: 12.9 ms\n", + "Wall time: 5.44 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "# note: expanding the \"struct\" return_type to top-level columns\n", + "preds = df.withColumn(\"preds\", classify(\"sentence\")).select(\"sentence\", \"preds.*\")\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "76a44d80-d5db-405f-989c-7246379cfb95", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 8:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 13.8 ms, sys: 1.52 ms, total: 15.4 ms\n", + "Wall time: 5.46 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "# note: expanding the \"struct\" return_type to top-level columns\n", + "preds = df.withColumn(\"preds\", classify(col(\"sentence\"))).select(\"sentence\", \"preds.*\")\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "c01761b3-c766-46b0-ae0b-fcf968ffb3a1", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 10:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------------------------------------------------------------------+--------+----------+\n", + "| sentence| label| score|\n", + "+--------------------------------------------------------------------------------+--------+----------+\n", + "| |POSITIVE|0.74812096|\n", + "|Hard up, No proper jobs going down at the pit, why not rent your kids! DIY pi...|NEGATIVE|0.99967253|\n", + "|I watched this movie to see the direction one of the most promising young tal...|POSITIVE| 0.9994943|\n", + "| This movie makes you wish imdb would let you vote a zero|NEGATIVE| 0.9981305|\n", + "|I never want to see this movie again!

Not only is it dreadfully ba...|NEGATIVE| 0.9988337|\n", + "|(As a note, I'd like to say that I saw this movie at my annual church camp, w...|POSITIVE| 0.9901974|\n", + "| Don't get me wrong, I love the TV series of League Of Gentlemen|POSITIVE| 0.9998311|\n", + "|Did you ever think, like after watching a horror movie with a group of friend...|POSITIVE| 0.9992779|\n", + "| Awful, awful, awful|NEGATIVE| 0.9997433|\n", + "|This movie seems a little clunky around the edges, like not quite enough zani...|NEGATIVE|0.99965274|\n", + "|I rented this movie hoping that it would provide some good entertainment and ...|NEGATIVE|0.99642426|\n", + "|Well, where to start describing this celluloid debacle? You already know the ...|NEGATIVE|0.99973005|\n", + "| I hoped for this show to be somewhat realistic|POSITIVE| 0.8426521|\n", + "| All I have to say is one word|NEGATIVE| 0.9784491|\n", + "|Honestly awful film, bad editing, awful lighting, dire dialog and scrappy scr...|NEGATIVE| 0.99977|\n", + "|This critique tells the story of 4 little friends who went to watch Angels an...|POSITIVE| 0.9942334|\n", + "| This review contains a partial spoiler|NEGATIVE| 0.996191|\n", + "| I'm rather surprised that anybody found this film touching or moving|POSITIVE| 0.8392786|\n", + "| If you like bad movies (and you must to watch this one) here's a good one|POSITIVE|0.99366415|\n", + "|This is really bad, the characters were bland, the story was boring, and ther...|NEGATIVE|0.99953806|\n", + "+--------------------------------------------------------------------------------+--------+----------+\n", + "only showing top 20 rows\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "preds.show(truncate=80)" + ] + }, + { + "cell_type": "markdown", + "id": "eb826fde-99d9-43fe-8ddc-f5acbe76b4e9", + "metadata": {}, + "source": [ + "### Using Triton Inference Server\n", + "\n", + "Note: you can restart the kernel and run from this point to simulate running in a different node or environment." + ] + }, + { + "cell_type": "markdown", + "id": "10368010-f94d-4167-91a1-2cf9ed91a2c9", + "metadata": {}, + "source": [ + "This notebook uses the [Python backend with a custom execution environment](https://github.com/triton-inference-server/python_backend#creating-custom-execution-environments), using a conda-pack environment created as follows:\n", + "```\n", + "conda create -n huggingface -c conda-forge python=3.8\n", + "conda activate huggingface\n", + "\n", + "export PYTHONUSERSITE=True\n", + "pip install conda-pack sentencepiece sentence_transformers transformers\n", + "\n", + "conda-pack # huggingface.tar.gz\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "4d4be844-4b8c-47df-bd09-0c280c7ff16b", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import os\n", + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.functions import col, struct, pandas_udf\n", + "from pyspark.sql.types import FloatType, StringType, StructField, StructType" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "7e53df9f-43cb-4c38-b8ac-dc2cbad99815", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", + "To disable this warning, you can either:\n", + "\t- Avoid using `tokenizers` before the fork if possible\n", + "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n" + ] + } + ], + "source": [ + "%%bash\n", + "# copy custom model to expected layout for Triton\n", + "rm -rf models\n", + "mkdir -p models\n", + "cp -r models_config/hf_pipeline models\n", + "\n", + "# add custom execution environment\n", + "cp huggingface.tar.gz models" + ] + }, + { + "cell_type": "markdown", + "id": "db4a5b06-126a-4bc4-baae-a45ea30832a7", + "metadata": { + "tags": [] + }, + "source": [ + "#### Start Triton Server on each executor" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "144acb8e-4c08-40fc-a9ed-f721c409ee68", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "[True]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "num_executors = 1\n", + "triton_models_dir = \"{}/models\".format(os.getcwd())\n", + "huggingface_cache_dir = \"{}/.cache/huggingface\".format(os.path.expanduser('~'))\n", + "nodeRDD = sc.parallelize(list(range(num_executors)), num_executors)\n", + "\n", + "def start_triton(it):\n", + " import docker\n", + " import time\n", + " import tritonclient.grpc as grpcclient\n", + " \n", + " client=docker.from_env()\n", + " containers=client.containers.list(filters={\"name\": \"spark-triton\"})\n", + " if containers:\n", + " print(\">>>> containers: {}\".format([c.short_id for c in containers]))\n", + " else:\n", + " container=client.containers.run(\n", + " \"nvcr.io/nvidia/tritonserver:23.04-py3\", \"tritonserver --model-repository=/models\",\n", + " detach=True,\n", + " device_requests=[docker.types.DeviceRequest(device_ids=[\"0\"], capabilities=[['gpu']])],\n", + " environment=[\n", + " \"TRANSFORMERS_CACHE=/cache\"\n", + " ],\n", + " name=\"spark-triton\",\n", + " network_mode=\"host\",\n", + " remove=True,\n", + " shm_size=\"256M\",\n", + " volumes={\n", + " triton_models_dir: {\"bind\": \"/models\", \"mode\": \"ro\"},\n", + " huggingface_cache_dir: {\"bind\": \"/cache\", \"mode\": \"rw\"}\n", + " }\n", + " )\n", + " print(\">>>> starting triton: {}\".format(container.short_id))\n", + " # wait for triton to be running\n", + " time.sleep(15)\n", + " \n", + " client = grpcclient.InferenceServerClient(\"localhost:8001\")\n", + " \n", + " elapsed = 0\n", + " timeout = 120\n", + " ready = False\n", + " while not ready and elapsed < timeout:\n", + " try:\n", + " time.sleep(5)\n", + " elapsed += 5\n", + " ready = client.is_server_ready()\n", + " except Exception as e:\n", + " pass\n", + "\n", + " return [True]\n", + "\n", + "nodeRDD.barrier().mapPartitions(start_triton).collect()" + ] + }, + { + "cell_type": "markdown", + "id": "c24d77ab-60d3-45eb-a9c2-dc811eca0af4", + "metadata": {}, + "source": [ + "#### Run inference" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "d53fb283-bf9e-4571-8c68-b75a41f1f067", + "metadata": {}, + "outputs": [], + "source": [ + "# only use first sentence of IMDB reviews\n", + "@pandas_udf(\"string\")\n", + "def first_sentence(text: pd.Series) -> pd.Series:\n", + " return pd.Series([s.split(\".\")[0] for s in text])\n", + "\n", + "df = spark.read.parquet(\"imdb_test\").withColumn(\"sentence\", first_sentence(col(\"lines\"))).select(\"sentence\").limit(1000)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "29b0cc0d-c480-4e4a-bd41-207dc314cba5", + "metadata": {}, + "outputs": [], + "source": [ + "def triton_fn(triton_uri, model_name):\n", + " import numpy as np\n", + " import tritonclient.grpc as grpcclient\n", + " \n", + " np_types = {\n", + " \"BOOL\": np.dtype(np.bool8),\n", + " \"INT8\": np.dtype(np.int8),\n", + " \"INT16\": np.dtype(np.int16),\n", + " \"INT32\": np.dtype(np.int32),\n", + " \"INT64\": np.dtype(np.int64),\n", + " \"FP16\": np.dtype(np.float16),\n", + " \"FP32\": np.dtype(np.float32),\n", + " \"FP64\": np.dtype(np.float64),\n", + " \"FP64\": np.dtype(np.double),\n", + " \"BYTES\": np.dtype(object)\n", + " }\n", + "\n", + " client = grpcclient.InferenceServerClient(triton_uri)\n", + " model_meta = client.get_model_metadata(model_name)\n", + " \n", + " def predict(inputs):\n", + " if isinstance(inputs, np.ndarray):\n", + " # single ndarray input\n", + " request = [grpcclient.InferInput(model_meta.inputs[0].name, inputs.shape, model_meta.inputs[0].datatype)]\n", + " request[0].set_data_from_numpy(inputs.astype(np_types[model_meta.inputs[0].datatype]))\n", + " else:\n", + " # dict of multiple ndarray inputs\n", + " request = [grpcclient.InferInput(i.name, inputs[i.name].shape, i.datatype) for i in model_meta.inputs]\n", + " for i in request:\n", + " i.set_data_from_numpy(inputs[i.name()].astype(np_types[i.datatype()]))\n", + " \n", + " response = client.infer(model_name, inputs=request)\n", + " \n", + " if len(model_meta.outputs) > 1:\n", + " # return dictionary of numpy arrays\n", + " return {o.name: response.as_numpy(o.name) for o in model_meta.outputs}\n", + " else:\n", + " # return single numpy array\n", + " return response.as_numpy(model_meta.outputs[0].name)\n", + " \n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "3930cfcd-3284-4c6a-a9b5-36b8053fe899", + "metadata": {}, + "outputs": [], + "source": [ + "from functools import partial\n", + "\n", + "classify = predict_batch_udf(partial(triton_fn, triton_uri=\"localhost:8001\", model_name=\"hf_pipeline\"),\n", + " return_type=StructType([\n", + " StructField(\"label\", StringType(), True),\n", + " StructField(\"score\", FloatType(), True)\n", + " ]),\n", + " input_tensor_shapes=[[1]],\n", + " batch_size=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "8eecbf23-4e9e-4d4c-8645-98209b25db2c", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 13:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 25.5 ms, sys: 0 ns, total: 25.5 ms\n", + "Wall time: 5.42 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "# first pass caches model/fn\n", + "# note: expanding the \"struct\" return_type to top-level columns\n", + "preds = df.withColumn(\"preds\", classify(struct(\"sentence\"))).select(\"sentence\", \"preds.*\")\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "566ba28c-0ca4-4479-a24a-c8a362228b89", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 14:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 11.6 ms, sys: 7.68 ms, total: 19.3 ms\n", + "Wall time: 4.52 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "# note: expanding the \"struct\" return_type to top-level columns\n", + "preds = df.withColumn(\"preds\", classify(\"sentence\")).select(\"sentence\", \"preds.*\")\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "44c7e776-08da-484a-ba07-9d6add1a0f15", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 15:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 13.1 ms, sys: 5.65 ms, total: 18.7 ms\n", + "Wall time: 4.51 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "# note: expanding the \"struct\" return_type to top-level columns\n", + "preds = df.withColumn(\"preds\", classify(col(\"sentence\"))).select(\"sentence\", \"preds.*\")\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "f61d79f8-661e-4d9e-a3aa-c0754b854603", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 16:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------------------------------------------------------------------+--------+----------+\n", + "| sentence| label| score|\n", + "+--------------------------------------------------------------------------------+--------+----------+\n", + "| |POSITIVE| 0.7481212|\n", + "|Hard up, No proper jobs going down at the pit, why not rent your kids! DIY pi...|NEGATIVE|0.99967253|\n", + "|I watched this movie to see the direction one of the most promising young tal...|POSITIVE| 0.9994943|\n", + "| This movie makes you wish imdb would let you vote a zero|NEGATIVE| 0.9981305|\n", + "|I never want to see this movie again!

Not only is it dreadfully ba...|NEGATIVE| 0.9988337|\n", + "|(As a note, I'd like to say that I saw this movie at my annual church camp, w...|POSITIVE| 0.9901974|\n", + "| Don't get me wrong, I love the TV series of League Of Gentlemen|POSITIVE| 0.9998311|\n", + "|Did you ever think, like after watching a horror movie with a group of friend...|POSITIVE| 0.9992779|\n", + "| Awful, awful, awful|NEGATIVE| 0.9997433|\n", + "|This movie seems a little clunky around the edges, like not quite enough zani...|NEGATIVE|0.99965274|\n", + "|I rented this movie hoping that it would provide some good entertainment and ...|NEGATIVE|0.99642426|\n", + "|Well, where to start describing this celluloid debacle? You already know the ...|NEGATIVE|0.99973005|\n", + "| I hoped for this show to be somewhat realistic|POSITIVE|0.84265035|\n", + "| All I have to say is one word|NEGATIVE| 0.9784491|\n", + "|Honestly awful film, bad editing, awful lighting, dire dialog and scrappy scr...|NEGATIVE| 0.99977|\n", + "|This critique tells the story of 4 little friends who went to watch Angels an...|POSITIVE| 0.9942334|\n", + "| This review contains a partial spoiler|NEGATIVE| 0.996191|\n", + "| I'm rather surprised that anybody found this film touching or moving|POSITIVE|0.83927685|\n", + "| If you like bad movies (and you must to watch this one) here's a good one|POSITIVE|0.99366415|\n", + "|This is really bad, the characters were bland, the story was boring, and ther...|NEGATIVE|0.99953806|\n", + "+--------------------------------------------------------------------------------+--------+----------+\n", + "only showing top 20 rows\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "preds.show(truncate=80)" + ] + }, + { + "cell_type": "markdown", + "id": "e197c146-1794-47f0-bcd9-7e8d8ab8625f", + "metadata": { + "tags": [] + }, + "source": [ + "#### Stop Triton Server on each executor" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "425d3b28-7705-45ba-8a18-ad34fc895219", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "[True]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def stop_triton(it):\n", + " import docker\n", + " import time\n", + " \n", + " client=docker.from_env()\n", + " containers=client.containers.list(filters={\"name\": \"spark-triton\"})\n", + " print(\">>>> stopping containers: {}\".format([c.short_id for c in containers]))\n", + " if containers:\n", + " container=containers[0]\n", + " container.stop(timeout=120)\n", + "\n", + " return [True]\n", + "\n", + "nodeRDD.barrier().mapPartitions(stop_triton).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "9f19643c-4ee4-44f2-b762-2078c0c8eba9", + "metadata": {}, + "outputs": [], + "source": [ + "spark.stop()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6a538c47-317d-4cac-b9b9-559e88677518", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/sentence_transformers.ipynb b/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/sentence_transformers.ipynb new file mode 100644 index 000000000..cb4b5d867 --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/huggingface/sentence_transformers.ipynb @@ -0,0 +1,937 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "777fc40d", + "metadata": {}, + "source": [ + "# PySpark Huggingface Inferencing\n", + "### Sentence Transformers\n", + "\n", + "From: https://huggingface.co/sentence-transformers" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "731faab7-a700-46f8-bba5-1c8764e5eacb", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/leey/.pyenv/versions/3.9.10/envs/spark_rapids_examples/lib/python3.9/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], + "source": [ + "from sentence_transformers import SentenceTransformer\n", + "model = SentenceTransformer('paraphrase-MiniLM-L6-v2')\n", + "\n", + "#Sentences we want to encode. Example:\n", + "sentence = ['This framework generates embeddings for each input sentence']\n", + "\n", + "\n", + "#Sentences are encoded by calling model.encode()\n", + "embedding = model.encode(sentence)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "96eea5ca-3cf7-46e3-b40c-598538112d24", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[-1.76214516e-01, 1.20601304e-01, -2.93624043e-01,\n", + " -2.29858175e-01, -8.22924003e-02, 2.37709180e-01,\n", + " 3.39985013e-01, -7.80964136e-01, 1.18127793e-01,\n", + " 1.63374111e-01, -1.37715325e-01, 2.40282863e-01,\n", + " 4.25125599e-01, 1.72417879e-01, 1.05279416e-01,\n", + " 5.18164098e-01, 6.22219592e-02, 3.99285942e-01,\n", + " -1.81652382e-01, -5.85578799e-01, 4.49718162e-02,\n", + " -1.72750458e-01, -2.68443376e-01, -1.47386298e-01,\n", + " -1.89217895e-01, 1.92150623e-01, -3.83842528e-01,\n", + " -3.96006793e-01, 4.30648834e-01, -3.15320045e-01,\n", + " 3.65949810e-01, 6.05160184e-02, 3.57326001e-01,\n", + " 1.59736484e-01, -3.00984085e-01, 2.63250291e-01,\n", + " -3.94310981e-01, 1.84855387e-01, -3.99549156e-01,\n", + " -2.67889678e-01, -5.45117497e-01, -3.13403830e-02,\n", + " -4.30644304e-01, 1.33278236e-01, -1.74793929e-01,\n", + " -4.35465544e-01, -4.77378905e-01, 7.12556019e-02,\n", + " -7.37000927e-02, 5.69136977e-01, -2.82579631e-01,\n", + " 5.24974912e-02, -8.20008039e-01, 1.98296875e-01,\n", + " 1.69511944e-01, 2.71780223e-01, 2.64610887e-01,\n", + " -2.55740248e-02, -1.74096078e-01, 1.63314238e-01,\n", + " -3.95261019e-01, -3.17557529e-02, -2.62556016e-01,\n", + " 3.52754653e-01, 3.01434726e-01, -1.47197261e-01,\n", + " 2.10075721e-01, -1.84010327e-01, -4.12896097e-01,\n", + " 4.14775908e-01, -1.89769432e-01, -1.35482103e-01,\n", + " -3.79272342e-01, -4.68020253e-02, -3.33600566e-02,\n", + " 9.00392979e-02, -3.30133080e-01, -3.87317017e-02,\n", + " 3.75082225e-01, -1.46996513e-01, 4.34959859e-01,\n", + " 5.38325727e-01, -2.65445322e-01, 1.64445966e-01,\n", + " 4.17078137e-01, -4.72507551e-02, -7.48731717e-02,\n", + " -4.26260680e-01, -1.96994469e-01, 6.10315353e-02,\n", + " -4.74262595e-01, -6.48334563e-01, 3.71462375e-01,\n", + " 2.50956744e-01, 1.22529656e-01, 8.88765603e-02,\n", + " -1.06724449e-01, 5.33984527e-02, 9.74504799e-02,\n", + " -3.46659198e-02, -1.02882944e-01, 2.32289046e-01,\n", + " -2.53739715e-01, -5.13112009e-01, 1.85215965e-01,\n", + " -3.04357857e-01, -3.55209708e-02, -1.26975283e-01,\n", + " -7.71633461e-02, -5.15329778e-01, -2.28072166e-01,\n", + " 2.03343891e-02, 7.38176629e-02, -1.52558297e-01,\n", + " -4.00837600e-01, -2.47749388e-01, 3.97470415e-01,\n", + " -2.60260761e-01, 2.50905871e-01, 1.68229103e-01,\n", + " 1.33900389e-01, -2.10832264e-02, -4.70035672e-01,\n", + " 4.78850305e-01, 2.80345857e-01, -4.64546710e-01,\n", + " 3.21746945e-01, 2.34207466e-01, 2.45772362e-01,\n", + " -4.71482247e-01, 5.00401437e-01, 4.10190284e-01,\n", + " 5.15217066e-01, 2.62549222e-01, 2.11592801e-02,\n", + " -3.89687479e-01, -2.41742760e-01, -2.14834422e-01,\n", + " -8.62650797e-02, -1.65323481e-01, -5.21896258e-02,\n", + " 3.41875046e-01, 4.50314254e-01, -3.06973517e-01,\n", + " -2.02294275e-01, 6.85521781e-01, -5.33892572e-01,\n", + " 3.58471453e-01, 1.45286813e-01, -7.07055628e-02,\n", + " -1.50529206e-01, -8.56279060e-02, -7.67850205e-02,\n", + " 1.89544708e-01, -1.04067393e-01, 5.33544004e-01,\n", + " -5.27887166e-01, 2.42331959e-02, -2.64348119e-01,\n", + " -2.23186791e-01, -3.81208628e-01, 7.59914368e-02,\n", + " -4.64485019e-01, -3.36549103e-01, 4.21229810e-01,\n", + " 1.07479259e-01, 1.90457568e-01, 2.89495080e-03,\n", + " -1.08513527e-01, 1.53545514e-01, 3.16023558e-01,\n", + " -2.70837210e-02, -5.40594459e-01, 8.97289440e-02,\n", + " -1.15549557e-01, 3.97803813e-01, -4.97683465e-01,\n", + " -2.84893245e-01, 4.99861389e-02, 3.61279517e-01,\n", + " 6.90535426e-01, 1.46821350e-01, 1.73396409e-01,\n", + " -1.74582213e-01, -3.15702498e-01, 6.72999024e-02,\n", + " 2.17250124e-01, 9.78534073e-02, -1.29472524e-01,\n", + " -1.86929733e-01, 1.34877980e-01, -1.53885141e-01,\n", + " 7.44716451e-02, -1.85536250e-01, -2.80628234e-01,\n", + " -1.14144124e-01, 4.12249714e-01, 6.39493242e-02,\n", + " -1.45715356e-01, -9.82063636e-02, -1.33081853e-01,\n", + " -1.88410729e-01, -2.84840688e-02, -3.49510685e-02,\n", + " 3.34260389e-02, 6.98895752e-02, 1.90354556e-01,\n", + " -2.96724111e-01, 2.64700665e-03, 1.09140664e-01,\n", + " 1.70893949e-02, 2.60589182e-01, 3.29038322e-01,\n", + " -6.61561564e-02, 2.39665493e-01, -2.26194724e-01,\n", + " -3.36869434e-02, 1.49400219e-01, -3.21265519e-01,\n", + " -2.68578082e-01, 5.72631419e-01, -4.92308617e-01,\n", + " 2.00666517e-01, -3.49261880e-01, -2.89886966e-02,\n", + " 6.09010518e-01, -5.72333217e-01, 2.35000581e-01,\n", + " 6.47170283e-03, -3.14947553e-02, 2.78106760e-02,\n", + " -3.90340686e-01, -2.08949789e-01, -3.04452747e-01,\n", + " -7.20199049e-02, -8.29839855e-02, 3.73792797e-01,\n", + " 7.38939270e-02, -2.21075043e-02, 9.88139212e-02,\n", + " -1.51426777e-01, -1.40430599e-01, 2.26017937e-01,\n", + " 2.76090086e-01, -8.87750760e-02, -1.12816244e-01,\n", + " -2.66285956e-01, 2.77834475e-01, -4.75612208e-02,\n", + " 6.71006441e-02, -2.78584342e-02, -2.39992719e-02,\n", + " 2.51708895e-01, 4.68793869e-01, -5.39325416e-01,\n", + " 1.10598333e-01, -3.44947278e-01, 4.15990025e-01,\n", + " 7.28482902e-02, -3.19647491e-01, 4.90374297e-01,\n", + " -7.30326539e-03, -2.64258590e-03, 9.63711143e-01,\n", + " 3.23884934e-01, -7.79617876e-02, -2.37589255e-01,\n", + " 2.34038249e-01, -3.16054285e-01, -1.65644684e-03,\n", + " -1.09070671e+00, 3.38409394e-01, 4.70604822e-02,\n", + " 1.07435532e-01, -2.06672445e-01, 4.26434958e-03,\n", + " -1.38471671e-03, -5.31455398e-01, -2.75648385e-01,\n", + " -1.64648548e-01, -3.42916548e-01, -4.26118731e-01,\n", + " 6.01812005e-01, 4.55971926e-01, -2.72701979e-01,\n", + " -3.45803909e-02, 2.62752384e-01, -6.34182245e-03,\n", + " 2.79631168e-01, -2.53559083e-01, -1.68626398e-01,\n", + " 3.82935070e-02, 2.07763270e-01, -4.31525737e-01,\n", + " -7.24000186e-02, -1.26854718e-01, 2.07032599e-02,\n", + " 5.74441671e-01, 3.54672760e-01, 9.28299800e-02,\n", + " 6.70504868e-02, 1.11520380e-01, -1.86511762e-02,\n", + " 4.62352008e-01, 2.72504658e-01, -3.60473931e-01,\n", + " 5.29415190e-01, -1.00307481e-03, -8.81362036e-02,\n", + " 1.49975210e-01, 5.25863320e-02, 4.63517606e-01,\n", + " -3.96831453e-01, 2.42640764e-01, -2.08912343e-01,\n", + " 3.65672171e-01, -4.73377790e-04, 5.33963263e-01,\n", + " -1.97879702e-01, 3.11582834e-01, -6.96714938e-01,\n", + " -4.29500610e-01, -4.49359357e-01, -2.71370225e-02,\n", + " -6.98709935e-02, 2.06174642e-01, -1.57107607e-01,\n", + " 4.43521231e-01, -6.74267113e-02, -3.00924242e-01,\n", + " 5.14859617e-01, 3.36029500e-01, 6.63374960e-02,\n", + " -1.15235247e-01, -2.95980442e-02, 2.79471934e-01,\n", + " -3.48198377e-02, -7.29323775e-02, -4.58472818e-02,\n", + " 1.54262766e-01, 8.09356093e-01, 5.20328283e-01,\n", + " -4.02114809e-01, -3.23153809e-02, -1.10363849e-01,\n", + " 7.50504881e-02, -1.51098818e-01, 8.45739901e-01,\n", + " -1.80844069e-01, 3.22573632e-01, 1.04708232e-01,\n", + " 3.19663674e-01, -1.55085340e-01, 1.69236794e-01,\n", + " -2.56996810e-01, 2.01208934e-01, 1.77392989e-01,\n", + " -2.74333209e-01, -3.36944401e-01, 5.02356768e-01,\n", + " -1.18357144e-01, -2.01166883e-01, -5.36485732e-01,\n", + " -7.69810155e-02, 1.15381051e-02, -2.36464351e-01,\n", + " -2.98769865e-02, 1.31366819e-01, 2.94184357e-01,\n", + " 9.90916416e-02, -5.43897390e-01, 1.40812859e-01,\n", + " 3.66998732e-01, 5.04862480e-02, 1.99122518e-01,\n", + " -2.80674607e-01, 4.34192210e-01, -1.40274912e-01,\n", + " 5.78049004e-01, 1.77715704e-01, 8.98363292e-02,\n", + " 3.29651982e-01, 6.13008998e-02, -3.24933499e-01]], dtype=float32)" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "embedding" + ] + }, + { + "cell_type": "markdown", + "id": "546eabe0", + "metadata": {}, + "source": [ + "## PySpark" + ] + }, + { + "cell_type": "markdown", + "id": "e8938317-e31e-4e8d-b2d8-f92c1b5a300c", + "metadata": {}, + "source": [ + "## Inference using Spark DL API\n", + "Note: you can restart the kernel and run from this point to simulate running in a different node or environment." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "dbda3e66-005a-4ad0-8017-c1cc7cbf0058", + "metadata": {}, + "outputs": [], + "source": [ + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.functions import col, struct\n", + "from pyspark.sql.types import ArrayType, FloatType" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "836e5f84-12c6-4c95-838e-53de7e46a20b", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "# only use first N examples, since this is slow\n", + "df = spark.read.parquet(\"imdb_test\").limit(100).cache()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "36703d23-37a3-40df-b09a-c68206d285b6", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 1:==============================================> (8 + 2) / 10]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------------------------------------------------------------------------------------------------------------------+\n", + "| lines|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "|...But not this one! I always wanted to know \"what happened\" next. We will never know for sure what happened because ...|\n", + "|Hard up, No proper jobs going down at the pit, why not rent your kids! DIY pimp story without the gratuitous sex scen...|\n", + "|I watched this movie to see the direction one of the most promising young talents in movies was going. Unfortunately,...|\n", + "|This movie makes you wish imdb would let you vote a zero. One of the two movies I've ever walked out of. It's very ha...|\n", + "|I never want to see this movie again!

Not only is it dreadfully bad, but I can't stand seeing my hero Stan...|\n", + "|(As a note, I'd like to say that I saw this movie at my annual church camp, where the entire youth group laughed at i...|\n", + "|Don't get me wrong, I love the TV series of League Of Gentlemen. It was funny, twisted and completely inspired. I was...|\n", + "|Did you ever think, like after watching a horror movie with a group of friends: \"Wow, this is so cool! We have got to...|\n", + "|Awful, awful, awful...

I loved the original film. It was funny, charming, and had heart... this piece of j...|\n", + "|This movie seems a little clunky around the edges, like not quite enough zaniness was thrown it when it should have b...|\n", + "|I rented this movie hoping that it would provide some good entertainment and some cool poker knowledge or stories. Wh...|\n", + "|Well, where to start describing this celluloid debacle? You already know the big fat NADA passing as a plot, so let's...|\n", + "|I hoped for this show to be somewhat realistic. It stroke me as just another mainstream show after I watched it. I di...|\n", + "|All I have to say is one word...SUCKS!!!!. The only reason I gave this a 2 is because Josh Hartnett was in it and he'...|\n", + "|Honestly awful film, bad editing, awful lighting, dire dialog and scrappy screenplay.

The lighting at is s...|\n", + "|This critique tells the story of 4 little friends who went to watch Angels and Demons the movie on the first night it...|\n", + "|This review contains a partial spoiler.

Shallow from the outset, 'D.O.A.' at least starts as if it might b...|\n", + "|I'm rather surprised that anybody found this film touching or moving.

The basic premise of the film sounde...|\n", + "|If you like bad movies (and you must to watch this one) here's a good one. Not quite as funny as the first, but much ...|\n", + "|This is really bad, the characters were bland, the story was boring, and there is no sex scene. Furthermore, it lacks...|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "only showing top 20 rows\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "df.show(truncate=120)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "f780c026-0f3f-4aea-8b61-5b3dbae83fb7", + "metadata": {}, + "outputs": [], + "source": [ + "def predict_batch_fn():\n", + " from sentence_transformers import SentenceTransformer\n", + " model = SentenceTransformer(\"paraphrase-MiniLM-L6-v2\")\n", + " def predict(inputs):\n", + " return model.encode(inputs.tolist())\n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "f5c88ddc-ca19-4430-8b0e-b9fae143b237", + "metadata": {}, + "outputs": [], + "source": [ + "encode = predict_batch_udf(predict_batch_fn,\n", + " return_type=ArrayType(FloatType()),\n", + " batch_size=10)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "85344c22-4a4d-4cb0-8771-5836ae2794db", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 4:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 17.8 ms, sys: 9.35 ms, total: 27.2 ms\n", + "Wall time: 8.36 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "# first pass caches model/fn\n", + "embeddings = df.withColumn(\"encoding\", encode(struct(\"lines\")))\n", + "results = embeddings.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "c23bb885-6ab0-4471-943d-4c10414100fa", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 6:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 17.7 ms, sys: 1.13 ms, total: 18.8 ms\n", + "Wall time: 3.25 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "embeddings = df.withColumn(\"encoding\", encode(\"lines\"))\n", + "results = embeddings.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "93bc6da3-d853-4233-b805-cb4a46f4f9b9", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 8:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 16.9 ms, sys: 0 ns, total: 16.9 ms\n", + "Wall time: 2.91 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "embeddings = df.withColumn(\"encoding\", encode(col(\"lines\")))\n", + "results = embeddings.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "2073616f-7151-4760-92f2-441dd0bfe9fe", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------------------------------------------------------+------------------------------------------------------------+\n", + "| lines| encoding|\n", + "+------------------------------------------------------------+------------------------------------------------------------+\n", + "|...But not this one! I always wanted to know \"what happen...|[0.050629966, -0.19899231, 2.686046E-4, 0.13270327, -0.16...|\n", + "|Hard up, No proper jobs going down at the pit, why not re...|[0.08634103, -0.002254839, 0.10213216, -0.03454912, -0.23...|\n", + "|I watched this movie to see the direction one of the most...|[0.008758117, -0.0083419345, -0.119090386, 0.025434377, -...|\n", + "|This movie makes you wish imdb would let you vote a zero....|[0.24080081, -0.14614257, 0.18119521, 0.118741795, 0.1022...|\n", + "|I never want to see this movie again!

Not only...|[0.32271573, -0.14145091, 0.09245593, 0.04562203, 0.07219...|\n", + "|(As a note, I'd like to say that I saw this movie at my a...|[0.1308969, 0.14792246, -0.021109976, -0.16882573, -0.055...|\n", + "|Don't get me wrong, I love the TV series of League Of Gen...|[-0.19420472, 0.116419405, 0.01985946, -0.37481546, 0.052...|\n", + "|Did you ever think, like after watching a horror movie wi...|[0.050077364, -0.34728476, -0.47222477, 0.09191189, -0.16...|\n", + "|Awful, awful, awful...

I loved the original fi...|[-0.23921771, -0.22389278, -0.0042956644, 0.058358684, 0....|\n", + "|This movie seems a little clunky around the edges, like n...|[-0.12948105, -0.16344212, -0.28761974, -0.10628598, -0.0...|\n", + "|I rented this movie hoping that it would provide some goo...|[-0.030982, -0.13821997, 0.14594209, -0.20565805, -0.0225...|\n", + "|Well, where to start describing this celluloid debacle? Y...|[-0.29094818, 0.026240889, -0.21248402, 0.028826537, -0.1...|\n", + "|I hoped for this show to be somewhat realistic. It stroke...|[0.14481407, -0.13123356, -0.47293735, -0.21168816, 0.001...|\n", + "|All I have to say is one word...SUCKS!!!!. The only reaso...|[0.018178312, 0.11847291, -0.33938172, -0.15572134, 0.051...|\n", + "|Honestly awful film, bad editing, awful lighting, dire di...|[-0.10033801, -0.28231186, 0.18979141, 0.042497832, 0.125...|\n", + "|This critique tells the story of 4 little friends who wen...|[0.1318425, -0.1671868, -0.013854267, 0.14505053, -0.2534...|\n", + "|This review contains a partial spoiler.

Shallo...|[-0.08296674, -0.08548329, -0.13219479, -0.20946309, 0.01...|\n", + "|I'm rather surprised that anybody found this film touchin...|[-0.21176083, -0.12755248, -0.28217235, 0.02004116, 0.074...|\n", + "|If you like bad movies (and you must to watch this one) h...|[-0.38088003, -0.1916466, 0.16510564, -0.11013024, -0.233...|\n", + "|This is really bad, the characters were bland, the story ...|[0.09919267, 0.042636175, -0.17805319, -0.1818586, -0.123...|\n", + "+------------------------------------------------------------+------------------------------------------------------------+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "embeddings.show(truncate=60)" + ] + }, + { + "cell_type": "markdown", + "id": "b730f5a3-f7eb-42aa-8869-881ecd0f5542", + "metadata": {}, + "source": [ + "### Using Triton Inference Server\n", + "\n", + "Note: you can restart the kernel and run from this point to simulate running in a different node or environment." + ] + }, + { + "cell_type": "markdown", + "id": "a8211920-234e-480f-bf87-6d719090e292", + "metadata": {}, + "source": [ + "This notebook uses the [Python backend with a custom execution environment](https://github.com/triton-inference-server/python_backend#creating-custom-execution-environments), using a conda-pack environment created as follows:\n", + "```\n", + "conda create -n huggingface -c conda-forge python=3.8\n", + "conda activate huggingface\n", + "\n", + "export PYTHONUSERSITE=True\n", + "pip install conda-pack sentencepiece sentence_transformers transformers\n", + "\n", + "conda-pack # huggingface.tar.gz\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "772e337e-1098-4c7b-ba81-8cb221a518e2", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import os\n", + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.functions import col, struct\n", + "from pyspark.sql.types import ArrayType, FloatType" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "69d0c93a-bb0b-46c5-9d28-7b08a2e70964", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", + "To disable this warning, you can either:\n", + "\t- Avoid using `tokenizers` before the fork if possible\n", + "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n" + ] + } + ], + "source": [ + "%%bash\n", + "# copy custom model to expected layout for Triton\n", + "rm -rf models\n", + "mkdir -p models\n", + "cp -r models_config/hf_transformer models\n", + "\n", + "# add custom execution environment\n", + "cp huggingface.tar.gz models" + ] + }, + { + "cell_type": "markdown", + "id": "dd4d7d4b-1a0b-4c5f-bc93-be2a039b6ea0", + "metadata": { + "tags": [] + }, + "source": [ + "#### Start Triton Server on each executor" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "1654cdc1-4f9a-4fd5-b7ac-6ca4215bde5d", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "[True]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "num_executors = 1\n", + "triton_models_dir = \"{}/models\".format(os.getcwd())\n", + "huggingface_cache_dir = \"{}/.cache/huggingface\".format(os.path.expanduser('~'))\n", + "nodeRDD = sc.parallelize(list(range(num_executors)), num_executors)\n", + "\n", + "def start_triton(it):\n", + " import docker\n", + " import time\n", + " import tritonclient.grpc as grpcclient\n", + " \n", + " client=docker.from_env()\n", + " containers=client.containers.list(filters={\"name\": \"spark-triton\"})\n", + " if containers:\n", + " print(\">>>> containers: {}\".format([c.short_id for c in containers]))\n", + " else:\n", + " container=client.containers.run(\n", + " \"nvcr.io/nvidia/tritonserver:23.04-py3\", \"tritonserver --model-repository=/models\",\n", + " detach=True,\n", + " device_requests=[docker.types.DeviceRequest(device_ids=[\"0\"], capabilities=[['gpu']])],\n", + " environment=[\n", + " \"TRANSFORMERS_CACHE=/cache\"\n", + " ],\n", + " name=\"spark-triton\",\n", + " network_mode=\"host\",\n", + " remove=True,\n", + " shm_size=\"512M\",\n", + " volumes={\n", + " triton_models_dir: {\"bind\": \"/models\", \"mode\": \"ro\"},\n", + " huggingface_cache_dir: {\"bind\": \"/cache\", \"mode\": \"rw\"}\n", + " }\n", + " )\n", + " print(\">>>> starting triton: {}\".format(container.short_id))\n", + "\n", + " # wait for triton to be running\n", + " time.sleep(15)\n", + " client = grpcclient.InferenceServerClient(\"localhost:8001\")\n", + " ready = False\n", + " while not ready:\n", + " try:\n", + " ready = client.is_server_ready()\n", + " except Exception as e:\n", + " time.sleep(5)\n", + "\n", + " return [True]\n", + "\n", + "nodeRDD.barrier().mapPartitions(start_triton).collect()" + ] + }, + { + "cell_type": "markdown", + "id": "ee34de5f-89f8-455e-b45e-a557a4ab0f05", + "metadata": {}, + "source": [ + "#### Run inference" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "2969d502-e97b-49d6-bf80-7d177ae867cf", + "metadata": {}, + "outputs": [], + "source": [ + "from functools import partial\n", + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.functions import col, struct\n", + "from pyspark.sql.types import ArrayType, FloatType" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "c8f1e6d6-6519-49e7-8465-4419547633b8", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/05/19 19:15:37 WARN CacheManager: Asked to cache already cached data.\n" + ] + } + ], + "source": [ + "# only use first N examples, since this is slow\n", + "df = spark.read.parquet(\"imdb_test\").limit(100).cache()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "29b0cc0d-c480-4e4a-bd41-207dc314cba5", + "metadata": {}, + "outputs": [], + "source": [ + "def triton_fn(triton_uri, model_name):\n", + " import numpy as np\n", + " import tritonclient.grpc as grpcclient\n", + " \n", + " np_types = {\n", + " \"BOOL\": np.dtype(np.bool8),\n", + " \"INT8\": np.dtype(np.int8),\n", + " \"INT16\": np.dtype(np.int16),\n", + " \"INT32\": np.dtype(np.int32),\n", + " \"INT64\": np.dtype(np.int64),\n", + " \"FP16\": np.dtype(np.float16),\n", + " \"FP32\": np.dtype(np.float32),\n", + " \"FP64\": np.dtype(np.float64),\n", + " \"FP64\": np.dtype(np.double),\n", + " \"BYTES\": np.dtype(object)\n", + " }\n", + "\n", + " client = grpcclient.InferenceServerClient(triton_uri)\n", + " model_meta = client.get_model_metadata(model_name)\n", + " \n", + " def predict(inputs):\n", + " if isinstance(inputs, np.ndarray):\n", + " # single ndarray input\n", + " request = [grpcclient.InferInput(model_meta.inputs[0].name, inputs.shape, model_meta.inputs[0].datatype)]\n", + " request[0].set_data_from_numpy(inputs.astype(np_types[model_meta.inputs[0].datatype]))\n", + " else:\n", + " # dict of multiple ndarray inputs\n", + " request = [grpcclient.InferInput(i.name, inputs[i.name].shape, i.datatype) for i in model_meta.inputs]\n", + " for i in request:\n", + " i.set_data_from_numpy(inputs[i.name()].astype(np_types[i.datatype()]))\n", + " \n", + " response = client.infer(model_name, inputs=request)\n", + " \n", + " if len(model_meta.outputs) > 1:\n", + " # return dictionary of numpy arrays\n", + " return {o.name: response.as_numpy(o.name) for o in model_meta.outputs}\n", + " else:\n", + " # return single numpy array\n", + " return response.as_numpy(model_meta.outputs[0].name)\n", + " \n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "9c712b8f-6eb4-4fb8-9f0a-04feef847fea", + "metadata": {}, + "outputs": [], + "source": [ + "encode = predict_batch_udf(partial(triton_fn, triton_uri=\"localhost:8001\", model_name=\"hf_transformer\"),\n", + " return_type=ArrayType(FloatType()),\n", + " input_tensor_shapes=[[1]],\n", + " batch_size=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "934c1a1f-b126-45b0-9c15-265236820ad3", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 14:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 19.7 ms, sys: 3.95 ms, total: 23.6 ms\n", + "Wall time: 2.67 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "# first pass caches model/fn\n", + "embeddings = df.withColumn(\"encoding\", encode(struct(\"lines\")))\n", + "results = embeddings.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "f84cd3f6-b6a8-4142-859a-91f3c183457b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 7.66 ms, sys: 3.04 ms, total: 10.7 ms\n", + "Wall time: 265 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "embeddings = df.withColumn(\"encoding\", encode(\"lines\"))\n", + "results = embeddings.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "921a4c01-e296-4406-be90-86f20c8c582d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 12.6 ms, sys: 570 µs, total: 13.2 ms\n", + "Wall time: 261 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "embeddings = df.withColumn(\"encoding\", encode(col(\"lines\")))\n", + "results = embeddings.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "9f67584e-9c4e-474f-b6ea-7811b14d116e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------------------------------------------------------+------------------------------------------------------------+\n", + "| lines| encoding|\n", + "+------------------------------------------------------------+------------------------------------------------------------+\n", + "|...But not this one! I always wanted to know \"what happen...|[0.050629944, -0.19899224, 2.68735E-4, 0.13270333, -0.160...|\n", + "|Hard up, No proper jobs going down at the pit, why not re...|[0.08634147, -0.002254737, 0.10213226, -0.034549147, -0.2...|\n", + "|I watched this movie to see the direction one of the most...|[0.008757966, -0.008341991, -0.11909033, 0.02543464, -0.2...|\n", + "|This movie makes you wish imdb would let you vote a zero....|[0.24080098, -0.14614293, 0.1811954, 0.11874188, 0.102292...|\n", + "|I never want to see this movie again!

Not only...|[0.3227157, -0.14145078, 0.0924558, 0.045622032, 0.072197...|\n", + "|(As a note, I'd like to say that I saw this movie at my a...|[0.13089702, 0.1479226, -0.021110116, -0.16882578, -0.055...|\n", + "|Don't get me wrong, I love the TV series of League Of Gen...|[-0.19420475, 0.11641937, 0.019859463, -0.37481567, 0.052...|\n", + "|Did you ever think, like after watching a horror movie wi...|[0.050077528, -0.34728497, -0.4722248, 0.091912046, -0.16...|\n", + "|Awful, awful, awful...

I loved the original fi...|[-0.2392176, -0.22389287, -0.004295718, 0.05835876, 0.082...|\n", + "|This movie seems a little clunky around the edges, like n...|[-0.12948103, -0.16344213, -0.2876199, -0.106286034, -0.0...|\n", + "|I rented this movie hoping that it would provide some goo...|[-0.03098194, -0.13821997, 0.1459418, -0.20565815, -0.022...|\n", + "|Well, where to start describing this celluloid debacle? Y...|[-0.29094803, 0.026240645, -0.21248397, 0.028826557, -0.1...|\n", + "|I hoped for this show to be somewhat realistic. It stroke...|[0.14481404, -0.13123384, -0.47293738, -0.21168788, 0.001...|\n", + "|All I have to say is one word...SUCKS!!!!. The only reaso...|[0.018178271, 0.11847262, -0.3393819, -0.15572123, 0.0515...|\n", + "|Honestly awful film, bad editing, awful lighting, dire di...|[-0.10033788, -0.28231215, 0.18979158, 0.042498272, 0.125...|\n", + "|This critique tells the story of 4 little friends who wen...|[0.13184246, -0.16718695, -0.013854082, 0.14505032, -0.25...|\n", + "|This review contains a partial spoiler.

Shallo...|[-0.08296674, -0.08548302, -0.1321949, -0.20946284, 0.010...|\n", + "|I'm rather surprised that anybody found this film touchin...|[-0.21176091, -0.1275524, -0.28217238, 0.020041106, 0.074...|\n", + "|If you like bad movies (and you must to watch this one) h...|[-0.38088012, -0.19164667, 0.16510546, -0.11012972, -0.23...|\n", + "|This is really bad, the characters were bland, the story ...|[0.099192545, 0.04263605, -0.17805345, -0.18185869, -0.12...|\n", + "+------------------------------------------------------------+------------------------------------------------------------+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "embeddings.show(truncate=60)" + ] + }, + { + "cell_type": "markdown", + "id": "e3b0077c-785f-41af-9fa9-812e7fb63810", + "metadata": { + "tags": [] + }, + "source": [ + "#### Stop Triton Server on each executor" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "d8e5466b-b5dc-4fe1-9012-0c87cdd72962", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "[True]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def stop_triton(it):\n", + " import docker\n", + " import time\n", + " \n", + " client=docker.from_env()\n", + " containers=client.containers.list(filters={\"name\": \"spark-triton\"})\n", + " print(\">>>> stopping containers: {}\".format([c.short_id for c in containers]))\n", + " if containers:\n", + " container=containers[0]\n", + " container.stop(timeout=120)\n", + "\n", + " return [True]\n", + "\n", + "nodeRDD.barrier().mapPartitions(stop_triton).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "e82b9518-da7b-4ebc-8990-c8ab909bec18", + "metadata": {}, + "outputs": [], + "source": [ + "spark.stop()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33a60f2d-295a-4270-a2fd-16559962edda", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/pytorch/image_classification.ipynb b/examples/ML+DL-Examples/Spark-DL/dl_inference/pytorch/image_classification.ipynb new file mode 100644 index 000000000..8d685eff5 --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/pytorch/image_classification.ipynb @@ -0,0 +1,2180 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9e87c927", + "metadata": {}, + "source": [ + "# PySpark PyTorch Inference\n", + "\n", + "### Image Classification\n", + "Based on: https://pytorch.org/tutorials/beginner/basics/quickstart_tutorial.html" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "91d7ec98", + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "\n", + "from torch import nn\n", + "from torch.utils.data import DataLoader\n", + "from torchvision import datasets\n", + "from torchvision.transforms import ToTensor" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "d714f40d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'2.0.1+cpu'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "torch.__version__" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "1c942a46", + "metadata": {}, + "outputs": [], + "source": [ + "# Download training data from open datasets.\n", + "training_data = datasets.FashionMNIST(\n", + " root=\"data\",\n", + " train=True,\n", + " download=True,\n", + " transform=ToTensor(),\n", + ")\n", + "\n", + "# Download test data from open datasets.\n", + "test_data = datasets.FashionMNIST(\n", + " root=\"data\",\n", + " train=False,\n", + " download=True,\n", + " transform=ToTensor(),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "4a89aa8e-ef62-4aac-8260-4b004f2c1b55", + "metadata": {}, + "outputs": [], + "source": [ + "classes = [\n", + " \"T-shirt/top\",\n", + " \"Trouser\",\n", + " \"Pullover\",\n", + " \"Dress\",\n", + " \"Coat\",\n", + " \"Sandal\",\n", + " \"Shirt\",\n", + " \"Sneaker\",\n", + " \"Bag\",\n", + " \"Ankle boot\",\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "10a97111", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Shape of X [N, C, H, W]: torch.Size([64, 1, 28, 28]) torch.float32\n", + "Shape of y: torch.Size([64]) torch.int64\n" + ] + } + ], + "source": [ + "batch_size = 64\n", + "\n", + "# Create data loaders.\n", + "train_dataloader = DataLoader(training_data, batch_size=batch_size)\n", + "test_dataloader = DataLoader(test_data, batch_size=batch_size)\n", + "\n", + "for X, y in test_dataloader:\n", + " print(f\"Shape of X [N, C, H, W]: {X.shape} {X.dtype}\")\n", + " print(f\"Shape of y: {y.shape} {y.dtype}\")\n", + " break" + ] + }, + { + "cell_type": "markdown", + "id": "ca7af350", + "metadata": {}, + "source": [ + "### Create model" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "512d0bc7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using cpu device\n", + "NeuralNetwork(\n", + " (flatten): Flatten(start_dim=1, end_dim=-1)\n", + " (linear_relu_stack): Sequential(\n", + " (0): Linear(in_features=784, out_features=512, bias=True)\n", + " (1): ReLU()\n", + " (2): Linear(in_features=512, out_features=512, bias=True)\n", + " (3): ReLU()\n", + " (4): Linear(in_features=512, out_features=10, bias=True)\n", + " )\n", + ")\n" + ] + } + ], + "source": [ + "# Get cpu or gpu device for training.\n", + "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", + "print(f\"Using {device} device\")\n", + "\n", + "# Define model\n", + "class NeuralNetwork(nn.Module):\n", + " def __init__(self):\n", + " super(NeuralNetwork, self).__init__()\n", + " self.flatten = nn.Flatten()\n", + " self.linear_relu_stack = nn.Sequential(\n", + " nn.Linear(28*28, 512),\n", + " nn.ReLU(),\n", + " nn.Linear(512, 512),\n", + " nn.ReLU(),\n", + " nn.Linear(512, 10)\n", + " )\n", + "\n", + " def forward(self, x):\n", + " x = self.flatten(x)\n", + " logits = self.linear_relu_stack(x)\n", + " return logits\n", + "\n", + "model = NeuralNetwork().to(device)\n", + "print(model)" + ] + }, + { + "cell_type": "markdown", + "id": "4573c1b7", + "metadata": {}, + "source": [ + "### Train Model" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "4d4f5538", + "metadata": {}, + "outputs": [], + "source": [ + "loss_fn = nn.CrossEntropyLoss()\n", + "optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "92d9076a", + "metadata": {}, + "outputs": [], + "source": [ + "def train(dataloader, model, loss_fn, optimizer):\n", + " size = len(dataloader.dataset)\n", + " model.train()\n", + " for batch, (X, y) in enumerate(dataloader):\n", + " X, y = X.to(device), y.to(device)\n", + "\n", + " # Compute prediction error\n", + " pred = model(X)\n", + " loss = loss_fn(pred, y)\n", + "\n", + " # Backpropagation\n", + " optimizer.zero_grad()\n", + " loss.backward()\n", + " optimizer.step()\n", + "\n", + " if batch % 100 == 0:\n", + " loss, current = loss.item(), batch * len(X)\n", + " print(f\"loss: {loss:>7f} [{current:>5d}/{size:>5d}]\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "11c5650d", + "metadata": {}, + "outputs": [], + "source": [ + "def test(dataloader, model, loss_fn):\n", + " size = len(dataloader.dataset)\n", + " num_batches = len(dataloader)\n", + " model.eval()\n", + " test_loss, correct = 0, 0\n", + " with torch.no_grad():\n", + " for X, y in dataloader:\n", + " X, y = X.to(device), y.to(device)\n", + " pred = model(X)\n", + " test_loss += loss_fn(pred, y).item()\n", + " correct += (pred.argmax(1) == y).type(torch.float).sum().item()\n", + " test_loss /= num_batches\n", + " correct /= size\n", + " print(f\"Test Error: \\n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "854608e6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1\n", + "-------------------------------\n", + "loss: 2.305429 [ 0/60000]\n", + "loss: 2.297022 [ 6400/60000]\n", + "loss: 2.266470 [12800/60000]\n", + "loss: 2.265714 [19200/60000]\n", + "loss: 2.253563 [25600/60000]\n", + "loss: 2.203140 [32000/60000]\n", + "loss: 2.224580 [38400/60000]\n", + "loss: 2.182435 [44800/60000]\n", + "loss: 2.177402 [51200/60000]\n", + "loss: 2.141706 [57600/60000]\n", + "Test Error: \n", + " Accuracy: 20.4%, Avg loss: 2.142049 \n", + "\n", + "Epoch 2\n", + "-------------------------------\n", + "loss: 2.150640 [ 0/60000]\n", + "loss: 2.147359 [ 6400/60000]\n", + "loss: 2.082054 [12800/60000]\n", + "loss: 2.101886 [19200/60000]\n", + "loss: 2.044116 [25600/60000]\n", + "loss: 1.972289 [32000/60000]\n", + "loss: 2.005282 [38400/60000]\n", + "loss: 1.923009 [44800/60000]\n", + "loss: 1.926389 [51200/60000]\n", + "loss: 1.847295 [57600/60000]\n", + "Test Error: \n", + " Accuracy: 54.4%, Avg loss: 1.854991 \n", + "\n", + "Epoch 3\n", + "-------------------------------\n", + "loss: 1.888080 [ 0/60000]\n", + "loss: 1.862951 [ 6400/60000]\n", + "loss: 1.743250 [12800/60000]\n", + "loss: 1.784036 [19200/60000]\n", + "loss: 1.660822 [25600/60000]\n", + "loss: 1.621519 [32000/60000]\n", + "loss: 1.635365 [38400/60000]\n", + "loss: 1.545240 [44800/60000]\n", + "loss: 1.565089 [51200/60000]\n", + "loss: 1.461044 [57600/60000]\n", + "Test Error: \n", + " Accuracy: 60.3%, Avg loss: 1.486240 \n", + "\n", + "Epoch 4\n", + "-------------------------------\n", + "loss: 1.551637 [ 0/60000]\n", + "loss: 1.524140 [ 6400/60000]\n", + "loss: 1.374491 [12800/60000]\n", + "loss: 1.446650 [19200/60000]\n", + "loss: 1.322406 [25600/60000]\n", + "loss: 1.325748 [32000/60000]\n", + "loss: 1.331345 [38400/60000]\n", + "loss: 1.261354 [44800/60000]\n", + "loss: 1.292640 [51200/60000]\n", + "loss: 1.200176 [57600/60000]\n", + "Test Error: \n", + " Accuracy: 63.3%, Avg loss: 1.229079 \n", + "\n", + "Epoch 5\n", + "-------------------------------\n", + "loss: 1.302291 [ 0/60000]\n", + "loss: 1.292532 [ 6400/60000]\n", + "loss: 1.125565 [12800/60000]\n", + "loss: 1.234343 [19200/60000]\n", + "loss: 1.108794 [25600/60000]\n", + "loss: 1.134641 [32000/60000]\n", + "loss: 1.149444 [38400/60000]\n", + "loss: 1.086560 [44800/60000]\n", + "loss: 1.125073 [51200/60000]\n", + "loss: 1.049052 [57600/60000]\n", + "Test Error: \n", + " Accuracy: 64.7%, Avg loss: 1.072207 \n", + "\n", + "Done!\n" + ] + } + ], + "source": [ + "epochs = 5\n", + "for t in range(epochs):\n", + " print(f\"Epoch {t+1}\\n-------------------------------\")\n", + " train(train_dataloader, model, loss_fn, optimizer)\n", + " test(test_dataloader, model, loss_fn)\n", + "print(\"Done!\")" + ] + }, + { + "cell_type": "markdown", + "id": "85d97839", + "metadata": {}, + "source": [ + "### Save Model State Dict\n", + "This is the [currently recommended save format](https://pytorch.org/tutorials/beginner/saving_loading_models.html#saving-loading-model-for-inference)." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "5d5d24de", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Saved PyTorch Model State to model_weights.pt\n" + ] + } + ], + "source": [ + "torch.save(model.state_dict(), \"model_weights.pt\")\n", + "print(\"Saved PyTorch Model State to model_weights.pt\")" + ] + }, + { + "cell_type": "markdown", + "id": "7416bbef", + "metadata": {}, + "source": [ + "### Save Entire Model\n", + "This saves the entire model using python pickle, but has the [following disadvantage](https://pytorch.org/tutorials/beginner/saving_loading_models.html#save-load-entire-model):\n", + "> The serialized data is bound to the specific classes and the exact directory structure used when the model is saved... Because of this, your code can break in various ways when used in other projects or after refactors." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "e87098c0", + "metadata": {}, + "outputs": [], + "source": [ + "torch.save(model, \"model.pt\")" + ] + }, + { + "cell_type": "markdown", + "id": "ac221ca7-e227-4c8c-8577-1eeda4a61fc7", + "metadata": {}, + "source": [ + "### Save Model as TorchScript\n", + "This saves an [intermediate representation of the compute graph](https://pytorch.org/tutorials/beginner/saving_loading_models.html#export-load-model-in-torchscript-format), which does not require pickle (or even python). However, this currently doesn't work with spark, which uses pickle serialization." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "6d9b3a45-7618-43e4-8bd3-8bb317a484d3", + "metadata": {}, + "outputs": [], + "source": [ + "scripted = torch.jit.script(model)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "0cd01550-c72e-47f2-abe6-e14f26b06fc7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "scripted.save(\"model.ts\")" + ] + }, + { + "cell_type": "markdown", + "id": "12ee8916-f437-4a2a-9bf4-14ff5376d305", + "metadata": {}, + "source": [ + "### Load Model State" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "8fe3b5d1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_from_state = NeuralNetwork()\n", + "model_from_state.load_state_dict(torch.load(\"model_weights.pt\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "0c405bd0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Predicted: \"Ankle boot\", Actual: \"Ankle boot\"\n" + ] + } + ], + "source": [ + "model_from_state.eval()\n", + "x, y = test_data[0][0], test_data[0][1]\n", + "with torch.no_grad():\n", + " pred = model_from_state(x)\n", + " predicted, actual = classes[pred[0].argmax(0)], classes[y]\n", + " print(f'Predicted: \"{predicted}\", Actual: \"{actual}\"')" + ] + }, + { + "cell_type": "markdown", + "id": "1708f5e0", + "metadata": {}, + "source": [ + "### Load Model" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "dc5bce69", + "metadata": {}, + "outputs": [], + "source": [ + "new_model = torch.load(\"model.pt\")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "cc219a56-4abd-4b61-9f9a-686dae7c9614", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Predicted: \"Ankle boot\", Actual: \"Ankle boot\"\n" + ] + } + ], + "source": [ + "x, y = test_data[0][0], test_data[0][1]\n", + "with torch.no_grad():\n", + " pred = new_model(x)\n", + " predicted, actual = classes[pred[0].argmax(0)], classes[y]\n", + " print(f'Predicted: \"{predicted}\", Actual: \"{actual}\"')" + ] + }, + { + "cell_type": "markdown", + "id": "290c482a-1c5d-4bf2-bc3f-8a4e53d442b5", + "metadata": {}, + "source": [ + "### Load Torchscript Model" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "ef3c419e-d384-446c-b07b-1af93e07d6c0", + "metadata": {}, + "outputs": [], + "source": [ + "ts_model = torch.jit.load(\"model.ts\")" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "038af830-a360-45eb-ab4e-b1adab0af164", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Predicted: \"Ankle boot\", Actual: \"Ankle boot\"\n" + ] + } + ], + "source": [ + "x, y = test_data[0][0], test_data[0][1]\n", + "with torch.no_grad():\n", + " pred = ts_model(x)\n", + " predicted, actual = classes[pred[0].argmax(0)], classes[y]\n", + " print(f'Predicted: \"{predicted}\", Actual: \"{actual}\"')" + ] + }, + { + "cell_type": "markdown", + "id": "ad918393", + "metadata": {}, + "source": [ + "## PySpark" + ] + }, + { + "cell_type": "markdown", + "id": "fd1daec3", + "metadata": {}, + "source": [ + "### Convert numpy dataset to Pandas DataFrame" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "42c5feba", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from pyspark.sql.types import StructType, StructField, ArrayType, FloatType" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "f063cbe7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((10000, 28, 28), dtype('uint8'))" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = test_data.data.numpy()\n", + "data.shape, data.dtype" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "8c828393", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((10000, 784), dtype('float64'))" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = data.reshape(10000, 784) / 255.0\n", + "data.shape, data.dtype" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "7760bdbe", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0123456789...774775776777778779780781782783
00.00.00.00.0000000.00.0000000.0000000.00.0000000.000000...0.0000000.0000000.00.0000000.0000000.0000000.0000000.00.00.0
10.00.00.00.0000000.00.0000000.0000000.00.0000000.000000...0.0078430.0117650.00.0117650.6823530.7411760.2627450.00.00.0
20.00.00.00.0000000.00.0000000.0000000.00.0039220.000000...0.6431370.2274510.00.0000000.0000000.0000000.0000000.00.00.0
30.00.00.00.0000000.00.0000000.0000000.00.0000000.082353...0.0039220.0000000.00.0000000.0000000.0000000.0000000.00.00.0
40.00.00.00.0078430.00.0039220.0039220.00.0000000.000000...0.2784310.0470590.00.0000000.0000000.0000000.0000000.00.00.0
..................................................................
99950.00.00.00.0000000.00.0000000.0000000.00.0000000.000000...0.0000000.0000000.00.0000000.0000000.0000000.0000000.00.00.0
99960.00.00.00.0000000.00.0000000.0000000.00.0000000.121569...0.0000000.0000000.00.0000000.0000000.0000000.0000000.00.00.0
99970.00.00.00.0000000.00.0000000.0000000.00.0000000.000000...0.1058820.0000000.00.0000000.0000000.0000000.0000000.00.00.0
99980.00.00.00.0000000.00.0000000.0000000.00.0000000.000000...0.0000000.0000000.00.0000000.0000000.0000000.0000000.00.00.0
99990.00.00.00.0000000.00.0000000.0000000.00.0000000.000000...0.0000000.0000000.00.0000000.0000000.0000000.0000000.00.00.0
\n", + "

10000 rows × 784 columns

\n", + "
" + ], + "text/plain": [ + " 0 1 2 3 4 5 6 7 8 \n", + "0 0.0 0.0 0.0 0.000000 0.0 0.000000 0.000000 0.0 0.000000 \\\n", + "1 0.0 0.0 0.0 0.000000 0.0 0.000000 0.000000 0.0 0.000000 \n", + "2 0.0 0.0 0.0 0.000000 0.0 0.000000 0.000000 0.0 0.003922 \n", + "3 0.0 0.0 0.0 0.000000 0.0 0.000000 0.000000 0.0 0.000000 \n", + "4 0.0 0.0 0.0 0.007843 0.0 0.003922 0.003922 0.0 0.000000 \n", + "... ... ... ... ... ... ... ... ... ... \n", + "9995 0.0 0.0 0.0 0.000000 0.0 0.000000 0.000000 0.0 0.000000 \n", + "9996 0.0 0.0 0.0 0.000000 0.0 0.000000 0.000000 0.0 0.000000 \n", + "9997 0.0 0.0 0.0 0.000000 0.0 0.000000 0.000000 0.0 0.000000 \n", + "9998 0.0 0.0 0.0 0.000000 0.0 0.000000 0.000000 0.0 0.000000 \n", + "9999 0.0 0.0 0.0 0.000000 0.0 0.000000 0.000000 0.0 0.000000 \n", + "\n", + " 9 ... 774 775 776 777 778 779 \n", + "0 0.000000 ... 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 \\\n", + "1 0.000000 ... 0.007843 0.011765 0.0 0.011765 0.682353 0.741176 \n", + "2 0.000000 ... 0.643137 0.227451 0.0 0.000000 0.000000 0.000000 \n", + "3 0.082353 ... 0.003922 0.000000 0.0 0.000000 0.000000 0.000000 \n", + "4 0.000000 ... 0.278431 0.047059 0.0 0.000000 0.000000 0.000000 \n", + "... ... ... ... ... ... ... ... ... \n", + "9995 0.000000 ... 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 \n", + "9996 0.121569 ... 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 \n", + "9997 0.000000 ... 0.105882 0.000000 0.0 0.000000 0.000000 0.000000 \n", + "9998 0.000000 ... 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 \n", + "9999 0.000000 ... 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 \n", + "\n", + " 780 781 782 783 \n", + "0 0.000000 0.0 0.0 0.0 \n", + "1 0.262745 0.0 0.0 0.0 \n", + "2 0.000000 0.0 0.0 0.0 \n", + "3 0.000000 0.0 0.0 0.0 \n", + "4 0.000000 0.0 0.0 0.0 \n", + "... ... ... ... ... \n", + "9995 0.000000 0.0 0.0 0.0 \n", + "9996 0.000000 0.0 0.0 0.0 \n", + "9997 0.000000 0.0 0.0 0.0 \n", + "9998 0.000000 0.0 0.0 0.0 \n", + "9999 0.000000 0.0 0.0 0.0 \n", + "\n", + "[10000 rows x 784 columns]" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pdf784 = pd.DataFrame(data)\n", + "pdf784" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "f7d2bc0d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 178 ms, sys: 52.5 ms, total: 231 ms\n", + "Wall time: 227 ms\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
data
0[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
1[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
2[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.003...
3[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
4[0.0, 0.0, 0.0, 0.00784313725490196, 0.0, 0.00...
......
9995[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
9996[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
9997[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
9998[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
9999[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
\n", + "

10000 rows × 1 columns

\n", + "
" + ], + "text/plain": [ + " data\n", + "0 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...\n", + "1 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...\n", + "2 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.003...\n", + "3 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...\n", + "4 [0.0, 0.0, 0.0, 0.00784313725490196, 0.0, 0.00...\n", + "... ...\n", + "9995 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...\n", + "9996 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...\n", + "9997 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...\n", + "9998 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...\n", + "9999 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...\n", + "\n", + "[10000 rows x 1 columns]" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "# 1 column of array\n", + "pdf1 = pd.DataFrame()\n", + "pdf1['data'] = pdf784.values.tolist()\n", + "pdf1" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "20c3b86a-8b61-4128-ab61-0199fd3437cc", + "metadata": {}, + "outputs": [], + "source": [ + "### Create Spark DataFrame from Pandas DataFrame" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "4863d5ff", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 3.33 s, sys: 68.3 ms, total: 3.4 s\n", + "Wall time: 5.51 s\n" + ] + } + ], + "source": [ + "%%time\n", + "# force FloatType since Spark defaults to DoubleType\n", + "schema = StructType([StructField(\"data\",ArrayType(FloatType()), True)])\n", + "df = spark.createDataFrame(pdf1, schema)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "406edba5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "StructType([StructField('data', ArrayType(FloatType(), True), True)])" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.schema" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "831f4a01-3a49-4114-b9a0-2ae54526d72d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 4.35 s, sys: 141 ms, total: 4.5 s\n", + "Wall time: 4.75 s\n" + ] + } + ], + "source": [ + "%%time\n", + "# force FloatType since Spark defaults to DoubleType\n", + "schema = StructType([StructField(str(x), FloatType(), True) for x in range(784)])\n", + "df784 = spark.createDataFrame(pdf784, schema)" + ] + }, + { + "cell_type": "markdown", + "id": "ac4c7448", + "metadata": {}, + "source": [ + "### Save the test dataset as parquet files" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "e8ebae46", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/05/19 17:55:11 WARN TaskSetManager: Stage 0 contains a task of very large size (7070 KiB). The maximum recommended task size is 1000 KiB.\n", + "[Stage 0:> (0 + 8) / 8]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 5.9 ms, sys: 4.12 ms, total: 10 ms\n", + "Wall time: 4.31 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "df.write.mode(\"overwrite\").parquet(\"fashion_mnist_1\")" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "922314ce-2996-4666-9fc9-bcd98d16bb56", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/05/19 17:55:14 WARN package: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.sql.debug.maxToStringFields'.\n", + "23/05/19 17:55:14 WARN TaskSetManager: Stage 1 contains a task of very large size (7067 KiB). The maximum recommended task size is 1000 KiB.\n", + "[Stage 1:> (0 + 8) / 8]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 11.9 ms, sys: 54 µs, total: 12 ms\n", + "Wall time: 2.93 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "df784.write.mode(\"overwrite\").parquet(\"fashion_mnist_784\")" + ] + }, + { + "cell_type": "markdown", + "id": "8688429e", + "metadata": {}, + "source": [ + "### Check arrow memory configuration" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "088cb37f", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/05/19 17:55:17 WARN TaskSetManager: Stage 2 contains a task of very large size (7070 KiB). The maximum recommended task size is 1000 KiB.\n" + ] + } + ], + "source": [ + "spark.conf.set(\"spark.sql.execution.arrow.maxRecordsPerBatch\", \"128\")\n", + "# This line will fail if the vectorized reader runs out of memory\n", + "assert len(df.head()) > 0, \"`df` should not be empty\"" + ] + }, + { + "cell_type": "markdown", + "id": "d7c77eb4-7bd6-40c7-9a35-ee899a66ece3", + "metadata": {}, + "source": [ + "## Inference using Spark DL API" + ] + }, + { + "cell_type": "markdown", + "id": "59395856-a588-43c6-93c8-c83100716ac1", + "metadata": { + "tags": [] + }, + "source": [ + "### 1 columns of 784 float" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "133cc9a5-64c6-4820-807e-b87cf7e0b75a", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.functions import struct, col, array\n", + "from pyspark.sql.types import ArrayType, FloatType, Union, Dict" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "79b151d9-d112-43b6-a479-887e2fd0e2b1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = spark.read.parquet(\"fashion_mnist_1\")\n", + "len(df.columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "cabcd546-2e8e-40d0-8b79-7598a7a83aae", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "StructType([StructField('data', ArrayType(FloatType(), True), True)])" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.schema" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "5db4b957-57fc-4bc5-b8bb-db0657a186c8", + "metadata": {}, + "outputs": [], + "source": [ + "# get absolute path to model\n", + "model_dir = \"{}/model.ts\".format(os.getcwd())" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "73dc73cb-25e3-4798-a019-e1abd684eaa1", + "metadata": {}, + "outputs": [], + "source": [ + "def predict_batch_fn():\n", + " import torch\n", + " device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", + " print(\"Using {} device\".format(device))\n", + " model = torch.jit.load(model_dir)\n", + " model.to(device)\n", + " \n", + " def predict(inputs: np.ndarray):\n", + " torch_inputs = torch.from_numpy(inputs).to(device)\n", + " outputs = model(torch_inputs)\n", + " return outputs.detach().numpy()\n", + " \n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "df68cca1-2d47-4e88-8aad-9899402aee97", + "metadata": {}, + "outputs": [], + "source": [ + "mnist = predict_batch_udf(predict_batch_fn,\n", + " input_tensor_shapes=[[784]],\n", + " return_type=ArrayType(FloatType()),\n", + " batch_size=50)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "63555b3b-3673-4712-97aa-fd728c6c4979", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 465 ms, sys: 117 ms, total: 582 ms\n", + "Wall time: 4.31 s\n" + ] + } + ], + "source": [ + "%%time\n", + "# first pass caches model/fn\n", + "preds = df.withColumn(\"preds\", mnist(struct(df.columns))).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "5dbf058a-70d6-4199-af9d-13843d078950", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 449 ms, sys: 125 ms, total: 574 ms\n", + "Wall time: 1.48 s\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", mnist(*df.columns)).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "3f5ed801-6ca5-43a0-bf9c-2535a0dfe2e8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 698 ms, sys: 117 ms, total: 815 ms\n", + "Wall time: 1.52 s\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", mnist(*[col(c) for c in df.columns])).collect()" + ] + }, + { + "cell_type": "markdown", + "id": "c6dbec03-9b64-46c4-a748-f889be571384", + "metadata": { + "tags": [] + }, + "source": [ + "### Check predictions" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "f1f1e5fd-5866-4b78-b9d3-709e6b383a0c", + "metadata": {}, + "outputs": [], + "source": [ + "predictions = preds[0].preds\n", + "img = preds[0].data" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "76b76502-adb7-45ec-a365-2e61cdd576fc", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "c163953a-1504-444f-b39f-86b61d34e440", + "metadata": {}, + "outputs": [], + "source": [ + "img = np.array(img).reshape(28,28)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "bc0fad05-50ab-4ae5-b9fd-e50133c4c92a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaAAAAGdCAYAAABU0qcqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAfwElEQVR4nO3df3DU9b3v8dfm10Iw2RBCfkmgARGsSGyppFSlWHKBOMcB5d7xV88FjwevNDhFtHrpqGjbmbR4xzp6qN6Z24KeEbXeERi9LR0EE8YasKAcSrUpSVOBkgTFZjck5ud+7h8c064Q4LNueCfh+ZjZGbL7feX75ptv8so3u/kk4JxzAgDgPEuyHgAAcGGigAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGAixXqAz4tGozp69KgyMjIUCASsxwEAeHLOqbW1VYWFhUpK6v86Z9AV0NGjR1VUVGQ9BgDgCzp8+LDGjRvX7+ODroAyMjIkSdfoeqUo1XgaAICvHnXrLf2q7+t5fwasgNatW6fHH39cTU1NKikp0dNPP62ZM2eeNffZj91SlKqUAAUEAEPOf64weranUQbkRQgvv/yyVq1apTVr1ujdd99VSUmJ5s+fr2PHjg3E7gAAQ9CAFNATTzyhZcuW6Y477tCXv/xlPfvss0pPT9cvfvGLgdgdAGAISngBdXV1ae/evSorK/v7TpKSVFZWppqamlO27+zsVCQSibkBAIa/hBfQxx9/rN7eXuXl5cXcn5eXp6amplO2r6ysVCgU6rvxCjgAuDCY/yLq6tWrFQ6H+26HDx+2HgkAcB4k/FVwOTk5Sk5OVnNzc8z9zc3Nys/PP2X7YDCoYDCY6DEAAINcwq+A0tLSNGPGDG3fvr3vvmg0qu3bt2vWrFmJ3h0AYIgakN8DWrVqlZYsWaKvfe1rmjlzpp588km1tbXpjjvuGIjdAQCGoAEpoJtvvlkfffSRHnnkETU1NenKK6/U1q1bT3lhAgDgwhVwzjnrIf5RJBJRKBTSHC1kJQQAGIJ6XLeqtEXhcFiZmZn9bmf+KjgAwIWJAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJhJeQI8++qgCgUDMberUqYneDQBgiEsZiHd6+eWX64033vj7TlIGZDcAgCFsQJohJSVF+fn5A/GuAQDDxIA8B3Tw4EEVFhZq4sSJuv3223Xo0KF+t+3s7FQkEom5AQCGv4QXUGlpqTZs2KCtW7fqmWeeUUNDg6699lq1traedvvKykqFQqG+W1FRUaJHAgAMQgHnnBvIHbS0tGjChAl64okndOedd57yeGdnpzo7O/vejkQiKioq0hwtVEogdSBHAwAMgB7XrSptUTgcVmZmZr/bDfirA7KysnTppZeqrq7utI8Hg0EFg8GBHgMAMMgM+O8BnThxQvX19SooKBjoXQEAhpCEF9D999+v6upq/eUvf9Hbb7+tG2+8UcnJybr11lsTvSsAwBCW8B/BHTlyRLfeequOHz+usWPH6pprrtGuXbs0duzYRO8KADCEJbyAXnrppUS/SwDAMMRacAAAExQQAMAEBQQAMEEBAQBMUEAAABMUEADABAUEADBBAQEATFBAAAATFBAAwAQFBAAwQQEBAEwM+B+kw38KBPwzcfyx2kCK/4fU9fR4Z07u7Pz8n4aj5NGjvTN/fHSKd2bStL96ZyQp/Pw478zo52ri2tdwkzRqlHcmns9B9w9/SXqo4goIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCC1bDPl/O0CnQ8q+rGs4J23JKTvSOuq8s7E4hjP9IXWBncU+OGPO9MoN5/P+V5f/APSZr28FbvzL/9y1zvTPP/KfbOZBzxXwU6+c13vTOSlDx5onemc7z/SueH56Z5Zyav+9A7I0k9fz3qH/Je+T4gncOXPK6AAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmGAx0uHGe9HA87cApyTpPO3rfP6fjj7wDe/MXZf8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3btX3d3dMefD1KlTNX78+GF9Pnz+OHzmhRdeUE5OjqZNm6bVq1ervb3dYrx+DbrFSD/v448/Vm9vr/Ly8mLuz8vL0x//+EejqWyUlpZqw4YNmjJlihobG/XYY4/p2muv1YEDB5SRkWE9nommpiZJOu358dljF4oFCxbopptuUnFxserr6/X9739f5eXlqqmpUXJysvV4CReNRrVy5UpdffXVmjZtmqST50NaWpqysrJith3O58PpjoMk3XbbbZowYYIKCwu1f/9+Pfjgg6qtrdWrr75qOG2sQV9A+Lvy8vK+f0+fPl2lpaWaMGGCfvnLX+rOO+80nAyDwS233NL37yuuuELTp0/XpEmTVFVVpblz5xpONjAqKip04MCBC+J50DPp7zjcddddff++4oorVFBQoLlz56q+vl6TJk0632Oe1qD/EVxOTo6Sk5NPeRVLc3Oz8vPzjaYaHLKysnTppZeqrq7OehQzn50DnB+nmjhxonJycobl+bFixQq9/vrrevPNN2P+fEt+fr66urrU0tISs/1wPR/6Ow6nU1paKkmD6nwY9AWUlpamGTNmaPv27X33RaNRbd++XbNmzTKczN6JEydUX1+vgoIC61HMFBcXKz8/P+b8iEQi2r179wV/fhw5ckTHjx8fVueHc04rVqzQpk2btGPHDhUXF8c8PmPGDKWmpsacD7W1tTp06NCwOh/OdhxOZ9++fZI0uM4H61dBnIuXXnrJBYNBt2HDBvf++++7u+66y2VlZbmmpibr0c6r++67z1VVVbmGhgb329/+1pWVlbmcnBx37Ngx69EGVGtrq3vvvffce++95yS5J554wr333nvuww8/dM459+Mf/9hlZWW5LVu2uP3797uFCxe64uJi9+mnnxpPnlhnOg6tra3u/vvvdzU1Na6hocG98cYb7qtf/aqbPHmy6+josB49YZYvX+5CoZCrqqpyjY2Nfbf29va+be6++243fvx4t2PHDrdnzx43a9YsN2vWLMOpE+9sx6Gurs794Ac/cHv27HENDQ1uy5YtbuLEiW727NnGk8caEgXknHNPP/20Gz9+vEtLS3MzZ850u3btsh7pvLv55ptdQUGBS0tLcxdffLG7+eabXV1dnfVYA+7NN990kk65LVmyxDl38qXYDz/8sMvLy3PBYNDNnTvX1dbW2g49AM50HNrb2928efPc2LFjXWpqqpswYYJbtmzZsPsm7XT/f0lu/fr1fdt8+umn7jvf+Y4bPXq0S09PdzfeeKNrbGy0G3oAnO04HDp0yM2ePdtlZ2e7YDDoLrnkEve9733PhcNh28E/hz/HAAAwMeifAwIADE8UEADABAUEADBBAQEATFBAAAATFBAAwAQFBAAwQQEBAExQQAAAExQQAMAEBQQAMEEBAQBM/H+wVOxLQwVbkwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure()\n", + "plt.imshow(img)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "56f36efb-e3a2-49f9-b9fb-1657bc25e5c5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[-1.7200822830200195,\n", + " -2.013300895690918,\n", + " -0.3198302984237671,\n", + " -1.4132847785949707,\n", + " -0.25933510065078735,\n", + " 1.7492953538894653,\n", + " -0.45816969871520996,\n", + " 2.1313018798828125,\n", + " 1.6222647428512573,\n", + " 1.3297781944274902]" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "predictions" + ] + }, + { + "cell_type": "markdown", + "id": "56ca1195-ea0f-405f-87fe-857e5c0c76a5", + "metadata": {}, + "source": [ + "### 784 columns of float" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "e0ab0af6-b5c9-4b74-9dd6-baa7737cc986", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "784" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = spark.read.parquet(\"fashion_mnist_784\")\n", + "len(df.columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "13ae45dc-85a0-4864-8a58-9dc29ae4efd7", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 1.08 s, sys: 142 ms, total: 1.23 s\n", + "Wall time: 6 s\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", mnist(struct(df.columns))).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "0b3fb48b-f871-41f2-ac57-346899a6fe48", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 1.07 s, sys: 137 ms, total: 1.21 s\n", + "Wall time: 3.01 s\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", mnist(array(*df.columns))).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "a43f3a7e-c6ef-4eaa-bfa8-8ca09cab7070", + "metadata": {}, + "outputs": [], + "source": [ + "# should raise ValueError\n", + "# preds = df.withColumn(\"preds\", mnist(*df.columns)).collect()" + ] + }, + { + "cell_type": "markdown", + "id": "dc48ec42-0df6-4e6a-b019-1270ab71d2cf", + "metadata": { + "tags": [] + }, + "source": [ + "### Check predictions" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "d815c701-9f5b-422c-b3f9-fbc30456953c", + "metadata": {}, + "outputs": [], + "source": [ + "preds = df.withColumn(\"preds\", mnist(array(*df.columns))).limit(10).toPandas()" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "b571b742-5079-42b2-8524-9181a0dec2c7", + "metadata": {}, + "outputs": [], + "source": [ + "sample = preds.iloc[0]\n", + "predictions = sample.preds\n", + "img = sample.drop('preds').to_numpy(dtype=float)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "d33d6a4e-e6b9-489d-ac21-c4eddc801784", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "6d10061e-aca6-4f81-bdfe-72e327ed7349", + "metadata": {}, + "outputs": [], + "source": [ + "img = np.array(img).reshape(28,28)" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "01f70e08-2c1d-419f-8676-3f6f4aba760f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaAAAAGdCAYAAABU0qcqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAfwElEQVR4nO3df3DU9b3v8dfm10Iw2RBCfkmgARGsSGyppFSlWHKBOMcB5d7xV88FjwevNDhFtHrpqGjbmbR4xzp6qN6Z24KeEbXeERi9LR0EE8YasKAcSrUpSVOBkgTFZjck5ud+7h8c064Q4LNueCfh+ZjZGbL7feX75ptv8so3u/kk4JxzAgDgPEuyHgAAcGGigAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGAixXqAz4tGozp69KgyMjIUCASsxwEAeHLOqbW1VYWFhUpK6v86Z9AV0NGjR1VUVGQ9BgDgCzp8+LDGjRvX7+ODroAyMjIkSdfoeqUo1XgaAICvHnXrLf2q7+t5fwasgNatW6fHH39cTU1NKikp0dNPP62ZM2eeNffZj91SlKqUAAUEAEPOf64weranUQbkRQgvv/yyVq1apTVr1ujdd99VSUmJ5s+fr2PHjg3E7gAAQ9CAFNATTzyhZcuW6Y477tCXv/xlPfvss0pPT9cvfvGLgdgdAGAISngBdXV1ae/evSorK/v7TpKSVFZWppqamlO27+zsVCQSibkBAIa/hBfQxx9/rN7eXuXl5cXcn5eXp6amplO2r6ysVCgU6rvxCjgAuDCY/yLq6tWrFQ6H+26HDx+2HgkAcB4k/FVwOTk5Sk5OVnNzc8z9zc3Nys/PP2X7YDCoYDCY6DEAAINcwq+A0tLSNGPGDG3fvr3vvmg0qu3bt2vWrFmJ3h0AYIgakN8DWrVqlZYsWaKvfe1rmjlzpp588km1tbXpjjvuGIjdAQCGoAEpoJtvvlkfffSRHnnkETU1NenKK6/U1q1bT3lhAgDgwhVwzjnrIf5RJBJRKBTSHC1kJQQAGIJ6XLeqtEXhcFiZmZn9bmf+KjgAwIWJAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJhJeQI8++qgCgUDMberUqYneDQBgiEsZiHd6+eWX64033vj7TlIGZDcAgCFsQJohJSVF+fn5A/GuAQDDxIA8B3Tw4EEVFhZq4sSJuv3223Xo0KF+t+3s7FQkEom5AQCGv4QXUGlpqTZs2KCtW7fqmWeeUUNDg6699lq1traedvvKykqFQqG+W1FRUaJHAgAMQgHnnBvIHbS0tGjChAl64okndOedd57yeGdnpzo7O/vejkQiKioq0hwtVEogdSBHAwAMgB7XrSptUTgcVmZmZr/bDfirA7KysnTppZeqrq7utI8Hg0EFg8GBHgMAMMgM+O8BnThxQvX19SooKBjoXQEAhpCEF9D999+v6upq/eUvf9Hbb7+tG2+8UcnJybr11lsTvSsAwBCW8B/BHTlyRLfeequOHz+usWPH6pprrtGuXbs0duzYRO8KADCEJbyAXnrppUS/SwDAMMRacAAAExQQAMAEBQQAMEEBAQBMUEAAABMUEADABAUEADBBAQEATFBAAAATFBAAwAQFBAAwQQEBAEwM+B+kw38KBPwzcfyx2kCK/4fU9fR4Z07u7Pz8n4aj5NGjvTN/fHSKd2bStL96ZyQp/Pw478zo52ri2tdwkzRqlHcmns9B9w9/SXqo4goIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCC1bDPl/O0CnQ8q+rGs4J23JKTvSOuq8s7E4hjP9IXWBncU+OGPO9MoN5/P+V5f/APSZr28FbvzL/9y1zvTPP/KfbOZBzxXwU6+c13vTOSlDx5onemc7z/SueH56Z5Zyav+9A7I0k9fz3qH/Je+T4gncOXPK6AAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmGAx0uHGe9HA87cApyTpPO3rfP6fjj7wDe/MXZf8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3btX3d3dMefD1KlTNX78+GF9Pnz+OHzmhRdeUE5OjqZNm6bVq1ervb3dYrx+DbrFSD/v448/Vm9vr/Ly8mLuz8vL0x//+EejqWyUlpZqw4YNmjJlihobG/XYY4/p2muv1YEDB5SRkWE9nommpiZJOu358dljF4oFCxbopptuUnFxserr6/X9739f5eXlqqmpUXJysvV4CReNRrVy5UpdffXVmjZtmqST50NaWpqysrJith3O58PpjoMk3XbbbZowYYIKCwu1f/9+Pfjgg6qtrdWrr75qOG2sQV9A+Lvy8vK+f0+fPl2lpaWaMGGCfvnLX+rOO+80nAyDwS233NL37yuuuELTp0/XpEmTVFVVpblz5xpONjAqKip04MCBC+J50DPp7zjcddddff++4oorVFBQoLlz56q+vl6TJk0632Oe1qD/EVxOTo6Sk5NPeRVLc3Oz8vPzjaYaHLKysnTppZeqrq7OehQzn50DnB+nmjhxonJycobl+bFixQq9/vrrevPNN2P+fEt+fr66urrU0tISs/1wPR/6Ow6nU1paKkmD6nwY9AWUlpamGTNmaPv27X33RaNRbd++XbNmzTKczN6JEydUX1+vgoIC61HMFBcXKz8/P+b8iEQi2r179wV/fhw5ckTHjx8fVueHc04rVqzQpk2btGPHDhUXF8c8PmPGDKWmpsacD7W1tTp06NCwOh/OdhxOZ9++fZI0uM4H61dBnIuXXnrJBYNBt2HDBvf++++7u+66y2VlZbmmpibr0c6r++67z1VVVbmGhgb329/+1pWVlbmcnBx37Ngx69EGVGtrq3vvvffce++95yS5J554wr333nvuww8/dM459+Mf/9hlZWW5LVu2uP3797uFCxe64uJi9+mnnxpPnlhnOg6tra3u/vvvdzU1Na6hocG98cYb7qtf/aqbPHmy6+josB49YZYvX+5CoZCrqqpyjY2Nfbf29va+be6++243fvx4t2PHDrdnzx43a9YsN2vWLMOpE+9sx6Gurs794Ac/cHv27HENDQ1uy5YtbuLEiW727NnGk8caEgXknHNPP/20Gz9+vEtLS3MzZ850u3btsh7pvLv55ptdQUGBS0tLcxdffLG7+eabXV1dnfVYA+7NN990kk65LVmyxDl38qXYDz/8sMvLy3PBYNDNnTvX1dbW2g49AM50HNrb2928efPc2LFjXWpqqpswYYJbtmzZsPsm7XT/f0lu/fr1fdt8+umn7jvf+Y4bPXq0S09PdzfeeKNrbGy0G3oAnO04HDp0yM2ePdtlZ2e7YDDoLrnkEve9733PhcNh28E/hz/HAAAwMeifAwIADE8UEADABAUEADBBAQEATFBAAAATFBAAwAQFBAAwQQEBAExQQAAAExQQAMAEBQQAMEEBAQBM/H+wVOxLQwVbkwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure()\n", + "plt.imshow(img)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "8e1c07cc-b2bc-4902-a9a6-4ac7f02c5fe4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[-1.720082402229309,\n", + " -2.013301134109497,\n", + " -0.3198302984237671,\n", + " -1.4132847785949707,\n", + " -0.25933507084846497,\n", + " 1.7492954730987549,\n", + " -0.4581696689128876,\n", + " 2.1313018798828125,\n", + " 1.6222645044326782,\n", + " 1.3297783136367798]" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "predictions" + ] + }, + { + "cell_type": "markdown", + "id": "a937adc9-508d-4ccd-b92d-8ecaa27ee4e4", + "metadata": {}, + "source": [ + "### Using Triton Inference Server\n", + "\n", + "Note: you can restart the kernel and run from this point to simulate running in a different node or environment." + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "53ca290a-ccc3-4923-a292-944921bab36d", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "from functools import partial\n", + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.functions import struct, col, array\n", + "from pyspark.sql.types import ArrayType, FloatType, Union, Dict" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "8fa92fe4-2e04-4d82-a357-bfdfca38bd8c", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "# copy model to expected layout for Triton\n", + "rm -rf models\n", + "mkdir -p models/fashion_mnist/1\n", + "cp model.ts models/fashion_mnist/1/model.pt\n", + "\n", + "# add config.pbtxt\n", + "cp models_config/fashion_mnist/config.pbtxt models/fashion_mnist/config.pbtxt" + ] + }, + { + "cell_type": "markdown", + "id": "d42b329c-5921-436f-bfca-a382a6762da4", + "metadata": {}, + "source": [ + "#### Start Triton Server on each executor" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "5e869730-3597-4074-bab0-f87768f8996a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "[True]" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "num_executors = 1\n", + "triton_models_dir = \"{}/models\".format(os.getcwd())\n", + "nodeRDD = sc.parallelize(list(range(num_executors)), num_executors)\n", + "\n", + "def start_triton(it):\n", + " import docker\n", + " import time\n", + " import tritonclient.grpc as grpcclient\n", + " \n", + " client=docker.from_env()\n", + " containers=client.containers.list(filters={\"name\": \"spark-triton\"})\n", + " if containers:\n", + " print(\">>>> containers: {}\".format([c.short_id for c in containers]))\n", + " else:\n", + " container=client.containers.run(\n", + " \"nvcr.io/nvidia/tritonserver:22.07-py3\", \"tritonserver --model-repository=/models\",\n", + " detach=True,\n", + " device_requests=[docker.types.DeviceRequest(device_ids=[\"0\"], capabilities=[['gpu']])],\n", + " name=\"spark-triton\",\n", + " network_mode=\"host\",\n", + " remove=True,\n", + " shm_size=\"64M\",\n", + " volumes={triton_models_dir: {\"bind\": \"/models\", \"mode\": \"ro\"}}\n", + " )\n", + " print(\">>>> starting triton: {}\".format(container.short_id))\n", + "\n", + " # wait for triton to be running\n", + " time.sleep(15)\n", + " client = grpcclient.InferenceServerClient(\"localhost:8001\")\n", + " ready = False\n", + " while not ready:\n", + " try:\n", + " ready = client.is_server_ready()\n", + " except Exception as e:\n", + " time.sleep(5)\n", + " \n", + " return [True]\n", + "\n", + "nodeRDD.barrier().mapPartitions(start_triton).collect()" + ] + }, + { + "cell_type": "markdown", + "id": "30a4362d-7514-4b84-b238-f704a97e1e72", + "metadata": {}, + "source": [ + "#### Run inference" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "ab94d4d1-dac6-4474-9eb0-59478aa98f7d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = spark.read.parquet(\"fashion_mnist_1\")\n", + "len(df.columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "12b5f2fc-52e9-428a-b683-6ab1b639aa24", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "StructType([StructField('data', ArrayType(FloatType(), True), True)])" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.schema" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "960657d0-31c9-4df6-8eb8-ac3d23137f7a", + "metadata": {}, + "outputs": [], + "source": [ + "def triton_fn(triton_uri, model_name):\n", + " import numpy as np\n", + " import tritonclient.grpc as grpcclient\n", + " \n", + " np_types = {\n", + " \"BOOL\": np.dtype(np.bool8),\n", + " \"INT8\": np.dtype(np.int8),\n", + " \"INT16\": np.dtype(np.int16),\n", + " \"INT32\": np.dtype(np.int32),\n", + " \"INT64\": np.dtype(np.int64),\n", + " \"FP16\": np.dtype(np.float16),\n", + " \"FP32\": np.dtype(np.float32),\n", + " \"FP64\": np.dtype(np.float64),\n", + " \"FP64\": np.dtype(np.double),\n", + " \"BYTES\": np.dtype(object)\n", + " }\n", + "\n", + " client = grpcclient.InferenceServerClient(triton_uri)\n", + " model_meta = client.get_model_metadata(model_name)\n", + " \n", + " def predict(inputs):\n", + " if isinstance(inputs, np.ndarray):\n", + " # single ndarray input\n", + " request = [grpcclient.InferInput(model_meta.inputs[0].name, inputs.shape, model_meta.inputs[0].datatype)]\n", + " request[0].set_data_from_numpy(inputs.astype(np_types[model_meta.inputs[0].datatype]))\n", + " else:\n", + " # dict of multiple ndarray inputs\n", + " request = [grpcclient.InferInput(i.name, inputs[i.name].shape, i.datatype) for i in model_meta.inputs]\n", + " for i in request:\n", + " i.set_data_from_numpy(inputs[i.name()].astype(np_types[i.datatype()]))\n", + " \n", + " response = client.infer(model_name, inputs=request)\n", + " \n", + " if len(model_meta.outputs) > 1:\n", + " # return dictionary of numpy arrays\n", + " return {o.name: response.as_numpy(o.name) for o in model_meta.outputs}\n", + " else:\n", + " # return single numpy array\n", + " return response.as_numpy(model_meta.outputs[0].name)\n", + " \n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "0262fd4a-9845-44b9-8c75-1c105e7deeca", + "metadata": {}, + "outputs": [], + "source": [ + "mnist = predict_batch_udf(partial(triton_fn, triton_uri=\"localhost:8001\", model_name=\"fashion_mnist\"),\n", + " input_tensor_shapes=[[784]],\n", + " return_type=ArrayType(FloatType()),\n", + " batch_size=1024)" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "fc5f6baa-052e-4b89-94b6-4821cf01952a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 491 ms, sys: 60.7 ms, total: 551 ms\n", + "Wall time: 1.98 s\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", mnist(struct(df.columns))).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "id": "a85dea35-e41d-482d-8a8f-52d3c108f038", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 817 ms, sys: 89 ms, total: 906 ms\n", + "Wall time: 1.44 s\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", mnist(*df.columns)).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "bc3f0dbe-c52b-41d6-8097-8cebaa5ee5a8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 460 ms, sys: 105 ms, total: 565 ms\n", + "Wall time: 1.11 s\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", mnist(*[col(c) for c in df.columns])).collect()" + ] + }, + { + "cell_type": "markdown", + "id": "7a26690a-9dc4-4c36-9904-568d73e2be3c", + "metadata": { + "tags": [] + }, + "source": [ + "#### Stop Triton Server on each executor" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "ab2fe42f-a072-4370-bac2-52fd95363530", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "[True]" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def stop_triton(it):\n", + " import docker\n", + " import time\n", + " \n", + " client=docker.from_env()\n", + " containers=client.containers.list(filters={\"name\": \"spark-triton\"})\n", + " print(\">>>> stopping containers: {}\".format([c.short_id for c in containers]))\n", + " if containers:\n", + " container=containers[0]\n", + " container.stop(timeout=120)\n", + "\n", + " return [True]\n", + "\n", + "nodeRDD.barrier().mapPartitions(stop_triton).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "id": "a0608fff-7cfb-489e-96c9-8e1d92e57562", + "metadata": {}, + "outputs": [], + "source": [ + "spark.stop()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "08de2664-3d60-487b-90da-6d0f3b8b9203", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/pytorch/models_config/fashion_mnist/config.pbtxt b/examples/ML+DL-Examples/Spark-DL/dl_inference/pytorch/models_config/fashion_mnist/config.pbtxt new file mode 100644 index 000000000..3554196f9 --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/pytorch/models_config/fashion_mnist/config.pbtxt @@ -0,0 +1,16 @@ +platform: "pytorch_libtorch" +max_batch_size: 8192 +input [ + { + name: "input" + data_type: TYPE_FP32 + dims: [ 784 ] + } +] +output [ + { + name: "output" + data_type: TYPE_FP32 + dims: [ 10 ] + } +] diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/pytorch/models_config/housing_model/config.pbtxt b/examples/ML+DL-Examples/Spark-DL/dl_inference/pytorch/models_config/housing_model/config.pbtxt new file mode 100644 index 000000000..794ffd37e --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/pytorch/models_config/housing_model/config.pbtxt @@ -0,0 +1,16 @@ +platform: "pytorch_libtorch" +max_batch_size: 8192 +input [ + { + name: "input" + data_type: TYPE_FP32 + dims: [ 8 ] + } +] +output [ + { + name: "output" + data_type: TYPE_FP32 + dims: [ 1 ] + } +] diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/pytorch/regression.ipynb b/examples/ML+DL-Examples/Spark-DL/dl_inference/pytorch/regression.ipynb new file mode 100644 index 000000000..3e537d42f --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/pytorch/regression.ipynb @@ -0,0 +1,2220 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f04d288a-f4bf-4256-8ef8-fbc3ab92f24e", + "metadata": { + "tags": [] + }, + "source": [ + "Based on: https://github.com/christianversloot/machine-learning-articles/blob/main/how-to-create-a-neural-network-for-regression-with-pytorch.md" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "75930360-c5ce-49ef-a69a-da88fa69a2ef", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import torch\n", + "from torch import nn\n", + "from torch.utils.data import DataLoader\n", + "from sklearn.datasets import fetch_california_housing\n", + "from sklearn.preprocessing import StandardScaler" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cf02ba0a-8384-42b5-917c-53889b4a6471", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "torch.manual_seed(42)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2bee64cf-a44a-4aff-82db-c64ee3a8b0e8", + "metadata": {}, + "outputs": [], + "source": [ + "X, y = fetch_california_housing(return_X_y=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "8644e508-5e4c-4cdd-9ed1-9235887d9659", + "metadata": {}, + "outputs": [], + "source": [ + "class HousingDataset(torch.utils.data.Dataset):\n", + " def __init__(self, X, y, scale_data=True):\n", + " if not torch.is_tensor(X) and not torch.is_tensor(y):\n", + " # Apply scaling if necessary\n", + " if scale_data:\n", + " X = StandardScaler().fit_transform(X)\n", + " self.X = torch.from_numpy(X.astype(np.float32))\n", + " self.y = torch.from_numpy(y.astype(np.float32))\n", + "\n", + " def __len__(self):\n", + " return len(self.X)\n", + "\n", + " def __getitem__(self, i):\n", + " return self.X[i], self.y[i]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cc6b55c3-dc7b-4831-9943-83efd48091bf", + "metadata": {}, + "outputs": [], + "source": [ + "dataset = HousingDataset(X, y)\n", + "trainloader = torch.utils.data.DataLoader(\n", + " dataset, batch_size=10, shuffle=True, num_workers=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d868f39d-4695-4110-91d2-6f7a09d73b93", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[tensor([[ 0.4159, 0.3465, 0.2294, -0.1113, -0.3130, 0.0527, -0.5955, 0.3193],\n", + " [-0.3706, 0.5849, -0.1514, -0.2040, 0.3943, 0.0550, -0.8155, 0.6687],\n", + " [-0.2024, -0.8454, 0.1928, 0.0087, 0.5435, -0.0279, 0.9449, -1.2679],\n", + " [ 0.1064, -1.9578, 0.2968, 0.0363, 2.7556, -0.0217, -0.4925, 0.7685],\n", + " [ 0.1057, 1.0616, 0.1675, -0.0081, -0.3651, -0.0372, -0.6751, 0.7186],\n", + " [ 0.3343, -1.4811, -0.7187, 0.2041, 0.0967, 0.0529, -0.8483, 0.8234],\n", + " [-0.2691, 1.3000, -0.6491, -0.0872, 1.7074, -0.1372, -0.7312, 0.6088],\n", + " [-0.0891, -0.3686, 0.0260, -0.1563, 0.3996, 0.0449, 1.1790, -1.3378],\n", + " [ 0.1397, -0.2097, 0.1816, -0.1881, 0.4049, -0.0229, -0.7547, 1.2676],\n", + " [-0.3399, 0.3465, -0.4621, -0.0519, 0.6115, -0.0284, -0.6704, 0.5189]]),\n", + " tensor([1.8790, 1.1770, 3.3160, 1.5430, 2.3400, 1.5240, 2.8750, 1.2360, 1.2100,\n", + " 2.0530])]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "next(iter(trainloader))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "9a441b60-dca4-44d2-bc1c-aa7336d704bb", + "metadata": {}, + "outputs": [], + "source": [ + "class MLP(nn.Module):\n", + " def __init__(self):\n", + " super().__init__()\n", + " self.layers = nn.Sequential(\n", + " nn.Linear(8, 64),\n", + " nn.ReLU(),\n", + " nn.Linear(64, 32),\n", + " nn.ReLU(),\n", + " nn.Linear(32, 1)\n", + " )\n", + "\n", + " def forward(self, x):\n", + " return self.layers(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "15cff2b4-9d23-4d2b-808a-a5edb8eda135", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "# Initialize the MLP\n", + "mlp = MLP()\n", + "\n", + "# Define the loss function and optimizer\n", + "loss_function = nn.L1Loss()\n", + "optimizer = torch.optim.Adam(mlp.parameters(), lr=1e-4)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "5e2db3f9-5db8-4b42-89ad-e77f23c4c1fe", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Starting epoch 1\n", + "Loss after mini-batch 1: 0.004\n", + "Loss after mini-batch 201: 0.733\n", + "Loss after mini-batch 401: 0.534\n", + "Loss after mini-batch 601: 0.403\n", + "Loss after mini-batch 801: 0.330\n", + "Loss after mini-batch 1001: 0.269\n", + "Loss after mini-batch 1201: 0.232\n", + "Loss after mini-batch 1401: 0.226\n", + "Loss after mini-batch 1601: 0.223\n", + "Loss after mini-batch 1801: 0.214\n", + "Loss after mini-batch 2001: 0.214\n", + "Starting epoch 2\n", + "Loss after mini-batch 1: 0.002\n", + "Loss after mini-batch 201: 0.211\n", + "Loss after mini-batch 401: 0.205\n", + "Loss after mini-batch 601: 0.199\n", + "Loss after mini-batch 801: 0.192\n", + "Loss after mini-batch 1001: 0.194\n", + "Loss after mini-batch 1201: 0.196\n", + "Loss after mini-batch 1401: 0.193\n", + "Loss after mini-batch 1601: 0.194\n", + "Loss after mini-batch 1801: 0.187\n", + "Loss after mini-batch 2001: 0.197\n", + "Starting epoch 3\n", + "Loss after mini-batch 1: 0.001\n", + "Loss after mini-batch 201: 0.190\n", + "Loss after mini-batch 401: 0.183\n", + "Loss after mini-batch 601: 0.181\n", + "Loss after mini-batch 801: 0.190\n", + "Loss after mini-batch 1001: 0.188\n", + "Loss after mini-batch 1201: 0.186\n", + "Loss after mini-batch 1401: 0.193\n", + "Loss after mini-batch 1601: 0.182\n", + "Loss after mini-batch 1801: 0.184\n", + "Loss after mini-batch 2001: 0.188\n", + "Starting epoch 4\n", + "Loss after mini-batch 1: 0.001\n", + "Loss after mini-batch 201: 0.180\n", + "Loss after mini-batch 401: 0.179\n", + "Loss after mini-batch 601: 0.183\n", + "Loss after mini-batch 801: 0.180\n", + "Loss after mini-batch 1001: 0.176\n", + "Loss after mini-batch 1201: 0.189\n", + "Loss after mini-batch 1401: 0.176\n", + "Loss after mini-batch 1601: 0.185\n", + "Loss after mini-batch 1801: 0.177\n", + "Loss after mini-batch 2001: 0.185\n", + "Starting epoch 5\n", + "Loss after mini-batch 1: 0.001\n", + "Loss after mini-batch 201: 0.179\n", + "Loss after mini-batch 401: 0.177\n", + "Loss after mini-batch 601: 0.175\n", + "Loss after mini-batch 801: 0.178\n", + "Loss after mini-batch 1001: 0.173\n", + "Loss after mini-batch 1201: 0.178\n", + "Loss after mini-batch 1401: 0.176\n", + "Loss after mini-batch 1601: 0.174\n", + "Loss after mini-batch 1801: 0.179\n", + "Loss after mini-batch 2001: 0.180\n", + "Training process has finished.\n" + ] + } + ], + "source": [ + "# Run the training loop\n", + "for epoch in range(0, 5): # 5 epochs at maximum\n", + "\n", + " # Print epoch\n", + " print(f'Starting epoch {epoch+1}')\n", + "\n", + " # Set current loss value\n", + " current_loss = 0.0\n", + "\n", + " # Iterate over the DataLoader for training data\n", + " for i, data in enumerate(trainloader, 0):\n", + "\n", + " # Get and prepare inputs\n", + " inputs, targets = data\n", + " targets = targets.reshape((targets.shape[0], 1))\n", + "\n", + " # Zero the gradients\n", + " optimizer.zero_grad()\n", + "\n", + " # Perform forward pass\n", + " outputs = mlp(inputs)\n", + "\n", + " # Compute loss\n", + " loss = loss_function(outputs, targets)\n", + "\n", + " # Perform backward pass\n", + " loss.backward()\n", + "\n", + " # Perform optimization\n", + " optimizer.step()\n", + "\n", + " # Print statistics\n", + " current_loss += loss.item()\n", + " if i % 200 == 0:\n", + " print('Loss after mini-batch %5d: %.3f' %\n", + " (i + 1, current_loss / 500))\n", + " current_loss = 0.0\n", + "\n", + "# Process is complete.\n", + "print('Training process has finished.')" + ] + }, + { + "cell_type": "markdown", + "id": "ace480ba-9316-49a4-9763-dc0f61f66989", + "metadata": {}, + "source": [ + "### Save Model" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "b950a3ed-ffe1-477f-a84f-f71c85dbf9ce", + "metadata": {}, + "outputs": [], + "source": [ + "torch.save(mlp, \"housing_model.pt\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "20fedb5d-c59e-4b0b-ba91-3dd15df1f09e", + "metadata": {}, + "outputs": [], + "source": [ + "scripted = torch.jit.script(mlp)\n", + "scripted.save(\"housing_model.ts\")" + ] + }, + { + "cell_type": "markdown", + "id": "3101c0fe-65f1-411e-9192-e8a6b585ba0d", + "metadata": {}, + "source": [ + "### Load and Test Model" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "7411b00f-88d2-40f5-b716-a26733c968ff", + "metadata": {}, + "outputs": [], + "source": [ + "loaded_mlp = torch.load(\"housing_model.pt\")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "e226f449-2931-4492-9003-503cdc61f061", + "metadata": {}, + "outputs": [], + "source": [ + "testX, testY = next(iter(trainloader))" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "d46af47e-db7e-42ee-9bd3-6e7d93850be3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[2.8778],\n", + " [0.6233],\n", + " [3.9021],\n", + " [2.4543],\n", + " [1.0209],\n", + " [1.8093],\n", + " [1.4593],\n", + " [3.2933],\n", + " [2.9263],\n", + " [1.4790]], grad_fn=)" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "loaded_mlp(testX)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "13ae2c0f-1da5-45a4-bf32-ed8b562d7907", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([2.8380, 0.5740, 5.0000, 2.0430, 1.2680, 1.8380, 1.4340, 2.6830, 1.6100,\n", + " 1.3050])" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "testY" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "422e317f-c9bd-4f76-9463-7af2935d401d", + "metadata": {}, + "outputs": [], + "source": [ + "scripted_mlp = torch.jit.load(\"housing_model.ts\")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "0cda8ec8-644e-4888-bfa0-b79425ece7c3", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([2.8778, 0.6233, 3.9021, 2.4543, 1.0209, 1.8093, 1.4593, 3.2933, 2.9263,\n", + " 1.4790], grad_fn=)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "scripted_mlp(testX).flatten()" + ] + }, + { + "cell_type": "markdown", + "id": "28ae694c-0127-4a61-8630-06004866cd14", + "metadata": {}, + "source": [ + "### Columns as separate input variables" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "32e11813-cf75-448e-a46e-f210cc7f52ba", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import torch\n", + "\n", + "from inspect import signature\n", + "from torch import nn\n", + "from torch.utils.data import DataLoader\n", + "from sklearn.datasets import fetch_california_housing\n", + "from sklearn.preprocessing import StandardScaler" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "dc7da567-65df-4895-a867-0be05de27ee0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "torch.manual_seed(42)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "e3340e01-b3bc-4cce-bb21-890517e1bcd5", + "metadata": {}, + "outputs": [], + "source": [ + "housing = fetch_california_housing()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "dea2ecd8-34e2-4ed5-8bd6-c9d56c951eeb", + "metadata": {}, + "outputs": [], + "source": [ + "class HousingDataset2(torch.utils.data.Dataset):\n", + " def __init__(self, X, y, scale_data=True):\n", + " if not torch.is_tensor(X) and not torch.is_tensor(y):\n", + " # Apply scaling if necessary\n", + " if scale_data:\n", + " X = StandardScaler().fit_transform(X)\n", + " self.X = torch.from_numpy(X.astype(np.float32))\n", + " self.y = torch.from_numpy(y.astype(np.float32))\n", + " \n", + " # Split dataset into separate variables\n", + " self.MedInc = self.X[:,0]\n", + " self.HouseAge = self.X[:,1]\n", + " self.AveRooms = self.X[:,2]\n", + " self.AveBedrms = self.X[:,3]\n", + " self.Population = self.X[:,4]\n", + " self.AveOccup = self.X[:,5]\n", + " self.Latitude = self.X[:,6]\n", + " self.Longitude = self.X[:,7]\n", + "\n", + " def __len__(self):\n", + " return len(self.MedInc)\n", + "\n", + " def __getitem__(self, i):\n", + " # Note: also returning combined X for ease of use later\n", + " return self.MedInc[i], self.HouseAge[i], self.AveRooms[i], self.AveBedrms[i], self.Population[i], self.AveOccup[i], self.Latitude[i], self.Longitude[i], self.y[i]" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "f52f4640-e190-413e-8e01-d67492408f97", + "metadata": {}, + "outputs": [], + "source": [ + "dataset2 = HousingDataset2(housing.data, housing.target)\n", + "trainloader2 = torch.utils.data.DataLoader(dataset2, batch_size=10, shuffle=True, num_workers=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "e2179934-6ae0-4d58-ae2c-d82f90d48074", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[tensor([ 0.4159, -0.3706, -0.2024, 0.1064, 0.1057, 0.3343, -0.2691, -0.0891,\n", + " 0.1397, -0.3399]),\n", + " tensor([ 0.3465, 0.5849, -0.8454, -1.9578, 1.0616, -1.4811, 1.3000, -0.3686,\n", + " -0.2097, 0.3465]),\n", + " tensor([ 0.2294, -0.1514, 0.1928, 0.2968, 0.1675, -0.7187, -0.6491, 0.0260,\n", + " 0.1816, -0.4621]),\n", + " tensor([-0.1113, -0.2040, 0.0087, 0.0363, -0.0081, 0.2041, -0.0872, -0.1563,\n", + " -0.1881, -0.0519]),\n", + " tensor([-0.3130, 0.3943, 0.5435, 2.7556, -0.3651, 0.0967, 1.7074, 0.3996,\n", + " 0.4049, 0.6115]),\n", + " tensor([ 0.0527, 0.0550, -0.0279, -0.0217, -0.0372, 0.0529, -0.1372, 0.0449,\n", + " -0.0229, -0.0284]),\n", + " tensor([-0.5955, -0.8155, 0.9449, -0.4925, -0.6751, -0.8483, -0.7312, 1.1790,\n", + " -0.7547, -0.6704]),\n", + " tensor([ 0.3193, 0.6687, -1.2679, 0.7685, 0.7186, 0.8234, 0.6088, -1.3378,\n", + " 1.2676, 0.5189]),\n", + " tensor([1.8790, 1.1770, 3.3160, 1.5430, 2.3400, 1.5240, 2.8750, 1.2360, 1.2100,\n", + " 2.0530])]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "next(iter(trainloader2))" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "7fc3383b-fb1c-4daf-9844-88df7abf799d", + "metadata": {}, + "outputs": [], + "source": [ + "class MLP2(nn.Module):\n", + " def __init__(self):\n", + " super().__init__()\n", + " self.layers = nn.Sequential(\n", + " nn.Linear(8, 64),\n", + " nn.ReLU(),\n", + " nn.Linear(64, 32),\n", + " nn.ReLU(),\n", + " nn.Linear(32, 1)\n", + " )\n", + "\n", + " def forward(self, inc, age, rms, bdrms, pop, occup, lat, lon): \n", + " combined = torch.column_stack((inc, age, rms, bdrms, pop, occup, lat, lon))\n", + " return self.layers(combined)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "25e9de54-a8da-46da-ba89-177a75227420", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize the MLP\n", + "mlp2 = MLP2()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "631116aa-e496-4125-9970-14aeb816c106", + "metadata": {}, + "outputs": [], + "source": [ + "# Define the loss function and optimizer\n", + "loss_function = nn.L1Loss()\n", + "optimizer = torch.optim.Adam(mlp2.parameters(), lr=1e-4)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "509d0581-5911-4f21-b0c8-b94523f66dd2", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Starting epoch 1\n", + "Loss after mini-batch 1: 0.004\n", + "Loss after mini-batch 201: 0.733\n", + "Loss after mini-batch 401: 0.534\n", + "Loss after mini-batch 601: 0.403\n", + "Loss after mini-batch 801: 0.330\n", + "Loss after mini-batch 1001: 0.269\n", + "Loss after mini-batch 1201: 0.232\n", + "Loss after mini-batch 1401: 0.226\n", + "Loss after mini-batch 1601: 0.223\n", + "Loss after mini-batch 1801: 0.214\n", + "Loss after mini-batch 2001: 0.214\n", + "Starting epoch 2\n", + "Loss after mini-batch 1: 0.002\n", + "Loss after mini-batch 201: 0.211\n", + "Loss after mini-batch 401: 0.205\n", + "Loss after mini-batch 601: 0.199\n", + "Loss after mini-batch 801: 0.192\n", + "Loss after mini-batch 1001: 0.194\n", + "Loss after mini-batch 1201: 0.196\n", + "Loss after mini-batch 1401: 0.193\n", + "Loss after mini-batch 1601: 0.194\n", + "Loss after mini-batch 1801: 0.187\n", + "Loss after mini-batch 2001: 0.197\n", + "Starting epoch 3\n", + "Loss after mini-batch 1: 0.001\n", + "Loss after mini-batch 201: 0.190\n", + "Loss after mini-batch 401: 0.183\n", + "Loss after mini-batch 601: 0.181\n", + "Loss after mini-batch 801: 0.190\n", + "Loss after mini-batch 1001: 0.188\n", + "Loss after mini-batch 1201: 0.186\n", + "Loss after mini-batch 1401: 0.193\n", + "Loss after mini-batch 1601: 0.182\n", + "Loss after mini-batch 1801: 0.184\n", + "Loss after mini-batch 2001: 0.188\n", + "Starting epoch 4\n", + "Loss after mini-batch 1: 0.001\n", + "Loss after mini-batch 201: 0.180\n", + "Loss after mini-batch 401: 0.179\n", + "Loss after mini-batch 601: 0.183\n", + "Loss after mini-batch 801: 0.180\n", + "Loss after mini-batch 1001: 0.176\n", + "Loss after mini-batch 1201: 0.189\n", + "Loss after mini-batch 1401: 0.176\n", + "Loss after mini-batch 1601: 0.185\n", + "Loss after mini-batch 1801: 0.177\n", + "Loss after mini-batch 2001: 0.185\n", + "Starting epoch 5\n", + "Loss after mini-batch 1: 0.001\n", + "Loss after mini-batch 201: 0.179\n", + "Loss after mini-batch 401: 0.177\n", + "Loss after mini-batch 601: 0.175\n", + "Loss after mini-batch 801: 0.178\n", + "Loss after mini-batch 1001: 0.173\n", + "Loss after mini-batch 1201: 0.178\n", + "Loss after mini-batch 1401: 0.176\n", + "Loss after mini-batch 1601: 0.174\n", + "Loss after mini-batch 1801: 0.179\n", + "Loss after mini-batch 2001: 0.180\n", + "Training process has finished.\n" + ] + } + ], + "source": [ + "# Run the training loop\n", + "for epoch in range(0, 5): # 5 epochs at maximum\n", + "\n", + " # Print epoch\n", + " print(f'Starting epoch {epoch+1}')\n", + "\n", + " # Set current loss value\n", + " current_loss = 0.0\n", + "\n", + " # Iterate over the DataLoader for training data\n", + " for i, data in enumerate(trainloader2, 0):\n", + "\n", + " # Get and prepare inputs\n", + " a,b,c,d,e,f,g,h,targets = data\n", + " targets = targets.reshape((targets.shape[0], 1))\n", + "\n", + " # Zero the gradients\n", + " optimizer.zero_grad()\n", + "\n", + " # Perform forward pass\n", + " outputs = mlp2(a,b,c,d,e,f,g,h)\n", + "\n", + " # Compute loss\n", + " loss = loss_function(outputs, targets)\n", + "\n", + " # Perform backward pass\n", + " loss.backward()\n", + "\n", + " # Perform optimization\n", + " optimizer.step()\n", + "\n", + " # Print statistics\n", + " current_loss += loss.item()\n", + " if i % 200 == 0:\n", + " print('Loss after mini-batch %5d: %.3f' %\n", + " (i + 1, current_loss / 500))\n", + " current_loss = 0.0\n", + "\n", + "# Process is complete.\n", + "print('Training process has finished.')" + ] + }, + { + "cell_type": "markdown", + "id": "5029a35d-8fbd-4a11-b3b0-55bcc0a072dd", + "metadata": {}, + "source": [ + "### Save Model" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "ca720ac4-8b4e-489b-844f-d54dd0659755", + "metadata": {}, + "outputs": [], + "source": [ + "torch.save(mlp2, \"housing_model2.pt\")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "cdcced78-62ee-45fa-b334-6f73a2b21d32", + "metadata": {}, + "outputs": [], + "source": [ + "scripted = torch.jit.script(mlp2)\n", + "scripted.save(\"housing_model2.ts\")" + ] + }, + { + "cell_type": "markdown", + "id": "8ecb33c2-2e3f-487c-8b12-c4e8f13a67a2", + "metadata": {}, + "source": [ + "### Load and Test Model" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "c54b12f2-9981-477b-8c21-a652a1736fc9", + "metadata": {}, + "outputs": [], + "source": [ + "a,b,c,d,e,f,g,h,targets = next(iter(trainloader2))" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "31b2fa69-9a8a-4409-8652-23c547536e50", + "metadata": {}, + "outputs": [], + "source": [ + "loaded_mlp2 = torch.load(\"housing_model2.pt\")" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "80a21d52-ea98-4c74-98e8-1e088cdfa742", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[2.8778],\n", + " [0.6233],\n", + " [3.9021],\n", + " [2.4543],\n", + " [1.0209],\n", + " [1.8093],\n", + " [1.4593],\n", + " [3.2933],\n", + " [2.9263],\n", + " [1.4790]], grad_fn=)" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "loaded_mlp2(a,b,c,d,e,f,g,h)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "90d29fb0-5923-4684-8aa6-62618e8f1ef6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(inc, age, rms, bdrms, pop, occup, lat, lon)\n" + ] + } + ], + "source": [ + "print(signature(loaded_mlp2.forward))" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "165772b2-8277-4b6e-a178-c99ea2a031fa", + "metadata": {}, + "outputs": [], + "source": [ + "scripted_mlp2 = torch.jit.load(\"housing_model2.ts\")" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "e53d927e-fa6d-419d-b570-8ca9b0756812", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[2.8778],\n", + " [0.6233],\n", + " [3.9021],\n", + " [2.4543],\n", + " [1.0209],\n", + " [1.8093],\n", + " [1.4593],\n", + " [3.2933],\n", + " [2.9263],\n", + " [1.4790]], grad_fn=)" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "scripted_mlp2(a,b,c,d,e,f,g,h)" + ] + }, + { + "cell_type": "markdown", + "id": "13631d1f-2c71-4bee-afcb-bd3b55ec87c5", + "metadata": {}, + "source": [ + "## PySpark" + ] + }, + { + "cell_type": "markdown", + "id": "e3b9937e-2c70-4d67-b95f-4d9d5ab17c12", + "metadata": {}, + "source": [ + "### Convert dataset to Spark DataFrame" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "cf35da14-61a3-4e7b-9d4f-086bf5e931b3", + "metadata": {}, + "outputs": [], + "source": [ + "housing = fetch_california_housing()" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "95148019-ea95-40e5-a529-fcdb9a06f928", + "metadata": {}, + "outputs": [], + "source": [ + "X = StandardScaler().fit_transform(housing.data.astype(np.float32))" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "f82d957c-6747-4408-aac8-45305afbfe5e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MedIncHouseAgeAveRoomsAveBedrmsPopulationAveOccupLatitudeLongitude
02.3447660.9821430.628559-0.153758-0.974429-0.0495971.052549-1.327837
12.332238-0.6070190.327041-0.2633360.861439-0.0925121.043185-1.322845
21.7826991.8561821.155620-0.049016-0.820777-0.0258431.038502-1.332825
30.9329671.8561820.156966-0.049833-0.766028-0.0503291.038502-1.337818
4-0.0128811.8561820.344711-0.032906-0.759847-0.0856161.038502-1.337818
...........................
20635-1.216128-0.289187-0.1550230.077354-0.512592-0.0491101.801647-0.758824
20636-0.691593-0.8453930.2768810.462365-0.9444050.0050211.806329-0.818721
20637-1.142593-0.924851-0.0903180.049414-0.369537-0.0717341.778238-0.823714
20638-1.054583-0.845393-0.0402110.158778-0.604429-0.0912251.778238-0.873626
20639-0.780129-1.004309-0.0704430.138403-0.033977-0.0436821.750146-0.833695
\n", + "

20640 rows × 8 columns

\n", + "
" + ], + "text/plain": [ + " MedInc HouseAge AveRooms AveBedrms Population AveOccup \n", + "0 2.344766 0.982143 0.628559 -0.153758 -0.974429 -0.049597 \\\n", + "1 2.332238 -0.607019 0.327041 -0.263336 0.861439 -0.092512 \n", + "2 1.782699 1.856182 1.155620 -0.049016 -0.820777 -0.025843 \n", + "3 0.932967 1.856182 0.156966 -0.049833 -0.766028 -0.050329 \n", + "4 -0.012881 1.856182 0.344711 -0.032906 -0.759847 -0.085616 \n", + "... ... ... ... ... ... ... \n", + "20635 -1.216128 -0.289187 -0.155023 0.077354 -0.512592 -0.049110 \n", + "20636 -0.691593 -0.845393 0.276881 0.462365 -0.944405 0.005021 \n", + "20637 -1.142593 -0.924851 -0.090318 0.049414 -0.369537 -0.071734 \n", + "20638 -1.054583 -0.845393 -0.040211 0.158778 -0.604429 -0.091225 \n", + "20639 -0.780129 -1.004309 -0.070443 0.138403 -0.033977 -0.043682 \n", + "\n", + " Latitude Longitude \n", + "0 1.052549 -1.327837 \n", + "1 1.043185 -1.322845 \n", + "2 1.038502 -1.332825 \n", + "3 1.038502 -1.337818 \n", + "4 1.038502 -1.337818 \n", + "... ... ... \n", + "20635 1.801647 -0.758824 \n", + "20636 1.806329 -0.818721 \n", + "20637 1.778238 -0.823714 \n", + "20638 1.778238 -0.873626 \n", + "20639 1.750146 -0.833695 \n", + "\n", + "[20640 rows x 8 columns]" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pdf = pd.DataFrame(X, columns=housing.feature_names)\n", + "pdf" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "5ba338cd-76d2-46bd-baf5-7d18a339a449", + "metadata": {}, + "outputs": [], + "source": [ + "foo = pdf.to_dict('series')" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "224b5036-d2ed-4edf-975f-66127862343d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys(['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude'])" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "foo.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "0b32ea98-a7f1-4011-a067-700377f1717f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "MedInc float32\n", + "HouseAge float32\n", + "AveRooms float32\n", + "AveBedrms float32\n", + "Population float32\n", + "AveOccup float32\n", + "Latitude float32\n", + "Longitude float32\n", + "dtype: object" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pdf.dtypes" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "6388cce9-6469-4f5a-898a-1a0b74eec438", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 0:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------+----------+------------+------------+-----------+------------+---------+----------+\n", + "| MedInc| HouseAge| AveRooms| AveBedrms| Population| AveOccup| Latitude| Longitude|\n", + "+------------+----------+------------+------------+-----------+------------+---------+----------+\n", + "| 2.344766| 0.9821427| 0.62855947| -0.15375753|-0.97442853|-0.049596533|1.0525488|-1.3278369|\n", + "| 2.3322382|-0.6070189| 0.32704142| -0.26333576| 0.8614389| -0.09251223|1.0431849|-1.3228445|\n", + "| 1.7826993| 1.8561815| 1.1556205|-0.049016476|-0.82077736|-0.025842525| 1.038502|-1.3328254|\n", + "| 0.93296736| 1.8561815| 0.15696616|-0.049833003|-0.76602805|-0.050329294| 1.038502|-1.3378178|\n", + "|-0.012881001| 1.8561815| 0.34471077|-0.032905966| -0.7598467| -0.08561575| 1.038502|-1.3378178|\n", + "| 0.087446585| 1.8561815| -0.26972958| 0.014669393|-0.89407074|-0.089618415| 1.038502|-1.3378178|\n", + "| -0.11136628| 1.8561815| -0.20091766| -0.30663314| -0.2927116| -0.09072491|1.0338209|-1.3378178|\n", + "| -0.39513668| 1.8561815| -0.255232|-0.073541574|-0.23707923| -0.12347647|1.0338209|-1.3378178|\n", + "| -0.94235915| 1.0616008| -0.45870265| 0.04425391|-0.19380963| -0.10049919|1.0338209|-1.3428102|\n", + "| -0.09446957| 1.8561815| -0.18528317| -0.22468716| 0.1108437| -0.08650142|1.0338209|-1.3378178|\n", + "| -0.35139465| 1.8561815| 0.019648364|-0.036026947|-0.45519334| -0.07769971| 1.038502|-1.3428102|\n", + "| -0.31591678| 1.8561815| -0.26535577| -0.15225175| 0.06934021| -0.09836594| 1.038502|-1.3428102|\n", + "| -0.41882363| 1.8561815|-0.042985205| -0.17694615|-0.28917935| -0.06975886| 1.038502|-1.3428102|\n", + "| -0.6301118| 1.8561815| -0.5775806| 0.002165105| -0.9541183| -0.10474847|1.0338209|-1.3428102|\n", + "| -1.0285273| 1.8561815| -0.471319| -0.1835785|-0.18851131| -0.10743675| 1.038502|-1.3428102|\n", + "| -0.9188827| 1.6972654| -0.4795964| -0.05213217|-0.64328367|-0.041451186| 1.038502|-1.3428102|\n", + "| -0.576737| 1.8561815| 0.20636784| -0.10199789| -0.5585106| -0.06498151| 1.038502|-1.3477987|\n", + "| -0.92140937| 1.8561815| -0.5562374| -0.27364123| -0.6865533| -0.08974189| 1.038502|-1.3477987|\n", + "| -0.98936474| 1.6972654|-0.034486752|-0.022697322| -0.3845491| -0.06815911|1.0338209|-1.3428102|\n", + "| -0.6671161| 1.8561815| 0.014734507|-0.027513746| -0.649465|-0.054070402|1.0338209|-1.3477987|\n", + "+------------+----------+------------+------------+-----------+------------+---------+----------+\n", + "only showing top 20 rows\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "from pyspark.sql.types import *\n", + "\n", + "# Spark is somehow auto-converting Pandas float32 to DoubleType(), so forcing FloatType()\n", + "schema = StructType([\n", + "StructField(\"MedInc\",FloatType(),True),\n", + "StructField(\"HouseAge\",FloatType(),True),\n", + "StructField(\"AveRooms\",FloatType(),True),\n", + "StructField(\"AveBedrms\",FloatType(),True),\n", + "StructField(\"Population\",FloatType(),True),\n", + "StructField(\"AveOccup\",FloatType(),True),\n", + "StructField(\"Latitude\",FloatType(),True),\n", + "StructField(\"Longitude\",FloatType(),True)\n", + "])\n", + "\n", + "df = spark.createDataFrame(pdf, schema=schema)\n", + "df.show(truncate=12)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "7b33d367-fbf9-4918-b755-5447125547c4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "StructType([StructField('MedInc', FloatType(), True), StructField('HouseAge', FloatType(), True), StructField('AveRooms', FloatType(), True), StructField('AveBedrms', FloatType(), True), StructField('Population', FloatType(), True), StructField('AveOccup', FloatType(), True), StructField('Latitude', FloatType(), True), StructField('Longitude', FloatType(), True)])" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.schema" + ] + }, + { + "cell_type": "markdown", + "id": "21c9932f-c21f-4eda-954e-26c38925ff84", + "metadata": {}, + "source": [ + "### Save DataFrame as parquet" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "751bff7a-b687-4184-b3fa-b5f5b46ef5d1", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "df.write.mode(\"overwrite\").parquet(\"california_housing\")" + ] + }, + { + "cell_type": "markdown", + "id": "a80bb9ee-27fd-4604-89f8-6b438af0b984", + "metadata": {}, + "source": [ + "## Inference using Spark DL API\n", + "Note: you can restart the kernel and run from this point to simulate running in a different node or environment." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "986d1a97-ea84-4707-b94a-78498780c47c", + "metadata": {}, + "outputs": [], + "source": [ + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.functions import array, struct, col\n", + "from pyspark.sql.types import ArrayType, FloatType" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "1e40c266-24de-454d-a776-f3716ba50e90", + "metadata": {}, + "outputs": [], + "source": [ + "df = spark.read.parquet(\"california_housing\")" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "ac802fb6-f159-4776-b55d-b9c421e8c57e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['MedInc',\n", + " 'HouseAge',\n", + " 'AveRooms',\n", + " 'AveBedrms',\n", + " 'Population',\n", + " 'AveOccup',\n", + " 'Latitude',\n", + " 'Longitude']" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "columns = df.columns\n", + "columns" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "4b8de001-e791-4a91-bd6f-c80bdf1c4472", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+-----------+-----------+------------+-------------+------------+-------------+----------+------------+\n", + "| MedInc| HouseAge| AveRooms| AveBedrms| Population| AveOccup| Latitude| Longitude|\n", + "+-----------+-----------+------------+-------------+------------+-------------+----------+------------+\n", + "| -1.669445|-0.20972852| -1.1155425| -0.17418891| 0.2070965| -0.13437383| 0.5094524| -0.08001011|\n", + "| -0.8564016| -1.5605159| -0.53141737| -0.02190494| -0.66006166| -0.12997007| 0.5141335| -0.08001011|\n", + "| 0.73173314|-0.76593506| 0.67250663| -0.10979619| 0.14175056| -0.02296524| 0.5141335| -0.07002536|\n", + "|-0.44887984| -1.719432| 0.14690235| -0.009905009| -0.06664997| 0.01090982|0.50476956|-0.075017735|\n", + "|-0.96920437| -1.0837674| 0.058284093| 0.07351444| -0.20793848| -0.011342554| 0.5094524| -0.08001011|\n", + "| -1.0906925| 0.26701993| -0.72011936| -0.2243873| -0.6574125| 0.021105729|0.49072453| -0.08001011|\n", + "|-0.90240705| 0.5848523| 0.24784403| 0.08091579| -0.5205393| 0.043980353| 0.4954056|-0.060044423|\n", + "| -1.0712692|0.028645715| -0.38059494| 0.062626354| -0.5205393| -0.005065064|0.49072453| -0.09498342|\n", + "|0.026544658| -0.686477| 0.06193017| -0.20868859| 0.03401808| 0.017589226| 0.4766795|-0.050059676|\n", + "|-0.24211854| 0.34647804| 0.2122066| -0.11910806| -0.71127874| 0.047426607|0.47199664|-0.030093992|\n", + "| -1.1632799| -1.7988901| -0.3091| -0.16322336| -0.0719483| 0.01691941|0.46263272|-0.040078737|\n", + "| -0.4509853| 0.8232265| -0.10236703| -0.053904843| -0.6953838| -0.03862959|0.46731555| -0.05505205|\n", + "| -0.5102555|-0.76593506| 0.26753396| 0.023170268| -0.14877392|-0.0061120046| 0.4766795|-0.084998675|\n", + "| -1.1635431| 0.18756187| -0.59673625| -0.023986263| -0.71481097| -0.014560648|0.46263272| -0.05505205|\n", + "|-0.15400293| 0.5053942| 0.33031902|-0.0012220128| -0.35275918| 0.0010038698|0.46263272| -0.08001011|\n", + "|-0.27733323| 0.18756187|-0.010031368| -0.13782738| -0.32450148| 0.059288267| 0.4485877| -0.08001011|\n", + "| -0.8956694| 0.18756187|-0.043201063| -0.12283955|-0.087843254| 0.011250444|0.49072453| -0.11494911|\n", + "|-0.57936895|-0.13027044| 0.15416715| 0.08602174| -0.6353362| 0.026508931| 0.4766795| -0.10496436|\n", + "| -0.8548752| 0.1081038|-0.061331607| -0.26316243| -0.36865416| 0.0066948985|0.47199664| -0.12493005|\n", + "| -1.1061679| 0.42593613| 0.053027753| -0.12104499| -0.2132368| -0.015556259| 0.4766795| -0.11494911|\n", + "+-----------+-----------+------------+-------------+------------+-------------+----------+------------+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "df.show()" + ] + }, + { + "cell_type": "markdown", + "id": "650dda22-31b7-419b-96d4-387a036f3b07", + "metadata": {}, + "source": [ + "### Using TorchScript Model (single input)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "3d608e2f-66a8-44b5-9cde-5f7837bf4247", + "metadata": {}, + "outputs": [], + "source": [ + "# get absolute path to model\n", + "model_dir = \"{}/housing_model.ts\".format(os.getcwd())" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "a2f45f5d-c941-4197-a274-1eec2af3fca4", + "metadata": {}, + "outputs": [], + "source": [ + "def predict_batch_fn():\n", + " import torch\n", + " device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", + " print(\"Using {} device\".format(device))\n", + " \n", + " scripted_mlp = torch.jit.load(model_dir)\n", + " scripted_mlp.to(device)\n", + " \n", + " def predict(inputs):\n", + " torch_inputs = torch.from_numpy(inputs).to(device)\n", + " outputs = scripted_mlp(torch_inputs) # .flatten()\n", + " return outputs.detach().numpy()\n", + "\n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "220a00a4-e842-4f5d-a4b3-7693d09e2d31", + "metadata": {}, + "outputs": [], + "source": [ + "classify = predict_batch_udf(predict_batch_fn,\n", + " return_type=FloatType(),\n", + " input_tensor_shapes=[[8]],\n", + " batch_size=50)" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "0f3bf287-8ffc-4456-8772-e97c418d6aee", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 200 ms, sys: 6.02 ms, total: 206 ms\n", + "Wall time: 3.24 s\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", classify(struct(*columns)))\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "6cd23b71-296d-4ce7-b56c-567cc2eec79c", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 48.7 ms, sys: 2.68 ms, total: 51.4 ms\n", + "Wall time: 540 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", classify(array(*columns)))\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "13c52980-fc55-4e81-ae54-b476b98f11b1", + "metadata": {}, + "outputs": [], + "source": [ + "# should raise ValueError\n", + "# preds = df.withColumn(\"preds\", classify(*columns))\n", + "# results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "764a40d8-25f7-425c-ba03-fe8c45f4b063", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+-----------+-----------+------------+-------------+------------+-------------+----------+------------+----------+\n", + "| MedInc| HouseAge| AveRooms| AveBedrms| Population| AveOccup| Latitude| Longitude| preds|\n", + "+-----------+-----------+------------+-------------+------------+-------------+----------+------------+----------+\n", + "| -1.669445|-0.20972852| -1.1155425| -0.17418891| 0.2070965| -0.13437383| 0.5094524| -0.08001011| 0.8521974|\n", + "| -0.8564016| -1.5605159| -0.53141737| -0.02190494| -0.66006166| -0.12997007| 0.5141335| -0.08001011| 1.1964239|\n", + "| 0.73173314|-0.76593506| 0.67250663| -0.10979619| 0.14175056| -0.02296524| 0.5141335| -0.07002536| 1.7371099|\n", + "|-0.44887984| -1.719432| 0.14690235| -0.009905009| -0.06664997| 0.01090982|0.50476956|-0.075017735| 1.0491724|\n", + "|-0.96920437| -1.0837674| 0.058284093| 0.07351444| -0.20793848| -0.011342554| 0.5094524| -0.08001011| 0.8659589|\n", + "| -1.0906925| 0.26701993| -0.72011936| -0.2243873| -0.6574125| 0.021105729|0.49072453| -0.08001011|0.70745003|\n", + "|-0.90240705| 0.5848523| 0.24784403| 0.08091579| -0.5205393| 0.043980353| 0.4954056|-0.060044423| 0.5371985|\n", + "| -1.0712692|0.028645715| -0.38059494| 0.062626354| -0.5205393| -0.005065064|0.49072453| -0.09498342| 0.8064569|\n", + "|0.026544658| -0.686477| 0.06193017| -0.20868859| 0.03401808| 0.017589226| 0.4766795|-0.050059676| 1.1329681|\n", + "|-0.24211854| 0.34647804| 0.2122066| -0.11910806| -0.71127874| 0.047426607|0.47199664|-0.030093992|0.87097365|\n", + "| -1.1632799| -1.7988901| -0.3091| -0.16322336| -0.0719483| 0.01691941|0.46263272|-0.040078737| 0.6880104|\n", + "| -0.4509853| 0.8232265| -0.10236703| -0.053904843| -0.6953838| -0.03862959|0.46731555| -0.05505205| 0.9974648|\n", + "| -0.5102555|-0.76593506| 0.26753396| 0.023170268| -0.14877392|-0.0061120046| 0.4766795|-0.084998675| 1.0234879|\n", + "| -1.1635431| 0.18756187| -0.59673625| -0.023986263| -0.71481097| -0.014560648|0.46263272| -0.05505205|0.82353294|\n", + "|-0.15400293| 0.5053942| 0.33031902|-0.0012220128| -0.35275918| 0.0010038698|0.46263272| -0.08001011| 1.1798486|\n", + "|-0.27733323| 0.18756187|-0.010031368| -0.13782738| -0.32450148| 0.059288267| 0.4485877| -0.08001011| 0.8976056|\n", + "| -0.8956694| 0.18756187|-0.043201063| -0.12283955|-0.087843254| 0.011250444|0.49072453| -0.11494911|0.61913794|\n", + "|-0.57936895|-0.13027044| 0.15416715| 0.08602174| -0.6353362| 0.026508931| 0.4766795| -0.10496436| 0.8908371|\n", + "| -0.8548752| 0.1081038|-0.061331607| -0.26316243| -0.36865416| 0.0066948985|0.47199664| -0.12493005| 0.6539954|\n", + "| -1.1061679| 0.42593613| 0.053027753| -0.12104499| -0.2132368| -0.015556259| 0.4766795| -0.11494911|0.54294837|\n", + "+-----------+-----------+------------+-------------+------------+-------------+----------+------------+----------+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "preds.show()" + ] + }, + { + "cell_type": "markdown", + "id": "773953dd-e645-4848-8f33-ed82f8242a43", + "metadata": {}, + "source": [ + "### Using TorchScript Model (separate input variables)" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "1a69a9d2-5c7f-4e71-bb65-ae51927ccacf", + "metadata": {}, + "outputs": [], + "source": [ + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.functions import struct, col\n", + "from pyspark.sql.types import ArrayType, FloatType" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "7214e2ac-fd2c-473e-a9c7-a65488570b5c", + "metadata": {}, + "outputs": [], + "source": [ + "df = spark.read.parquet(\"california_housing\")" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "5ee170b9-8ba6-4681-a10c-4cea71c1be15", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['MedInc',\n", + " 'HouseAge',\n", + " 'AveRooms',\n", + " 'AveBedrms',\n", + " 'Population',\n", + " 'AveOccup',\n", + " 'Latitude',\n", + " 'Longitude']" + ] + }, + "execution_count": 58, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "columns = df.columns\n", + "columns" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "0b7af043-5f20-49c7-bed6-39a9d13988e4", + "metadata": {}, + "outputs": [], + "source": [ + "# get absolute path to model\n", + "model2_dir = \"{}/housing_model2.ts\".format(os.getcwd())" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "104b2378-e191-4560-9a2e-276b8dcf0f2b", + "metadata": {}, + "outputs": [], + "source": [ + "def predict_batch_fn():\n", + " import torch\n", + " device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", + " print(\"Using {} device\".format(device))\n", + " scripted_mlp = torch.jit.load(model2_dir)\n", + " scripted_mlp.to(device)\n", + " \n", + " def predict(inc, age, rms, bdrms, pop, occ, lat, lon):\n", + " outputs = scripted_mlp(\n", + " torch.from_numpy(inc).to(device),\n", + " torch.from_numpy(age).to(device),\n", + " torch.from_numpy(rms).to(device),\n", + " torch.from_numpy(bdrms).to(device),\n", + " torch.from_numpy(pop).to(device),\n", + " torch.from_numpy(occ).to(device),\n", + " torch.from_numpy(lat).to(device),\n", + " torch.from_numpy(lon).to(device),\n", + " )\n", + " return outputs.detach().numpy()\n", + "\n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "020056dc-f8b0-483a-88eb-7e1ff2a0fdcf", + "metadata": {}, + "outputs": [], + "source": [ + "classify = predict_batch_udf(predict_batch_fn,\n", + " return_type=FloatType(),\n", + " batch_size=50)" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "1b73518e-04ec-49c7-bf1e-93520d94028e", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 192 ms, sys: 4.28 ms, total: 196 ms\n", + "Wall time: 1.89 s\n" + ] + } + ], + "source": [ + "%%time\n", + "# first pass caches model/fn\n", + "preds = df.withColumn(\"preds\", classify(struct(*columns)))\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "2d3559d3-644f-432e-92fc-21e6339a19f2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# should fail with ValueError\n", + "# preds = df.withColumn(\"preds\", classify(array(*columns)))\n", + "# results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "86b56805-a211-43cb-878d-78957b08f865", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 64.7 ms, sys: 584 µs, total: 65.3 ms\n", + "Wall time: 363 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", classify(*columns))\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "id": "5032b474-db92-4f04-b732-8b9d418cf211", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+-----------+-----------+------------+-------------+------------+-------------+----------+------------+----------+\n", + "| MedInc| HouseAge| AveRooms| AveBedrms| Population| AveOccup| Latitude| Longitude| preds|\n", + "+-----------+-----------+------------+-------------+------------+-------------+----------+------------+----------+\n", + "| -1.669445|-0.20972852| -1.1155425| -0.17418891| 0.2070965| -0.13437383| 0.5094524| -0.08001011| 0.8521974|\n", + "| -0.8564016| -1.5605159| -0.53141737| -0.02190494| -0.66006166| -0.12997007| 0.5141335| -0.08001011| 1.1964239|\n", + "| 0.73173314|-0.76593506| 0.67250663| -0.10979619| 0.14175056| -0.02296524| 0.5141335| -0.07002536| 1.7371099|\n", + "|-0.44887984| -1.719432| 0.14690235| -0.009905009| -0.06664997| 0.01090982|0.50476956|-0.075017735| 1.0491724|\n", + "|-0.96920437| -1.0837674| 0.058284093| 0.07351444| -0.20793848| -0.011342554| 0.5094524| -0.08001011| 0.8659589|\n", + "| -1.0906925| 0.26701993| -0.72011936| -0.2243873| -0.6574125| 0.021105729|0.49072453| -0.08001011|0.70745003|\n", + "|-0.90240705| 0.5848523| 0.24784403| 0.08091579| -0.5205393| 0.043980353| 0.4954056|-0.060044423| 0.5371985|\n", + "| -1.0712692|0.028645715| -0.38059494| 0.062626354| -0.5205393| -0.005065064|0.49072453| -0.09498342| 0.8064569|\n", + "|0.026544658| -0.686477| 0.06193017| -0.20868859| 0.03401808| 0.017589226| 0.4766795|-0.050059676| 1.1329681|\n", + "|-0.24211854| 0.34647804| 0.2122066| -0.11910806| -0.71127874| 0.047426607|0.47199664|-0.030093992|0.87097365|\n", + "| -1.1632799| -1.7988901| -0.3091| -0.16322336| -0.0719483| 0.01691941|0.46263272|-0.040078737| 0.6880104|\n", + "| -0.4509853| 0.8232265| -0.10236703| -0.053904843| -0.6953838| -0.03862959|0.46731555| -0.05505205| 0.9974648|\n", + "| -0.5102555|-0.76593506| 0.26753396| 0.023170268| -0.14877392|-0.0061120046| 0.4766795|-0.084998675| 1.0234879|\n", + "| -1.1635431| 0.18756187| -0.59673625| -0.023986263| -0.71481097| -0.014560648|0.46263272| -0.05505205|0.82353294|\n", + "|-0.15400293| 0.5053942| 0.33031902|-0.0012220128| -0.35275918| 0.0010038698|0.46263272| -0.08001011| 1.1798486|\n", + "|-0.27733323| 0.18756187|-0.010031368| -0.13782738| -0.32450148| 0.059288267| 0.4485877| -0.08001011| 0.8976056|\n", + "| -0.8956694| 0.18756187|-0.043201063| -0.12283955|-0.087843254| 0.011250444|0.49072453| -0.11494911|0.61913794|\n", + "|-0.57936895|-0.13027044| 0.15416715| 0.08602174| -0.6353362| 0.026508931| 0.4766795| -0.10496436| 0.8908371|\n", + "| -0.8548752| 0.1081038|-0.061331607| -0.26316243| -0.36865416| 0.0066948985|0.47199664| -0.12493005| 0.6539954|\n", + "| -1.1061679| 0.42593613| 0.053027753| -0.12104499| -0.2132368| -0.015556259| 0.4766795| -0.11494911|0.54294837|\n", + "+-----------+-----------+------------+-------------+------------+-------------+----------+------------+----------+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "preds.show()" + ] + }, + { + "cell_type": "markdown", + "id": "c1445875-fa94-4318-9bb8-0b9bfab0a795", + "metadata": {}, + "source": [ + "### Using Triton Inference Server\n", + "\n", + "Note: you can restart the kernel and run from this point to simulate running in a different node or environment." + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "a9ab4cdf-8103-447e-9ac8-944e2e527239", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "from functools import partial\n", + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.functions import struct, col, array\n", + "from pyspark.sql.types import ArrayType, FloatType, Union, Dict" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "6632636e-67a3-406c-832c-758aac4245fd", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "# copy custom model to expected layout for Triton\n", + "rm -rf models\n", + "mkdir models\n", + "cp -r models_config/housing_model models\n", + "mkdir -p models/housing_model/1\n", + "cp housing_model.ts models/housing_model/1/model.pt" + ] + }, + { + "cell_type": "markdown", + "id": "a99f8022-d9a4-4f60-bfa0-c37241d24292", + "metadata": {}, + "source": [ + "#### Start Triton Server on each executor" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "id": "c6fd1612-de6a-461c-a2ad-1a3fcd277d66", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "[True]" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "num_executors = 1\n", + "triton_models_dir = \"{}/models\".format(os.getcwd())\n", + "nodeRDD = sc.parallelize(list(range(num_executors)), num_executors)\n", + "\n", + "def start_triton(it):\n", + " import docker\n", + " import time\n", + " import tritonclient.grpc as grpcclient\n", + " \n", + " client=docker.from_env()\n", + " containers=client.containers.list(filters={\"name\": \"spark-triton\"})\n", + " if containers:\n", + " print(\">>>> containers: {}\".format([c.short_id for c in containers]))\n", + " else:\n", + " container=client.containers.run(\n", + " \"nvcr.io/nvidia/tritonserver:22.07-py3\", \"tritonserver --model-repository=/models\",\n", + " detach=True,\n", + " device_requests=[docker.types.DeviceRequest(device_ids=[\"0\"], capabilities=[['gpu']])],\n", + " name=\"spark-triton\",\n", + " network_mode=\"host\",\n", + " remove=True,\n", + " shm_size=\"64M\",\n", + " volumes={triton_models_dir: {\"bind\": \"/models\", \"mode\": \"ro\"}}\n", + " )\n", + " print(\">>>> starting triton: {}\".format(container.short_id))\n", + "\n", + " # wait for triton to be running\n", + " time.sleep(15)\n", + " client = grpcclient.InferenceServerClient(\"localhost:8001\")\n", + " ready = False\n", + " while not ready:\n", + " try:\n", + " ready = client.is_server_ready()\n", + " except Exception as e:\n", + " time.sleep(5)\n", + " \n", + " return [True]\n", + "\n", + "nodeRDD.barrier().mapPartitions(start_triton).collect()" + ] + }, + { + "cell_type": "markdown", + "id": "20b8514e-01de-481f-86aa-75afd99bcc7c", + "metadata": {}, + "source": [ + "### Run Inference" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "5eae04bc-75ca-421a-87c8-ac507ce1f2f5", + "metadata": {}, + "outputs": [], + "source": [ + "df = spark.read.parquet(\"california_housing\")" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "b350bd8e-9b8f-4511-9ddf-76d917b21b5f", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['MedInc',\n", + " 'HouseAge',\n", + " 'AveRooms',\n", + " 'AveBedrms',\n", + " 'Population',\n", + " 'AveOccup',\n", + " 'Latitude',\n", + " 'Longitude']" + ] + }, + "execution_count": 70, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "columns = df.columns\n", + "columns" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "69b343ec-688d-4e4d-985e-db72beaaf00c", + "metadata": {}, + "outputs": [], + "source": [ + "def triton_fn(triton_uri, model_name):\n", + " import numpy as np\n", + " import tritonclient.grpc as grpcclient\n", + " \n", + " np_types = {\n", + " \"BOOL\": np.dtype(np.bool8),\n", + " \"INT8\": np.dtype(np.int8),\n", + " \"INT16\": np.dtype(np.int16),\n", + " \"INT32\": np.dtype(np.int32),\n", + " \"INT64\": np.dtype(np.int64),\n", + " \"FP16\": np.dtype(np.float16),\n", + " \"FP32\": np.dtype(np.float32),\n", + " \"FP64\": np.dtype(np.float64),\n", + " \"FP64\": np.dtype(np.double),\n", + " \"BYTES\": np.dtype(object)\n", + " }\n", + "\n", + " client = grpcclient.InferenceServerClient(triton_uri)\n", + " model_meta = client.get_model_metadata(model_name)\n", + " \n", + " def predict(inputs):\n", + " if isinstance(inputs, np.ndarray):\n", + " # single ndarray input\n", + " request = [grpcclient.InferInput(model_meta.inputs[0].name, inputs.shape, model_meta.inputs[0].datatype)]\n", + " request[0].set_data_from_numpy(inputs.astype(np_types[model_meta.inputs[0].datatype]))\n", + " else:\n", + " # dict of multiple ndarray inputs\n", + " request = [grpcclient.InferInput(i.name, inputs[i.name].shape, i.datatype) for i in model_meta.inputs]\n", + " for i in request:\n", + " i.set_data_from_numpy(inputs[i.name()].astype(np_types[i.datatype()]))\n", + " \n", + " response = client.infer(model_name, inputs=request)\n", + " \n", + " if len(model_meta.outputs) > 1:\n", + " # return dictionary of numpy arrays\n", + " return {o.name: response.as_numpy(o.name) for o in model_meta.outputs}\n", + " else:\n", + " # return single numpy array\n", + " return response.as_numpy(model_meta.outputs[0].name)\n", + " \n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "d3e64fda-117b-4810-a9a2-dd498239496f", + "metadata": {}, + "outputs": [], + "source": [ + "classify = predict_batch_udf(partial(triton_fn, triton_uri=\"localhost:8001\", model_name=\"housing_model\"),\n", + " return_type=FloatType(),\n", + " input_tensor_shapes=[[8]],\n", + " batch_size=500)" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "a24149a5-3adc-4089-8769-13cf1e44547a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 13:> (0 + 8) / 8]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 74.3 ms, sys: 9.28 ms, total: 83.6 ms\n", + "Wall time: 1.07 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "# first pass caches model/fn\n", + "predictions = df.withColumn(\"preds\", classify(struct(*columns)))\n", + "preds = predictions.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "df2ce39f-30af-491a-8472-800fb1ce8458", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 197 ms, sys: 24.2 ms, total: 221 ms\n", + "Wall time: 400 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "predictions = df.withColumn(\"preds\", classify(array(*columns)))\n", + "preds = predictions.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "ca6f3eaa-9569-45d0-88bf-9aa0757e1ecb", + "metadata": {}, + "outputs": [], + "source": [ + "# should raise ValueError\n", + "# predictions = df.withColumn(\"preds\", classify(*columns))\n", + "# preds = predictions.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "b79c62c8-e1e8-4467-8aef-8939c31833b8", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+-----------+-----------+------------+-------------+------------+-------------+----------+------------+----------+\n", + "| MedInc| HouseAge| AveRooms| AveBedrms| Population| AveOccup| Latitude| Longitude| preds|\n", + "+-----------+-----------+------------+-------------+------------+-------------+----------+------------+----------+\n", + "| -1.669445|-0.20972852| -1.1155425| -0.17418891| 0.2070965| -0.13437383| 0.5094524| -0.08001011|0.85219747|\n", + "| -0.8564016| -1.5605159| -0.53141737| -0.02190494| -0.66006166| -0.12997007| 0.5141335| -0.08001011| 1.1964238|\n", + "| 0.73173314|-0.76593506| 0.67250663| -0.10979619| 0.14175056| -0.02296524| 0.5141335| -0.07002536| 1.7371097|\n", + "|-0.44887984| -1.719432| 0.14690235| -0.009905009| -0.06664997| 0.01090982|0.50476956|-0.075017735| 1.0491724|\n", + "|-0.96920437| -1.0837674| 0.058284093| 0.07351444| -0.20793848| -0.011342554| 0.5094524| -0.08001011| 0.8659591|\n", + "| -1.0906925| 0.26701993| -0.72011936| -0.2243873| -0.6574125| 0.021105729|0.49072453| -0.08001011| 0.7074499|\n", + "|-0.90240705| 0.5848523| 0.24784403| 0.08091579| -0.5205393| 0.043980353| 0.4954056|-0.060044423|0.53719854|\n", + "| -1.0712692|0.028645715| -0.38059494| 0.062626354| -0.5205393| -0.005065064|0.49072453| -0.09498342|0.80645704|\n", + "|0.026544658| -0.686477| 0.06193017| -0.20868859| 0.03401808| 0.017589226| 0.4766795|-0.050059676| 1.1329681|\n", + "|-0.24211854| 0.34647804| 0.2122066| -0.11910806| -0.71127874| 0.047426607|0.47199664|-0.030093992| 0.8709737|\n", + "| -1.1632799| -1.7988901| -0.3091| -0.16322336| -0.0719483| 0.01691941|0.46263272|-0.040078737| 0.6880103|\n", + "| -0.4509853| 0.8232265| -0.10236703| -0.053904843| -0.6953838| -0.03862959|0.46731555| -0.05505205| 0.9974648|\n", + "| -0.5102555|-0.76593506| 0.26753396| 0.023170268| -0.14877392|-0.0061120046| 0.4766795|-0.084998675| 1.0234879|\n", + "| -1.1635431| 0.18756187| -0.59673625| -0.023986263| -0.71481097| -0.014560648|0.46263272| -0.05505205| 0.823533|\n", + "|-0.15400293| 0.5053942| 0.33031902|-0.0012220128| -0.35275918| 0.0010038698|0.46263272| -0.08001011| 1.1798486|\n", + "|-0.27733323| 0.18756187|-0.010031368| -0.13782738| -0.32450148| 0.059288267| 0.4485877| -0.08001011| 0.8976056|\n", + "| -0.8956694| 0.18756187|-0.043201063| -0.12283955|-0.087843254| 0.011250444|0.49072453| -0.11494911|0.61913794|\n", + "|-0.57936895|-0.13027044| 0.15416715| 0.08602174| -0.6353362| 0.026508931| 0.4766795| -0.10496436| 0.890837|\n", + "| -0.8548752| 0.1081038|-0.061331607| -0.26316243| -0.36865416| 0.0066948985|0.47199664| -0.12493005| 0.6539954|\n", + "| -1.1061679| 0.42593613| 0.053027753| -0.12104499| -0.2132368| -0.015556259| 0.4766795| -0.11494911| 0.5429483|\n", + "+-----------+-----------+------------+-------------+------------+-------------+----------+------------+----------+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "predictions.show()" + ] + }, + { + "cell_type": "markdown", + "id": "3fec23b0-eaf2-4b6a-aa38-7a09873ed6eb", + "metadata": { + "tags": [] + }, + "source": [ + "#### Stop Triton Server on each executor" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "15e9b3df-f3c9-46bb-bbeb-42496f7663de", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "[True]" + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def stop_triton(it):\n", + " import docker\n", + " import time\n", + " \n", + " client=docker.from_env()\n", + " containers=client.containers.list(filters={\"name\": \"spark-triton\"})\n", + " print(\">>>> stopping containers: {}\".format([c.short_id for c in containers]))\n", + " if containers:\n", + " container=containers[0]\n", + " container.stop(timeout=120)\n", + "\n", + " return [True]\n", + "\n", + "nodeRDD.barrier().mapPartitions(stop_triton).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "0138a029-87c5-497f-ac5c-3eed0e11b0f6", + "metadata": {}, + "outputs": [], + "source": [ + "spark.stop()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d24147e7-5695-44a0-9961-b94bfba1cfff", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/requirements.txt b/examples/ML+DL-Examples/Spark-DL/dl_inference/requirements.txt new file mode 100644 index 000000000..87c8dcfbe --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/requirements.txt @@ -0,0 +1,19 @@ +docker +huggingface +jupyterlab +matplotlib +numpy +pandas +portalocker +pyarrow +pyspark>=3.4.0 +sentencepiece +sentence_transformers +scikit-learn +tensorflow-cpu +transformers +tritonclient +--extra-index-url https://download.pytorch.org/whl/cpu +torch +torchtext +torchvision diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/feature_columns.ipynb b/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/feature_columns.ipynb new file mode 100644 index 000000000..2a338d4d8 --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/feature_columns.ipynb @@ -0,0 +1,1772 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "66834048-5285-44a9-a031-e2e6e3347442", + "metadata": {}, + "source": [ + "From: https://www.tensorflow.org/tutorials/structured_data/preprocessing_layers" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "01162f42-0637-4dfe-8d7d-b577e4ffd017", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import tensorflow as tf\n", + "\n", + "from tensorflow.keras import layers" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "9fa3e1b7-58cd-45f9-9fee-85f25a31c3c6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'2.12.0'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tf.__version__" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "9326b072-a53c-40c4-a6cb-bd4d3d644d03", + "metadata": {}, + "outputs": [], + "source": [ + "dataset_url = 'http://storage.googleapis.com/download.tensorflow.org/data/petfinder-mini.zip'\n", + "csv_file = 'datasets/petfinder-mini/petfinder-mini.csv'\n", + "\n", + "tf.keras.utils.get_file('petfinder_mini.zip', dataset_url,\n", + " extract=True, cache_dir='.')\n", + "dataframe = pd.read_csv(csv_file)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "e98480ef-d13d-44c0-a227-e9a22f9bf2b0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
TypeAgeBreed1GenderColor1Color2MaturitySizeFurLengthVaccinatedSterilizedHealthFeeDescriptionPhotoAmtAdoptionSpeed
0Cat3TabbyMaleBlackWhiteSmallShortNoNoHealthy100Nibble is a 3+ month old ball of cuteness. He ...12
1Cat1Domestic Medium HairMaleBlackBrownMediumMediumNot SureNot SureHealthy0I just found it alone yesterday near my apartm...20
2Dog1Mixed BreedMaleBrownWhiteMediumMediumYesNoHealthy0Their pregnant mother was dumped by her irresp...73
3Dog4Mixed BreedFemaleBlackBrownMediumShortYesNoHealthy150Good guard dog, very alert, active, obedience ...82
4Dog1Mixed BreedMaleBlackNo ColorMediumShortNoNoHealthy0This handsome yet cute boy is up for adoption....32
\n", + "
" + ], + "text/plain": [ + " Type Age Breed1 Gender Color1 Color2 MaturitySize \n", + "0 Cat 3 Tabby Male Black White Small \\\n", + "1 Cat 1 Domestic Medium Hair Male Black Brown Medium \n", + "2 Dog 1 Mixed Breed Male Brown White Medium \n", + "3 Dog 4 Mixed Breed Female Black Brown Medium \n", + "4 Dog 1 Mixed Breed Male Black No Color Medium \n", + "\n", + " FurLength Vaccinated Sterilized Health Fee \n", + "0 Short No No Healthy 100 \\\n", + "1 Medium Not Sure Not Sure Healthy 0 \n", + "2 Medium Yes No Healthy 0 \n", + "3 Short Yes No Healthy 150 \n", + "4 Short No No Healthy 0 \n", + "\n", + " Description PhotoAmt AdoptionSpeed \n", + "0 Nibble is a 3+ month old ball of cuteness. He ... 1 2 \n", + "1 I just found it alone yesterday near my apartm... 2 0 \n", + "2 Their pregnant mother was dumped by her irresp... 7 3 \n", + "3 Good guard dog, very alert, active, obedience ... 8 2 \n", + "4 This handsome yet cute boy is up for adoption.... 3 2 " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataframe.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "e8efce25-a835-4cbd-b8a2-1418ba2c1d31", + "metadata": {}, + "outputs": [], + "source": [ + "# In the original dataset, `'AdoptionSpeed'` of `4` indicates\n", + "# a pet was not adopted.\n", + "dataframe['target'] = np.where(dataframe['AdoptionSpeed']==4, 0, 1)\n", + "\n", + "# Drop unused features.\n", + "dataframe = dataframe.drop(columns=['AdoptionSpeed', 'Description'])" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "00d403cf-9ae7-4780-9fac-13d920d8b395", + "metadata": {}, + "outputs": [], + "source": [ + "train, val, test = np.split(dataframe.sample(frac=1), [int(0.8*len(dataframe)), int(0.9*len(dataframe))])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "4206a56e-5403-42a9-805e-e037044e7995", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9229 training examples\n", + "1154 validation examples\n", + "1154 test examples\n" + ] + } + ], + "source": [ + "print(len(train), 'training examples')\n", + "print(len(val), 'validation examples')\n", + "print(len(test), 'test examples')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "499ade5f-ac8a-47ca-a021-071239dfe97d", + "metadata": {}, + "outputs": [], + "source": [ + "def df_to_dataset(dataframe, shuffle=True, batch_size=32):\n", + " df = dataframe.copy()\n", + " labels = df.pop('target')\n", + " df = {key: np.array(value)[:, tf.newaxis] for key, value in dataframe.items()}\n", + " ds = tf.data.Dataset.from_tensor_slices((dict(df), labels))\n", + " if shuffle:\n", + " ds = ds.shuffle(buffer_size=len(dataframe))\n", + " ds = ds.batch(batch_size)\n", + " ds = ds.prefetch(batch_size)\n", + " return ds" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "b9ec57c9-080e-4626-9e03-acf309cf3736", + "metadata": {}, + "outputs": [], + "source": [ + "batch_size = 5\n", + "train_ds = df_to_dataset(train, batch_size=batch_size)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "dfcbf268-4508-4eb8-abe1-acf1dbb97bd5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Every feature: ['Type', 'Age', 'Breed1', 'Gender', 'Color1', 'Color2', 'MaturitySize', 'FurLength', 'Vaccinated', 'Sterilized', 'Health', 'Fee', 'PhotoAmt', 'target']\n", + "A batch of ages: tf.Tensor(\n", + "[[ 2]\n", + " [15]\n", + " [ 3]\n", + " [11]\n", + " [ 8]], shape=(5, 1), dtype=int64)\n", + "A batch of targets: tf.Tensor([1 1 1 1 1], shape=(5,), dtype=int64)\n" + ] + } + ], + "source": [ + "[(train_features, label_batch)] = train_ds.take(1)\n", + "print('Every feature:', list(train_features.keys()))\n", + "print('A batch of ages:', train_features['Age'])\n", + "print('A batch of targets:', label_batch )" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "6c09dc4b-3a2a-44f5-b41c-821ec30b87b1", + "metadata": {}, + "outputs": [], + "source": [ + "def get_normalization_layer(name, dataset):\n", + " # Create a Normalization layer for the feature.\n", + " normalizer = layers.Normalization(axis=None)\n", + "\n", + " # Prepare a Dataset that only yields the feature.\n", + " feature_ds = dataset.map(lambda x, y: x[name])\n", + "\n", + " # Learn the statistics of the data.\n", + " normalizer.adapt(feature_ds)\n", + "\n", + " return normalizer" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "59bb91dc-360a-4a89-a9ea-bebc1ddbf1b7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "photo_count_col = train_features['PhotoAmt']\n", + "layer = get_normalization_layer('PhotoAmt', train_ds)\n", + "layer(photo_count_col)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "4623b612-e924-472b-9ef4-c7f14f9f53c5", + "metadata": {}, + "outputs": [], + "source": [ + "def get_category_encoding_layer(name, dataset, dtype, max_tokens=None):\n", + " # Create a layer that turns strings into integer indices.\n", + " if dtype == 'string':\n", + " index = layers.StringLookup(max_tokens=max_tokens)\n", + " # Otherwise, create a layer that turns integer values into integer indices.\n", + " else:\n", + " index = layers.IntegerLookup(max_tokens=max_tokens)\n", + "\n", + " # Prepare a `tf.data.Dataset` that only yields the feature.\n", + " feature_ds = dataset.map(lambda x, y: x[name])\n", + "\n", + " # Learn the set of possible values and assign them a fixed integer index.\n", + " index.adapt(feature_ds)\n", + "\n", + " # Encode the integer indices.\n", + " encoder = layers.CategoryEncoding(num_tokens=index.vocabulary_size())\n", + "\n", + " # Apply multi-hot encoding to the indices. The lambda function captures the\n", + " # layer, so you can use them, or include them in the Keras Functional model later.\n", + " return lambda feature: encoder(index(feature))" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "0a40e9ee-20a5-4a42-8543-c267f99af55e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test_type_col = train_features['Type']\n", + "test_type_layer = get_category_encoding_layer(name='Type',\n", + " dataset=train_ds,\n", + " dtype='string')\n", + "test_type_layer(test_type_col)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "ff63a5cc-71f4-428e-9299-a8018edc7648", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test_age_col = train_features['Age']\n", + "test_age_layer = get_category_encoding_layer(name='Age',\n", + " dataset=train_ds,\n", + " dtype='int64',\n", + " max_tokens=5)\n", + "test_age_layer(test_age_col)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "2b040b0e-d8ca-4cf0-917c-dd9a272e1f0a", + "metadata": {}, + "outputs": [], + "source": [ + "batch_size = 256\n", + "train_ds = df_to_dataset(train, batch_size=batch_size)\n", + "val_ds = df_to_dataset(val, shuffle=False, batch_size=batch_size)\n", + "test_ds = df_to_dataset(test, shuffle=False, batch_size=batch_size)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "19df498e-4dd1-467a-8741-e1f5e15932a5", + "metadata": {}, + "outputs": [], + "source": [ + "all_inputs = []\n", + "encoded_features = []\n", + "\n", + "# Numerical features.\n", + "for header in ['PhotoAmt', 'Fee']:\n", + " numeric_col = tf.keras.Input(shape=(1,), name=header)\n", + " normalization_layer = get_normalization_layer(header, train_ds)\n", + " encoded_numeric_col = normalization_layer(numeric_col)\n", + " all_inputs.append(numeric_col)\n", + " encoded_features.append(encoded_numeric_col)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "1d12579f-34fb-40b0-a16a-3e13cfea8178", + "metadata": {}, + "outputs": [], + "source": [ + "age_col = tf.keras.Input(shape=(1,), name='Age', dtype='int64')\n", + "\n", + "encoding_layer = get_category_encoding_layer(name='Age',\n", + " dataset=train_ds,\n", + " dtype='int64',\n", + " max_tokens=5)\n", + "encoded_age_col = encoding_layer(age_col)\n", + "all_inputs.append(age_col)\n", + "encoded_features.append(encoded_age_col)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "bff286eb-7ad7-4d3a-8fa4-c729692d1425", + "metadata": {}, + "outputs": [], + "source": [ + "categorical_cols = ['Type', 'Color1', 'Color2', 'Gender', 'MaturitySize',\n", + " 'FurLength', 'Vaccinated', 'Sterilized', 'Health', 'Breed1']\n", + "\n", + "for header in categorical_cols:\n", + " categorical_col = tf.keras.Input(shape=(1,), name=header, dtype='string')\n", + " encoding_layer = get_category_encoding_layer(name=header,\n", + " dataset=train_ds,\n", + " dtype='string',\n", + " max_tokens=5)\n", + "\n", + " encoded_categorical_col = encoding_layer(categorical_col)\n", + " all_inputs.append(categorical_col)\n", + " encoded_features.append(encoded_categorical_col)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "79247436-32d8-4738-a656-3f288c77001c", + "metadata": {}, + "outputs": [], + "source": [ + "all_features = tf.keras.layers.concatenate(encoded_features)\n", + "x = tf.keras.layers.Dense(32, activation=\"relu\")(all_features)\n", + "x = tf.keras.layers.Dropout(0.5)(x)\n", + "output = tf.keras.layers.Dense(1)(x)\n", + "\n", + "model = tf.keras.Model(all_inputs, output)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "dbc85d3e-6d1e-4167-9516-b1182e880542", + "metadata": {}, + "outputs": [], + "source": [ + "model.compile(optimizer='adam',\n", + " loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),\n", + " metrics=[\"accuracy\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "03b54d91-26f3-4232-ac33-895599bd6126", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You must install pydot (`pip install pydot`) and install graphviz (see instructions at https://graphviz.gitlab.io/download/) for plot_model to work.\n" + ] + } + ], + "source": [ + "# Use `rankdir='LR'` to make the graph horizontal.\n", + "tf.keras.utils.plot_model(model, show_shapes=True, rankdir=\"LR\")" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "bc9836c8-3c1a-41ad-8833-a946bafcfb00", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/10\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/leey/.pyenv/versions/3.9.10/envs/spark_rapids_examples/lib/python3.9/site-packages/keras/engine/functional.py:639: UserWarning: Input dict contained keys ['target'] which did not match any model input. They will be ignored by the model.\n", + " inputs = self._flatten_to_reference_inputs(inputs)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "37/37 [==============================] - 1s 14ms/step - loss: 0.6070 - accuracy: 0.6274 - val_loss: 0.5371 - val_accuracy: 0.7374\n", + "Epoch 2/10\n", + "37/37 [==============================] - 0s 4ms/step - loss: 0.5733 - accuracy: 0.6728 - val_loss: 0.5245 - val_accuracy: 0.7366\n", + "Epoch 3/10\n", + "37/37 [==============================] - 0s 5ms/step - loss: 0.5552 - accuracy: 0.6964 - val_loss: 0.5158 - val_accuracy: 0.7409\n", + "Epoch 4/10\n", + "37/37 [==============================] - 0s 6ms/step - loss: 0.5469 - accuracy: 0.7025 - val_loss: 0.5116 - val_accuracy: 0.7470\n", + "Epoch 5/10\n", + "37/37 [==============================] - 0s 6ms/step - loss: 0.5419 - accuracy: 0.7097 - val_loss: 0.5090 - val_accuracy: 0.7409\n", + "Epoch 6/10\n", + "37/37 [==============================] - 0s 5ms/step - loss: 0.5356 - accuracy: 0.7142 - val_loss: 0.5089 - val_accuracy: 0.7461\n", + "Epoch 7/10\n", + "37/37 [==============================] - 0s 6ms/step - loss: 0.5327 - accuracy: 0.7073 - val_loss: 0.5056 - val_accuracy: 0.7530\n", + "Epoch 8/10\n", + "37/37 [==============================] - 0s 5ms/step - loss: 0.5319 - accuracy: 0.7148 - val_loss: 0.5039 - val_accuracy: 0.7574\n", + "Epoch 9/10\n", + "37/37 [==============================] - 0s 6ms/step - loss: 0.5229 - accuracy: 0.7223 - val_loss: 0.5042 - val_accuracy: 0.7565\n", + "Epoch 10/10\n", + "37/37 [==============================] - 0s 6ms/step - loss: 0.5242 - accuracy: 0.7200 - val_loss: 0.5023 - val_accuracy: 0.7582\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.fit(train_ds, epochs=10, validation_data=val_ds)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "fbccebaa-fc24-4a58-a032-222cef8fdf08", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5/5 [==============================] - 0s 5ms/step - loss: 0.4920 - accuracy: 0.7504\n", + "Accuracy 0.7504332661628723\n" + ] + } + ], + "source": [ + "loss, accuracy = model.evaluate(test_ds)\n", + "print(\"Accuracy\", accuracy)" + ] + }, + { + "cell_type": "markdown", + "id": "7534616c-8561-4869-b6e9-7254ebdb2c3f", + "metadata": {}, + "source": [ + "## Save and Reload Model" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "52425a31-7f21-415e-b166-7682c7eb282c", + "metadata": {}, + "outputs": [], + "source": [ + "import tensorflow as tf" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "d1724a4e-fdaa-4169-8740-05bf18cb3153", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:absl:Function `_wrapped_model` contains input name(s) PhotoAmt, Fee, Age, Type, Color1, Color2, Gender, MaturitySize, FurLength, Vaccinated, Sterilized, Health, Breed1 with unsupported characters which will be renamed to photoamt, fee, age, type, color1, color2, gender, maturitysize, furlength, vaccinated, sterilized, health, breed1 in the SavedModel.\n", + "WARNING:absl:Found untraced functions such as _update_step_xla while saving (showing 1 of 1). These functions will not be directly callable after loading.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: my_pet_classifier/assets\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: my_pet_classifier/assets\n" + ] + } + ], + "source": [ + "model.save('my_pet_classifier')" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "d604ca70-e0af-4cdb-8046-53e37f4b6afe", + "metadata": {}, + "outputs": [], + "source": [ + "reloaded_model = tf.keras.models.load_model('my_pet_classifier')" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "7b8be0a1-e16b-4509-8cbc-357def8bb282", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ]" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "reloaded_model.inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "f3d2a2d5-fd4d-4320-bacc-fd4571cec709", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/1 [==============================] - 0s 264ms/step\n", + "This particular pet had a 76.8 percent probability of getting adopted.\n" + ] + } + ], + "source": [ + "sample = {\n", + " 'Type': 'Cat',\n", + " 'Age': 3,\n", + " 'Breed1': 'Tabby',\n", + " 'Gender': 'Male',\n", + " 'Color1': 'Black',\n", + " 'Color2': 'White',\n", + " 'MaturitySize': 'Small',\n", + " 'FurLength': 'Short',\n", + " 'Vaccinated': 'No',\n", + " 'Sterilized': 'No',\n", + " 'Health': 'Healthy',\n", + " 'Fee': 100,\n", + " 'PhotoAmt': 2,\n", + "}\n", + "\n", + "input_dict = {name: tf.convert_to_tensor([value]) for name, value in sample.items()}\n", + "predictions = reloaded_model.predict(input_dict)\n", + "prob = tf.nn.sigmoid(predictions[0])\n", + "\n", + "print(\n", + " \"This particular pet had a %.1f percent probability \"\n", + " \"of getting adopted.\" % (100 * prob)\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "f7bbfe69-93ed-4452-8985-c6685e0726c3", + "metadata": {}, + "source": [ + "## PySpark" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "3c64fd7b-3d1e-40f8-ab64-b5c13f8bbe77", + "metadata": {}, + "outputs": [], + "source": [ + "df = spark.createDataFrame(dataframe)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "1be8215b-5068-41b4-849c-1c3ea7bb108a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "df.write.mode(\"overwrite\").parquet(\"datasets/petfinder-mini\")" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "d4dbde99-cf65-4c15-a163-754a0201a48d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+----+---+--------------------+------+------+--------+------------+---------+----------+----------+-------+---+--------+------+\n", + "|Type|Age| Breed1|Gender|Color1| Color2|MaturitySize|FurLength|Vaccinated|Sterilized| Health|Fee|PhotoAmt|target|\n", + "+----+---+--------------------+------+------+--------+------------+---------+----------+----------+-------+---+--------+------+\n", + "| Cat| 3| Tabby| Male| Black| White| Small| Short| No| No|Healthy|100| 1| 1|\n", + "| Cat| 1|Domestic Medium Hair| Male| Black| Brown| Medium| Medium| Not Sure| Not Sure|Healthy| 0| 2| 1|\n", + "| Dog| 1| Mixed Breed| Male| Brown| White| Medium| Medium| Yes| No|Healthy| 0| 7| 1|\n", + "| Dog| 4| Mixed Breed|Female| Black| Brown| Medium| Short| Yes| No|Healthy|150| 8| 1|\n", + "| Dog| 1| Mixed Breed| Male| Black|No Color| Medium| Short| No| No|Healthy| 0| 3| 1|\n", + "| Cat| 3| Domestic Short Hair|Female| Cream| Gray| Medium| Short| No| No|Healthy| 0| 2| 1|\n", + "| Cat| 12| Domestic Long Hair| Male| Black|No Color| Medium| Long| No| Not Sure|Healthy|300| 3| 1|\n", + "| Cat| 2|Domestic Medium Hair|Female| Gray|No Color| Medium| Medium| No| No|Healthy| 0| 6| 1|\n", + "| Cat| 12|Domestic Medium Hair|Female| Black| White| Medium| Medium| Not Sure| Not Sure|Healthy| 0| 2| 0|\n", + "| Dog| 2| Mixed Breed| Male| Black| Brown| Medium| Short| No| No|Healthy| 0| 7| 1|\n", + "| Cat| 3| Domestic Long Hair|Female| Black| Brown| Large| Long| Yes| No|Healthy| 50| 2| 1|\n", + "| Dog| 2| Mixed Breed| Male| Brown| Cream| Medium| Long| Yes| No|Healthy| 0| 1| 1|\n", + "| Dog| 3| Mixed Breed|Female| Brown| Cream| Medium| Medium| Not Sure| Not Sure|Healthy| 0| 2| 1|\n", + "| Dog| 78| Terrier| Male| Black| White| Medium| Medium| Not Sure| Not Sure|Healthy| 0| 2| 0|\n", + "| Cat| 6| Domestic Short Hair|Female| Brown|No Color| Small| Short| Yes| Yes|Healthy| 0| 1| 1|\n", + "| Dog| 8| Mixed Breed|Female| Brown|No Color| Medium| Short| No| Yes|Healthy| 10| 2| 0|\n", + "| Dog| 2| Mixed Breed|Female| Black|No Color| Medium| Short| No| No|Healthy| 0| 8| 1|\n", + "| Dog| 12| Mixed Breed|Female| Brown| White| Medium| Medium| No| Yes|Healthy| 0| 7| 1|\n", + "| Dog| 10| Mixed Breed|Female| Black| Brown| Medium| Medium| Yes| Yes|Healthy| 0| 0| 0|\n", + "| Cat| 3| Domestic Short Hair| Male| Brown| White| Small| Short| No| No|Healthy| 0| 19| 1|\n", + "+----+---+--------------------+------+------+--------+------------+---------+----------+----------+-------+---+--------+------+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "df.show()" + ] + }, + { + "cell_type": "markdown", + "id": "efa3e424-2920-44eb-afa0-885e40b620ed", + "metadata": {}, + "source": [ + "## Inference using Spark DL API" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "4c21296c-20ed-43f8-921a-c85a820d1819", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import os\n", + "\n", + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.functions import struct, col\n", + "from pyspark.sql.types import ArrayType, FloatType" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "04b38f3a-70ea-4746-9f52-c50087401508", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+----+---+-------------------+------+------+--------+------------+---------+----------+----------+-------+---+--------+------+\n", + "|Type|Age| Breed1|Gender|Color1| Color2|MaturitySize|FurLength|Vaccinated|Sterilized| Health|Fee|PhotoAmt|target|\n", + "+----+---+-------------------+------+------+--------+------------+---------+----------+----------+-------+---+--------+------+\n", + "| Dog| 7| Spitz| Male| Brown| Golden| Medium| Medium| Not Sure| No|Healthy| 0| 2| 0|\n", + "| Cat| 4|Domestic Short Hair|Female| White|No Color| Medium| Short| No| No|Healthy| 0| 2| 1|\n", + "| Cat| 3|Domestic Short Hair| Male| Brown|No Color| Small| Short| No| No|Healthy| 0| 2| 1|\n", + "| Cat| 11|Domestic Short Hair|Female| Brown| Yellow| Medium| Short| Yes| Yes|Healthy|100| 1| 0|\n", + "| Dog| 1| Mixed Breed| Male| Black| Brown| Medium| Medium| No| No|Healthy| 0| 1| 1|\n", + "+----+---+-------------------+------+------+--------+------------+---------+----------+----------+-------+---+--------+------+\n", + "only showing top 5 rows\n", + "\n" + ] + } + ], + "source": [ + "df = spark.read.parquet(\"datasets/petfinder-mini\")\n", + "df.show(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "29c27243-7c74-4045-aaf1-f75a322c0530", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Type', 'Age', 'Breed1', 'Gender', 'Color1', 'Color2', 'MaturitySize', 'FurLength', 'Vaccinated', 'Sterilized', 'Health', 'Fee', 'PhotoAmt', 'target']\n" + ] + } + ], + "source": [ + "columns = df.columns\n", + "print(columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "47508b14-97fa-42ee-a7d0-6175e6408283", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Type', 'Age', 'Breed1', 'Gender', 'Color1', 'Color2', 'MaturitySize', 'FurLength', 'Vaccinated', 'Sterilized', 'Health', 'Fee', 'PhotoAmt']\n" + ] + } + ], + "source": [ + "# remove label column\n", + "columns.remove(\"target\")\n", + "print(columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "d62eb95a-54c6-44d2-9279-38fb65e0e160", + "metadata": {}, + "outputs": [], + "source": [ + "# get absolute path to model\n", + "model_dir = \"{}/my_pet_classifier\".format(os.getcwd())" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "45665acf-50c8-445b-a985-b3dabd734709", + "metadata": {}, + "outputs": [], + "source": [ + "def predict_batch_fn():\n", + " import tensorflow as tf\n", + " import pandas as pd\n", + " model = tf.keras.models.load_model(model_dir)\n", + "\n", + " def predict(t, a, b, g, c1, c2, m, f, v, s, h, fee, p):\n", + " inputs = {\n", + " \"Type\": t,\n", + " \"Age\": a,\n", + " \"Breed1\": b,\n", + " \"Gender\": g,\n", + " \"Color1\": c1,\n", + " \"Color2\": c2,\n", + " \"MaturitySize\": m,\n", + " \"FurLength\": f,\n", + " \"Vaccinated\": v,\n", + " \"Sterilized\": s,\n", + " \"Health\": h,\n", + " \"Fee\": fee,\n", + " \"PhotoAmt\": p\n", + " }\n", + " # return model.predict(inputs)\n", + " return pd.Series(np.squeeze(model.predict(inputs)))\n", + "\n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "815e3b5f-7914-4235-85fa-50153dcd3d30", + "metadata": {}, + "outputs": [], + "source": [ + "# need to pass the list of columns into the model_udf\n", + "classify = predict_batch_udf(predict_batch_fn,\n", + " return_type=FloatType(),\n", + " batch_size=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "da03a0c6-2d39-425e-a9fa-57c139cca1ed", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/05/19 17:53:03 WARN package: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.sql.debug.maxToStringFields'.\n", + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 271 ms, sys: 16.3 ms, total: 288 ms\n", + "Wall time: 7.58 s\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", classify(struct(*columns)))\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "03990c76-7198-49a7-bb5d-6870be915fb3", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 5:====================================> (5 + 3) / 8]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 71.2 ms, sys: 801 µs, total: 72 ms\n", + "Wall time: 2.41 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", classify(*columns))\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "edb93cf3-c248-40c9-b8dc-acc8f51786a9", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 6:====================================> (5 + 3) / 8]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 84.9 ms, sys: 0 ns, total: 84.9 ms\n", + "Wall time: 2.41 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", classify(*[col(c) for c in columns]))\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "a91f19cb-f7f1-4669-aff1-be594bea5378", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+----+---+-------------------+------+------+--------+------------+---------+----------+----------+-------+---+--------+------+----------+\n", + "|Type|Age| Breed1|Gender|Color1| Color2|MaturitySize|FurLength|Vaccinated|Sterilized| Health|Fee|PhotoAmt|target| preds|\n", + "+----+---+-------------------+------+------+--------+------------+---------+----------+----------+-------+---+--------+------+----------+\n", + "| Dog| 7| Spitz| Male| Brown| Golden| Medium| Medium| Not Sure| No|Healthy| 0| 2| 0| 1.2876476|\n", + "| Cat| 4|Domestic Short Hair|Female| White|No Color| Medium| Short| No| No|Healthy| 0| 2| 1| 0.8216562|\n", + "| Cat| 3|Domestic Short Hair| Male| Brown|No Color| Small| Short| No| No|Healthy| 0| 2| 1| 1.1362813|\n", + "| Cat| 11|Domestic Short Hair|Female| Brown| Yellow| Medium| Short| Yes| Yes|Healthy|100| 1| 0|-0.5538333|\n", + "| Dog| 1| Mixed Breed| Male| Black| Brown| Medium| Medium| No| No|Healthy| 0| 1| 1| 1.8639014|\n", + "| Dog| 12|German Shepherd Dog|Female| Black| Brown| Large| Medium| Not Sure| Not Sure|Healthy| 0| 4| 1| 0.646166|\n", + "| Cat| 3|Oriental Short Hair|Female| White|No Color| Medium| Short| Not Sure| Not Sure|Healthy| 0| 3| 1| 1.2250762|\n", + "| Cat| 6| Russian Blue| Male| Gray|No Color| Medium| Short| Not Sure| No|Healthy| 0| 3| 1| 1.2427491|\n", + "| Dog| 13| Miniature Pinscher|Female|Golden|No Color| Small| Short| Yes| Yes|Healthy| 0| 6| 1| 1.2280617|\n", + "| Dog| 5| Mixed Breed| Male| Black| White| Large| Medium| Yes| Yes|Healthy| 0| 6| 1| 0.3791974|\n", + "| Dog| 62| Golden Retriever|Female|Golden| Cream| Medium| Medium| Yes| Yes|Healthy| 0| 3| 1| 0.9814444|\n", + "| Cat| 2| Domestic Long Hair|Female| Cream|No Color| Medium| Medium| No| No|Healthy| 80| 5| 1| 2.7954462|\n", + "| Cat| 12|Domestic Short Hair|Female| White|No Color| Medium| Short| Yes| Yes|Healthy| 0| 1| 1|-0.2367835|\n", + "| Dog| 1| Mixed Breed|Female| Brown|No Color| Medium| Medium| No| No|Healthy| 0| 3| 1| 1.8235079|\n", + "| Dog| 5| Mixed Breed|Female| Brown|No Color| Medium| Medium| Yes| No|Healthy| 0| 1| 1|0.16853562|\n", + "| Dog| 2| Mixed Breed|Female| Black| Brown| Medium| Medium| Yes| No|Healthy| 0| 1| 0| 1.3014978|\n", + "| Cat| 4|Domestic Short Hair| Male| Black|No Color| Medium| Short| No| No|Healthy| 0| 3| 0| 1.0102129|\n", + "| Dog| 2| Mixed Breed| Male| Cream|No Color| Medium| Medium| No| No|Healthy| 0| 3| 1| 2.032087|\n", + "| Dog| 24| Pomeranian| Male|Yellow| White| Small| Medium| Not Sure| Not Sure|Healthy| 0| 9| 1| 1.7647744|\n", + "| Cat| 36|Domestic Short Hair|Female| Gray| White| Small| Short| Not Sure| Not Sure|Healthy| 0| 2| 1|0.16341272|\n", + "+----+---+-------------------+------+------+--------+------------+---------+----------+----------+-------+---+--------+------+----------+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "preds.show()" + ] + }, + { + "cell_type": "markdown", + "id": "467b02a1-9f08-4fe8-a99c-581b7a01b8f6", + "metadata": {}, + "source": [ + "### Using Triton Inference Server\n", + "\n", + "Note: you can restart the kernel and run from this point to simulate running in a different node or environment." + ] + }, + { + "cell_type": "markdown", + "id": "22d1805b-7cac-4b27-9359-7a25b4ef3f71", + "metadata": {}, + "source": [ + "This notebook uses the [Python backend with a custom execution environment](https://github.com/triton-inference-server/python_backend#creating-custom-execution-environments), using a conda-pack environment created as follows:\n", + "```\n", + "conda create -n tf-gpu -c conda-forge python=3.8\n", + "conda activate tf-gpu\n", + "pip install tensorflow\n", + "pip install conda-pack\n", + "conda pack # tf-gpu.tar.gz\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "2605d134-ef75-4d94-9b16-2c6d85f29bef", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import os\n", + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.functions import col, struct\n", + "from pyspark.sql.types import ArrayType, FloatType" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "4666e618-8038-4dc5-9be7-793aedbf4500", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "# copy custom model to expected layout for Triton\n", + "rm -rf models\n", + "mkdir -p models\n", + "cp -r models_config/feature_columns models\n", + "\n", + "# add custom execution environment\n", + "cp tf-gpu.tar.gz models" + ] + }, + { + "cell_type": "markdown", + "id": "91bd1003-46c7-42d1-ab4d-869e52d62146", + "metadata": {}, + "source": [ + "#### Start Triton Server on each executor" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "a7fb146c-5319-4831-85f7-f2f3c084b042", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "[True]" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "num_executors = 1\n", + "triton_models_dir = \"{}/models\".format(os.getcwd())\n", + "my_pet_classifier_dir = \"{}/my_pet_classifier\".format(os.getcwd())\n", + "nodeRDD = sc.parallelize(list(range(num_executors)), num_executors)\n", + "\n", + "def start_triton(it):\n", + " import docker\n", + " import time\n", + " import tritonclient.grpc as grpcclient\n", + " \n", + " client=docker.from_env()\n", + " containers=client.containers.list(filters={\"name\": \"spark-triton\"})\n", + " if containers:\n", + " print(\">>>> containers: {}\".format([c.short_id for c in containers]))\n", + " else:\n", + " container=client.containers.run(\n", + " \"nvcr.io/nvidia/tritonserver:23.04-py3\", \"tritonserver --model-repository=/models\",\n", + " detach=True,\n", + " device_requests=[docker.types.DeviceRequest(device_ids=[\"0\"], capabilities=[['gpu']])],\n", + " name=\"spark-triton\",\n", + " network_mode=\"host\",\n", + " remove=True,\n", + " shm_size=\"128M\",\n", + " volumes={\n", + " triton_models_dir: {\"bind\": \"/models\", \"mode\": \"ro\"},\n", + " my_pet_classifier_dir: {\"bind\": \"/my_pet_classifier\", \"mode\": \"ro\"}\n", + " }\n", + " )\n", + " print(\">>>> starting triton: {}\".format(container.short_id))\n", + "\n", + " # wait for triton to be running\n", + " time.sleep(15)\n", + " client = grpcclient.InferenceServerClient(\"localhost:8001\")\n", + " ready = False\n", + " while not ready:\n", + " try:\n", + " ready = client.is_server_ready()\n", + " except Exception as e:\n", + " time.sleep(5)\n", + " \n", + " return [True]\n", + "\n", + "nodeRDD.barrier().mapPartitions(start_triton).collect()" + ] + }, + { + "cell_type": "markdown", + "id": "b75e6f20-f06c-4f4c-ada1-c562e078ed4b", + "metadata": {}, + "source": [ + "#### Run inference" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "fe8dc3e6-f1b1-4a24-85f4-0a5ecabef4c5", + "metadata": {}, + "outputs": [], + "source": [ + "df = spark.read.parquet(\"datasets/petfinder-mini\")" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "ce92f041-930f-48ed-9a03-19f6c249ca27", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+----+---+-------------------+------+------+--------+------------+---------+----------+----------+-------+---+--------+------+\n", + "|Type|Age| Breed1|Gender|Color1| Color2|MaturitySize|FurLength|Vaccinated|Sterilized| Health|Fee|PhotoAmt|target|\n", + "+----+---+-------------------+------+------+--------+------------+---------+----------+----------+-------+---+--------+------+\n", + "| Dog| 7| Spitz| Male| Brown| Golden| Medium| Medium| Not Sure| No|Healthy| 0| 2| 0|\n", + "| Cat| 4|Domestic Short Hair|Female| White|No Color| Medium| Short| No| No|Healthy| 0| 2| 1|\n", + "| Cat| 3|Domestic Short Hair| Male| Brown|No Color| Small| Short| No| No|Healthy| 0| 2| 1|\n", + "| Cat| 11|Domestic Short Hair|Female| Brown| Yellow| Medium| Short| Yes| Yes|Healthy|100| 1| 0|\n", + "| Dog| 1| Mixed Breed| Male| Black| Brown| Medium| Medium| No| No|Healthy| 0| 1| 1|\n", + "+----+---+-------------------+------+------+--------+------------+---------+----------+----------+-------+---+--------+------+\n", + "only showing top 5 rows\n", + "\n" + ] + } + ], + "source": [ + "df.show(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "4cfb3f34-a215-4781-91bf-2bec85e15633", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Type', 'Age', 'Breed1', 'Gender', 'Color1', 'Color2', 'MaturitySize', 'FurLength', 'Vaccinated', 'Sterilized', 'Health', 'Fee', 'PhotoAmt', 'target']\n" + ] + } + ], + "source": [ + "columns = df.columns\n", + "print(columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "b315ee72-62af-476b-a994-0dba72d5f96e", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Type', 'Age', 'Breed1', 'Gender', 'Color1', 'Color2', 'MaturitySize', 'FurLength', 'Vaccinated', 'Sterilized', 'Health', 'Fee', 'PhotoAmt']\n" + ] + } + ], + "source": [ + "# remove label column\n", + "columns.remove(\"target\")\n", + "print(columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "da004eca-f7ad-4ee3-aa88-a6a20c1b72e5", + "metadata": {}, + "outputs": [], + "source": [ + "def triton_fn(triton_uri, model_name):\n", + " import numpy as np\n", + " import tritonclient.grpc as grpcclient\n", + " \n", + " np_types = {\n", + " \"BOOL\": np.dtype(np.bool8),\n", + " \"INT8\": np.dtype(np.int8),\n", + " \"INT16\": np.dtype(np.int16),\n", + " \"INT32\": np.dtype(np.int32),\n", + " \"INT64\": np.dtype(np.int64),\n", + " \"FP16\": np.dtype(np.float16),\n", + " \"FP32\": np.dtype(np.float32),\n", + " \"FP64\": np.dtype(np.float64),\n", + " \"FP64\": np.dtype(np.double),\n", + " \"BYTES\": np.dtype(object)\n", + " }\n", + "\n", + " client = grpcclient.InferenceServerClient(triton_uri)\n", + " model_meta = client.get_model_metadata(model_name)\n", + " \n", + " def predict(t, a, b, g, c1, c2, m, f, v, s, h, fee, p):\n", + " # convert input ndarrays into a dictionary of ndarrays\n", + " inputs = {\n", + " \"Type\": t, \n", + " \"Age\": a, \n", + " \"Breed1\": b, \n", + " \"Gender\": g,\n", + " \"Color1\": c1,\n", + " \"Color2\": c2,\n", + " \"MaturitySize\": m,\n", + " \"FurLength\": f,\n", + " \"Vaccinated\": v, \n", + " \"Sterilized\": s,\n", + " \"Health\": h,\n", + " \"Fee\": fee,\n", + " \"PhotoAmt\": p\n", + " }\n", + " return _predict(inputs)\n", + " \n", + " def _predict(inputs):\n", + " if isinstance(inputs, np.ndarray):\n", + " # single ndarray input\n", + " request = [grpcclient.InferInput(model_meta.inputs[0].name, inputs.shape, model_meta.inputs[0].datatype)]\n", + " request[0].set_data_from_numpy(inputs.astype(np_types[model_meta.inputs[0].datatype]))\n", + " else:\n", + " # dict of multiple ndarray inputs\n", + " request = [grpcclient.InferInput(i.name, inputs[i.name].shape, i.datatype) for i in model_meta.inputs]\n", + " for i in request:\n", + " i.set_data_from_numpy(inputs[i.name()].astype(np_types[i.datatype()]))\n", + " \n", + " response = client.infer(model_name, inputs=request)\n", + " \n", + " if len(model_meta.outputs) > 1:\n", + " # return dictionary of numpy arrays\n", + " return {o.name: response.as_numpy(o.name) for o in model_meta.outputs}\n", + " else:\n", + " # return single numpy array\n", + " return response.as_numpy(model_meta.outputs[0].name)\n", + " \n", + " \n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "2ffb020e-dc93-456b-bee6-405611eee1e1", + "metadata": {}, + "outputs": [], + "source": [ + "from functools import partial\n", + "\n", + "# need to pass the list of columns into the model_udf\n", + "classify = predict_batch_udf(partial(triton_fn, triton_uri=\"localhost:8001\", model_name=\"feature_columns\"),\n", + " input_tensor_shapes=[[1]] * len(columns),\n", + " return_type=FloatType(),\n", + " batch_size=1024)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "7657f820-5ec2-4ac8-a107-4b58773d204a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+----+---+----------+------+------+--------+------------+---------+----------+----------+-------+---+--------+------+----------+\n", + "|Type|Age| Breed1|Gender|Color1| Color2|MaturitySize|FurLength|Vaccinated|Sterilized| Health|Fee|PhotoAmt|target| preds|\n", + "+----+---+----------+------+------+--------+------------+---------+----------+----------+-------+---+--------+------+----------+\n", + "| Dog| 7| Spitz| Male| Brown| Golden| Medium| Medium| Not Sure| No|Healthy| 0| 2| 0| 1.2876476|\n", + "| Cat| 4|Domesti...|Female| White|No Color| Medium| Short| No| No|Healthy| 0| 2| 1| 0.8216562|\n", + "| Cat| 3|Domesti...| Male| Brown|No Color| Small| Short| No| No|Healthy| 0| 2| 1| 1.1362813|\n", + "| Cat| 11|Domesti...|Female| Brown| Yellow| Medium| Short| Yes| Yes|Healthy|100| 1| 0|-0.5538333|\n", + "| Dog| 1|Mixed B...| Male| Black| Brown| Medium| Medium| No| No|Healthy| 0| 1| 1| 1.8639014|\n", + "| Dog| 12|German ...|Female| Black| Brown| Large| Medium| Not Sure| Not Sure|Healthy| 0| 4| 1| 0.646166|\n", + "| Cat| 3|Orienta...|Female| White|No Color| Medium| Short| Not Sure| Not Sure|Healthy| 0| 3| 1| 1.2250762|\n", + "| Cat| 6|Russian...| Male| Gray|No Color| Medium| Short| Not Sure| No|Healthy| 0| 3| 1| 1.2427491|\n", + "| Dog| 13|Miniatu...|Female|Golden|No Color| Small| Short| Yes| Yes|Healthy| 0| 6| 1| 1.2280617|\n", + "| Dog| 5|Mixed B...| Male| Black| White| Large| Medium| Yes| Yes|Healthy| 0| 6| 1| 0.3791974|\n", + "| Dog| 62|Golden ...|Female|Golden| Cream| Medium| Medium| Yes| Yes|Healthy| 0| 3| 1| 0.9814444|\n", + "| Cat| 2|Domesti...|Female| Cream|No Color| Medium| Medium| No| No|Healthy| 80| 5| 1| 2.7954462|\n", + "| Cat| 12|Domesti...|Female| White|No Color| Medium| Short| Yes| Yes|Healthy| 0| 1| 1|-0.2367835|\n", + "| Dog| 1|Mixed B...|Female| Brown|No Color| Medium| Medium| No| No|Healthy| 0| 3| 1| 1.8235079|\n", + "| Dog| 5|Mixed B...|Female| Brown|No Color| Medium| Medium| Yes| No|Healthy| 0| 1| 1|0.16853562|\n", + "| Dog| 2|Mixed B...|Female| Black| Brown| Medium| Medium| Yes| No|Healthy| 0| 1| 0| 1.3014978|\n", + "| Cat| 4|Domesti...| Male| Black|No Color| Medium| Short| No| No|Healthy| 0| 3| 0| 1.0102129|\n", + "| Dog| 2|Mixed B...| Male| Cream|No Color| Medium| Medium| No| No|Healthy| 0| 3| 1| 2.032087|\n", + "| Dog| 24|Pomeranian| Male|Yellow| White| Small| Medium| Not Sure| Not Sure|Healthy| 0| 9| 1| 1.7647744|\n", + "| Cat| 36|Domesti...|Female| Gray| White| Small| Short| Not Sure| Not Sure|Healthy| 0| 2| 1|0.16341272|\n", + "+----+---+----------+------+------+--------+------------+---------+----------+----------+-------+---+--------+------+----------+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "# FAILS: Op type not registered 'DenseBincount' WITHOUT custom python backend\n", + "df.withColumn(\"preds\", classify(struct(*columns))).show(truncate=10)" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "e6ff0356-becd-421f-aebb-272497d5ad6a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 62.9 ms, sys: 15.5 ms, total: 78.4 ms\n", + "Wall time: 2.62 s\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", classify(struct(*columns)))\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "ce18ee7c-5958-4986-b200-6d986fcc6243", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 13:==================================================> (7 + 1) / 8]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 70 ms, sys: 6.89 ms, total: 76.9 ms\n", + "Wall time: 2.51 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", classify(*columns))\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "0888ce40-b2c4-4aed-8ccb-6a8bcd00abc8", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 14:===========================================> (6 + 2) / 8]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 85.5 ms, sys: 6.85 ms, total: 92.4 ms\n", + "Wall time: 2.3 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", classify(*[col(c) for c in columns]))\n", + "results = preds.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "d45812b5-f584-41a4-a821-2b59e065671c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+----+---+-------------------+------+------+--------+------------+---------+----------+----------+-------+---+--------+------+----------+\n", + "|Type|Age| Breed1|Gender|Color1| Color2|MaturitySize|FurLength|Vaccinated|Sterilized| Health|Fee|PhotoAmt|target| preds|\n", + "+----+---+-------------------+------+------+--------+------------+---------+----------+----------+-------+---+--------+------+----------+\n", + "| Dog| 7| Spitz| Male| Brown| Golden| Medium| Medium| Not Sure| No|Healthy| 0| 2| 0| 1.2876476|\n", + "| Cat| 4|Domestic Short Hair|Female| White|No Color| Medium| Short| No| No|Healthy| 0| 2| 1| 0.8216562|\n", + "| Cat| 3|Domestic Short Hair| Male| Brown|No Color| Small| Short| No| No|Healthy| 0| 2| 1| 1.1362813|\n", + "| Cat| 11|Domestic Short Hair|Female| Brown| Yellow| Medium| Short| Yes| Yes|Healthy|100| 1| 0|-0.5538333|\n", + "| Dog| 1| Mixed Breed| Male| Black| Brown| Medium| Medium| No| No|Healthy| 0| 1| 1| 1.8639014|\n", + "| Dog| 12|German Shepherd Dog|Female| Black| Brown| Large| Medium| Not Sure| Not Sure|Healthy| 0| 4| 1| 0.646166|\n", + "| Cat| 3|Oriental Short Hair|Female| White|No Color| Medium| Short| Not Sure| Not Sure|Healthy| 0| 3| 1| 1.2250762|\n", + "| Cat| 6| Russian Blue| Male| Gray|No Color| Medium| Short| Not Sure| No|Healthy| 0| 3| 1| 1.2427491|\n", + "| Dog| 13| Miniature Pinscher|Female|Golden|No Color| Small| Short| Yes| Yes|Healthy| 0| 6| 1| 1.2280617|\n", + "| Dog| 5| Mixed Breed| Male| Black| White| Large| Medium| Yes| Yes|Healthy| 0| 6| 1| 0.3791974|\n", + "| Dog| 62| Golden Retriever|Female|Golden| Cream| Medium| Medium| Yes| Yes|Healthy| 0| 3| 1| 0.9814444|\n", + "| Cat| 2| Domestic Long Hair|Female| Cream|No Color| Medium| Medium| No| No|Healthy| 80| 5| 1| 2.7954462|\n", + "| Cat| 12|Domestic Short Hair|Female| White|No Color| Medium| Short| Yes| Yes|Healthy| 0| 1| 1|-0.2367835|\n", + "| Dog| 1| Mixed Breed|Female| Brown|No Color| Medium| Medium| No| No|Healthy| 0| 3| 1| 1.8235079|\n", + "| Dog| 5| Mixed Breed|Female| Brown|No Color| Medium| Medium| Yes| No|Healthy| 0| 1| 1|0.16853562|\n", + "| Dog| 2| Mixed Breed|Female| Black| Brown| Medium| Medium| Yes| No|Healthy| 0| 1| 0| 1.3014978|\n", + "| Cat| 4|Domestic Short Hair| Male| Black|No Color| Medium| Short| No| No|Healthy| 0| 3| 0| 1.0102129|\n", + "| Dog| 2| Mixed Breed| Male| Cream|No Color| Medium| Medium| No| No|Healthy| 0| 3| 1| 2.032087|\n", + "| Dog| 24| Pomeranian| Male|Yellow| White| Small| Medium| Not Sure| Not Sure|Healthy| 0| 9| 1| 1.7647744|\n", + "| Cat| 36|Domestic Short Hair|Female| Gray| White| Small| Short| Not Sure| Not Sure|Healthy| 0| 2| 1|0.16341272|\n", + "+----+---+-------------------+------+------+--------+------------+---------+----------+----------+-------+---+--------+------+----------+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "preds.show()" + ] + }, + { + "cell_type": "markdown", + "id": "63135aa0-b44c-4dda-8050-8cad320afe88", + "metadata": { + "tags": [] + }, + "source": [ + "#### Stop Triton Server on each executor" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "6914f44f-677f-4db3-be09-783df8d11b8a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "[True]" + ] + }, + "execution_count": 58, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def stop_triton(it):\n", + " import docker\n", + " import time\n", + " \n", + " client=docker.from_env()\n", + " containers=client.containers.list(filters={\"name\": \"spark-triton\"})\n", + " print(\">>>> stopping containers: {}\".format([c.short_id for c in containers]))\n", + " if containers:\n", + " container=containers[0]\n", + " container.stop(timeout=120)\n", + "\n", + " return [True]\n", + "\n", + "nodeRDD.barrier().mapPartitions(stop_triton).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "f8c6ee43-8891-4446-986e-1447c5d48bac", + "metadata": {}, + "outputs": [], + "source": [ + "spark.stop()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e611126e-d8c3-40ac-bf16-b911f6d7b39f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/image_classification.ipynb b/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/image_classification.ipynb new file mode 100644 index 000000000..25e809387 --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/image_classification.ipynb @@ -0,0 +1,2400 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "52d55e3f", + "metadata": {}, + "source": [ + "# Pyspark TensorFlow Inference\n", + "\n", + "## Image classification\n", + "Based on: https://www.tensorflow.org/tutorials/keras/save_and_load" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "c8b28f02", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.12.0\n" + ] + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import subprocess\n", + "import tensorflow as tf\n", + "\n", + "from tensorflow import keras\n", + "\n", + "print(tf.version.VERSION)" + ] + }, + { + "cell_type": "markdown", + "id": "7e0c7ad6", + "metadata": {}, + "source": [ + "### Load and preprocess dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5b007f7c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((60000, 28, 28), (10000, 28, 28))" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# load dataset as numpy arrays\n", + "(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()\n", + "train_images.shape, test_images.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "7b7cedd1", + "metadata": {}, + "outputs": [], + "source": [ + "# flatten and normalize\n", + "train_images = train_images.reshape(-1, 784) / 255.0\n", + "test_images = test_images.reshape(-1, 784) / 255.0" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "e77bfbd7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((60000, 784), (10000, 784))" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train_images.shape, test_images.shape" + ] + }, + { + "cell_type": "markdown", + "id": "867a4403", + "metadata": {}, + "source": [ + "### Define a model" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "746d94db", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " dense (Dense) (None, 512) 401920 \n", + " \n", + " dropout (Dropout) (None, 512) 0 \n", + " \n", + " dense_1 (Dense) (None, 10) 5130 \n", + " \n", + "=================================================================\n", + "Total params: 407,050\n", + "Trainable params: 407,050\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "# Define a simple sequential model\n", + "def create_model():\n", + " model = tf.keras.models.Sequential([\n", + " keras.layers.Dense(512, activation='relu', input_shape=(784,)),\n", + " keras.layers.Dropout(0.2),\n", + " keras.layers.Dense(10)\n", + " ])\n", + "\n", + " model.compile(optimizer='adam',\n", + " loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),\n", + " metrics=[tf.metrics.SparseCategoricalAccuracy()])\n", + "\n", + " return model\n", + "\n", + "# Create a basic model instance\n", + "model = create_model()\n", + "\n", + "# Display the model's architecture\n", + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "id": "605d082a", + "metadata": {}, + "source": [ + "### Train model" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "244746be", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/5\n", + "1875/1875 [==============================] - 10s 5ms/step - loss: 0.2183 - sparse_categorical_accuracy: 0.9349 - val_loss: 0.1183 - val_sparse_categorical_accuracy: 0.9624\n", + "Epoch 2/5\n", + "1875/1875 [==============================] - 10s 5ms/step - loss: 0.0978 - sparse_categorical_accuracy: 0.9698 - val_loss: 0.0826 - val_sparse_categorical_accuracy: 0.9744\n", + "Epoch 3/5\n", + "1875/1875 [==============================] - 10s 5ms/step - loss: 0.0686 - sparse_categorical_accuracy: 0.9785 - val_loss: 0.0761 - val_sparse_categorical_accuracy: 0.9762\n", + "Epoch 4/5\n", + "1875/1875 [==============================] - 10s 5ms/step - loss: 0.0522 - sparse_categorical_accuracy: 0.9831 - val_loss: 0.0670 - val_sparse_categorical_accuracy: 0.9809\n", + "Epoch 5/5\n", + "1875/1875 [==============================] - 10s 5ms/step - loss: 0.0424 - sparse_categorical_accuracy: 0.9861 - val_loss: 0.0676 - val_sparse_categorical_accuracy: 0.9796\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.fit(train_images, \n", + " train_labels, \n", + " epochs=5,\n", + " validation_data=(test_images, test_labels))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "6d3bba9e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/1 [==============================] - 0s 55ms/step\n" + ] + }, + { + "data": { + "text/plain": [ + "array([[ -9.547884 , -4.7447677, -0.956994 , 1.0100659, -15.265252 ,\n", + " -7.811299 , -15.518889 , 14.113535 , -4.9397273, -4.3322315]],\n", + " dtype=float32)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test_img = test_images[:1]\n", + "prediction = model.predict(test_img)\n", + "prediction" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "e700b66a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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IACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACuCHkCvvfaaXC5XwNSrV69gbwYA0MxFhGKlvXv31qZNm/69kYiQbAYA0IyFJBkiIiKUlJQUilUDAFqIkFwDOnDggFJSUtStWzc9+eSTOnToUINja2tr5fV6AyYAQMsX9ABKT0/XsmXLtGHDBi1evFhlZWUaOnSoTp48We/4goICeTwe/5SamhrslgAATZDLGGNCuYGqqip16dJFCxYs0NNPP11neW1trWpra/2vvV6vUlNTlaHRinBFhrI1AEAIXDDnVai1qq6uVkxMTIPjQn53QPv27dWjRw8dPHiw3uVut1tutzvUbQAAmpiQfw7o1KlTKi0tVXJycqg3BQBoRoIeQC+88IKKior0zTff6B//+IceffRRhYeH6/HHHw/2pgAAzVjQ34I7cuSIHn/8cZ04cULx8fEaMmSItm/frvj4+GBvCgDQjAU9gFauXBnsVQIAWiCeBQcAsIIAAgBYQQABAKwggAAAVhBAAAArCCAAgBUEEADACgIIAGAFAQQAsIIAAgBYQQABAKwggAAAVoT8C+lwc52YPMhxTeef1v9lgdey/1ii45pztc6/5fa2953XtDlyynGNJPn2/KtRdQCc4wwIAGAFAQQAsIIAAgBYQQABAKwggAAAVhBAAAArCCAAgBUEEADACgIIAGAFAQQAsIIAAgBYQQABAKwggAAAVvA07BbmxZ+vcFwzru33jdtY98aVOZbhvOSbC6cbtak3jz/QqDrcPP881sVxTdvfehq1rYjNuxpVh+vDGRAAwAoCCABgBQEEALCCAAIAWEEAAQCsIIAAAFYQQAAAKwggAIAVBBAAwAoCCABgBQEEALCCAAIAWMHDSFuYt14e77hmdr/G/R7S4WvjuOb7O12Oa6L6VTmumd/nI8c1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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure()\n", + "plt.title(\"Prediction: {}\".format(np.argmax(prediction)))\n", + "plt.imshow(test_img.reshape(28,28))\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "135b42b0", + "metadata": {}, + "source": [ + "### Save Model" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "33f11a35", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "subprocess.call(\"rm -rf mnist_model\".split())" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "86f9376d", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:absl:Found untraced functions such as _update_step_xla while saving (showing 1 of 1). These functions will not be directly callable after loading.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: mnist_model/assets\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: mnist_model/assets\n" + ] + } + ], + "source": [ + "model.save('mnist_model')" + ] + }, + { + "cell_type": "markdown", + "id": "43a417c6", + "metadata": {}, + "source": [ + "### Inspect saved model" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "53a8ba4a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[01;34mmnist_model\u001b[00m\n", + "├── \u001b[01;34massets\u001b[00m\n", + "├── fingerprint.pb\n", + "├── keras_metadata.pb\n", + "├── saved_model.pb\n", + "└── \u001b[01;34mvariables\u001b[00m\n", + " ├── variables.data-00000-of-00001\n", + " └── variables.index\n", + "\n", + "2 directories, 5 files\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "subprocess.call(\"tree mnist_model\".split())" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "677e377a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The given SavedModel SignatureDef contains the following input(s):\n", + " inputs['dense_input'] tensor_info:\n", + " dtype: DT_FLOAT\n", + " shape: (-1, 784)\n", + " name: serving_default_dense_input:0\n", + "The given SavedModel SignatureDef contains the following output(s):\n", + " outputs['dense_1'] tensor_info:\n", + " dtype: DT_FLOAT\n", + " shape: (-1, 10)\n", + " name: StatefulPartitionedCall:0\n", + "Method name is: tensorflow/serving/predict\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "subprocess.call(\"saved_model_cli show --dir mnist_model --tag_set serve --signature_def serving_default\".split())" + ] + }, + { + "cell_type": "markdown", + "id": "6f013a4b", + "metadata": {}, + "source": [ + "### Load model" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "c41008f2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " dense (Dense) (None, 512) 401920 \n", + " \n", + " dropout (Dropout) (None, 512) 0 \n", + " \n", + " dense_1 (Dense) (None, 10) 5130 \n", + " \n", + "=================================================================\n", + "Total params: 407,050\n", + "Trainable params: 407,050\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "new_model = tf.keras.models.load_model('mnist_model')\n", + "new_model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "256662e8-30f1-437f-88b7-4534a7e76907", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "new_model.inputs" + ] + }, + { + "cell_type": "markdown", + "id": "351c7b84", + "metadata": {}, + "source": [ + "### Predict" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "5dbeeb98", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/1 [==============================] - 0s 30ms/step\n" + ] + }, + { + "data": { + "text/plain": [ + "array([[ -9.547884 , -4.7447677, -0.956994 , 1.0100659, -15.265252 ,\n", + " -7.811299 , -15.518889 , 14.113535 , -4.9397273, -4.3322315]],\n", + " dtype=float32)" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "new_model.predict(test_images[:1])" + ] + }, + { + "cell_type": "markdown", + "id": "a86f4700", + "metadata": {}, + "source": [ + "## PySpark" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "7fcf07bb", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "id": "c81d0b1b", + "metadata": {}, + "source": [ + "### Convert numpy array to Spark DataFrame (via Pandas DataFrame)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "49ff5203", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(10000, 784)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# numpy array to pandas DataFrame\n", + "test_pdf = pd.DataFrame(test_images)\n", + "test_pdf.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "182ee0c7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 1min, sys: 0 ns, total: 1min\n", + "Wall time: 1min 2s\n" + ] + } + ], + "source": [ + "%%time\n", + "df = spark.createDataFrame(test_pdf)" + ] + }, + { + "cell_type": "markdown", + "id": "d4e1c7ec-64fa-43c4-9bcf-0868a401d1f2", + "metadata": {}, + "source": [ + "### Save as Parquet (784 columns of float)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "0061c39a-0871-429e-a4ff-751d26bf4b04", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/05/19 17:46:15 WARN package: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.sql.debug.maxToStringFields'.\n", + "23/05/19 17:46:15 WARN TaskSetManager: Stage 0 contains a task of very large size (7067 KiB). The maximum recommended task size is 1000 KiB.\n", + "[Stage 0:> (0 + 8) / 8]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 12.1 ms, sys: 0 ns, total: 12.1 ms\n", + "Wall time: 5.72 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "df.write.mode(\"overwrite\").parquet(\"mnist_784\")" + ] + }, + { + "cell_type": "markdown", + "id": "18315afb-3fa2-4953-9297-52c04dd70c32", + "metadata": {}, + "source": [ + "### Save as Parquet (1 column of 784 float)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "302c73ec", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 261 ms, sys: 0 ns, total: 261 ms\n", + "Wall time: 258 ms\n" + ] + }, + { + "data": { + "text/plain": [ + "(10000, 1)" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "test_pdf['data'] = test_pdf.values.tolist()\n", + "pdf = test_pdf[['data']]\n", + "pdf.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "5495901b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 12.5 s, sys: 0 ns, total: 12.5 s\n", + "Wall time: 12.6 s\n" + ] + } + ], + "source": [ + "%%time\n", + "df = spark.createDataFrame(pdf)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "5fa7faa8-c6bd-41b0-b5f7-fb121f0332e6", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/05/19 17:46:33 WARN TaskSetManager: Stage 1 contains a task of very large size (7070 KiB). The maximum recommended task size is 1000 KiB.\n", + "[Stage 1:> (0 + 8) / 8]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 9.88 ms, sys: 0 ns, total: 9.88 ms\n", + "Wall time: 1.36 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "df.write.mode(\"overwrite\").parquet(\"mnist_1\")" + ] + }, + { + "cell_type": "markdown", + "id": "c87b444e", + "metadata": {}, + "source": [ + "### Check arrow memory configuration" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "3d4ca414", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/05/19 17:46:34 WARN TaskSetManager: Stage 2 contains a task of very large size (7070 KiB). The maximum recommended task size is 1000 KiB.\n" + ] + } + ], + "source": [ + "spark.conf.set(\"spark.sql.execution.arrow.maxRecordsPerBatch\", \"128\")\n", + "# This line will fail if the vectorized reader runs out of memory\n", + "assert len(df.head()) > 0, \"`df` should not be empty\" " + ] + }, + { + "cell_type": "markdown", + "id": "9b6dde30-98a9-45db-ab3a-d4546f9bed99", + "metadata": {}, + "source": [ + "## Inference using Spark DL API" + ] + }, + { + "cell_type": "markdown", + "id": "4238fb28-d002-4b4d-9aa1-8af1fbd5d569", + "metadata": {}, + "source": [ + "### 1 column of 784 float" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "db30fba6-24d0-4c00-8502-04f9b10e7e16", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import os\n", + "import pandas as pd\n", + "\n", + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.functions import array, col, struct\n", + "from pyspark.sql.types import ArrayType, FloatType, Union, Dict" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "b9cf62f8-96b2-4716-80bd-bb93d5f939bd", + "metadata": {}, + "outputs": [], + "source": [ + "# get absolute path to model\n", + "model_dir = \"{}/mnist_model\".format(os.getcwd())" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "b81fa297-d9d0-4600-880d-dbdcdf8bccc6", + "metadata": {}, + "outputs": [], + "source": [ + "def predict_batch_fn():\n", + " import tensorflow as tf\n", + " model = tf.keras.models.load_model(model_dir)\n", + " def predict(inputs: np.ndarray) -> np.ndarray:\n", + " return model.predict(inputs)\n", + " \n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "72a689bd-dd82-492e-8740-1738a215325f", + "metadata": {}, + "outputs": [], + "source": [ + "mnist = predict_batch_udf(predict_batch_fn,\n", + " return_type=ArrayType(FloatType()),\n", + " batch_size=1024,\n", + " input_tensor_shapes=[[784]])" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "60a70150-26b1-4145-9e7d-6e17389216b7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = spark.read.parquet(\"mnist_1\")\n", + "len(df.columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "e027f0d2-0f65-47b7-a562-2f0965faceec", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+\n", + "| data|\n", + "+--------------------+\n", + "|[0.0, 0.0, 0.0, 0...|\n", + "|[0.0, 0.0, 0.0, 0...|\n", + "|[0.0, 0.0, 0.0, 0...|\n", + "|[0.0, 0.0, 0.0, 0...|\n", + "|[0.0, 0.0, 0.0, 0...|\n", + "+--------------------+\n", + "only showing top 5 rows\n", + "\n" + ] + } + ], + "source": [ + "df.show(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "f0c3fb2e-469e-47bc-b948-8f6b0d7f6513", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 827 ms, sys: 0 ns, total: 827 ms\n", + "Wall time: 6.2 s\n" + ] + } + ], + "source": [ + "%%time\n", + "# first pass caches model/fn\n", + "preds = df.withColumn(\"preds\", mnist(struct(df.columns))).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "cdfa229a-f4a9-4c11-a410-de4a21c02c82", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 628 ms, sys: 0 ns, total: 628 ms\n", + "Wall time: 2.18 s\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", mnist(*df.columns)).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "5586ce49-6f93-4343-9b66-0dbb64972179", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 612 ms, sys: 0 ns, total: 612 ms\n", + "Wall time: 2.05 s\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", mnist(*[col(c) for c in df.columns])).collect()" + ] + }, + { + "cell_type": "markdown", + "id": "004f1599-3c62-499e-9fd8-ed5cb0c90de4", + "metadata": { + "tags": [] + }, + "source": [ + "#### Check predictions" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "4f947dc0-6b18-4605-810b-e83250a161db", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
datapreds
0[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...[-9.66701889038086, -3.6094393730163574, -3.31...
1[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...[-16.348304748535156, 3.1133787631988525, 6.73...
2[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...[-21.153539657592773, -6.192655086517334, -6.6...
3[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...[-13.79001522064209, -16.20423126220703, -8.87...
4[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...[-18.723485946655273, -7.806203365325928, -8.6...
5[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...[10.495272636413574, -10.992117881774902, -2.4...
6[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...[-9.437854766845703, -3.7454347610473633, -3.5...
7[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...[-12.314886093139648, -2.106672763824463, -0.7...
8[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...[-22.142608642578125, -2.8917746543884277, -4....
9[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...[-12.939343452453613, 0.40699127316474915, 15....
\n", + "
" + ], + "text/plain": [ + " data \n", + "0 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... \\\n", + "1 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... \n", + "2 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... \n", + "3 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... \n", + "4 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... \n", + "5 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... \n", + "6 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... \n", + "7 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... \n", + "8 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... \n", + "9 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... \n", + "\n", + " preds \n", + "0 [-9.66701889038086, -3.6094393730163574, -3.31... \n", + "1 [-16.348304748535156, 3.1133787631988525, 6.73... \n", + "2 [-21.153539657592773, -6.192655086517334, -6.6... \n", + "3 [-13.79001522064209, -16.20423126220703, -8.87... \n", + "4 [-18.723485946655273, -7.806203365325928, -8.6... \n", + "5 [10.495272636413574, -10.992117881774902, -2.4... \n", + "6 [-9.437854766845703, -3.7454347610473633, -3.5... \n", + "7 [-12.314886093139648, -2.106672763824463, -0.7... \n", + "8 [-22.142608642578125, -2.8917746543884277, -4.... \n", + "9 [-12.939343452453613, 0.40699127316474915, 15.... " + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "preds = df.withColumn(\"preds\", mnist(*df.columns)).limit(10).toPandas()\n", + "preds" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "de4964e0-d1f8-4753-afa1-a8f95ca3f151", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[-9.66701889038086,\n", + " -3.6094393730163574,\n", + " -3.3102951049804688,\n", + " -0.32629871368408203,\n", + " -8.564104080200195,\n", + " -3.614396095275879,\n", + " -5.390956878662109,\n", + " -3.0429909229278564,\n", + " 9.717466354370117,\n", + " -5.417511463165283]" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sample = preds.iloc[0]\n", + "sample.preds" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "44e9a874-e301-4b72-8df7-bf1c5133c287", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "c60e5af4-fc1e-4575-a717-f304664235be", + "metadata": {}, + "outputs": [], + "source": [ + "prediction = np.argmax(sample.preds)\n", + "img = np.array(sample.data).reshape(28,28)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "eb45ecc9-d376-40c4-ad7b-2bd08ca5aaf6", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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po2Ki4uv2PbFF18oLCxMqamp3+m9gnHpC741NTVXbDt//rwuXLjQYPtGy8c9IFw3/umf/kk1NTV66aWXrth24cIFnTx5UtLFe0yRkZFavHhxwFXDokWLrrmP2267TWlpaVq0aJH//S759ntd+k7S5WMuFx4erhEjRmjt2rX68ssv/esrKiq0YsUKDR48WDExMdfs63Lf9THsm266SWFhYVq1alVA/4cPH9ZHH32kH/7wh473DVzCFRCuG3fccYemT5+uvLw87d27VyNGjFBkZKQOHDig1atX61e/+pX+8R//UfHx8XryySeVl5ene+65R6NGjdKePXv05z//WXFxcVfdR1hYmJYsWaLRo0fr1ltv1ZQpU5ScnKwvvvhCn332mT744ANJUr9+/SRJjz/+uLKyshQeHq6JEyfW+Z4LFizQhg0bNHjwYD322GOKiIjQa6+9purqai1cuDCoY/FdH8OOj4/Xww8/rN/+9rcaPny4xo8fr1OnTunVV1/V2bNnlZubG9T+AYkAwnVm6dKl6tevn1577TU988wzioiI0I033qiHHnpIgwYN8o9bsGCBWrVqpaVLl2rLli3KyMjQhx9+qLvvvvua+8jKytKWLVs0f/58/fKXv1Rtba26deumqVOn+seMHz9es2bN0sqVK/X73/9exph6A6h379766KOPlJubq7y8PNXW1iojI0O///3vr/gOUENYsmSJ0tPT9frrr/sDp3///nrrrbc0dOjQBt8/Wi6XCebOJAAA3xP3gAAAVhBAAAArCCAAgBUEEADACgIIAGAFAQQAsKLJfQ+otrZWR44cUXR0dFCzBwMA7DLG6NSpU0pJSbliTsZva3IBdOTIkQad2woA0DjKysqumJX+25pcAEVHR0uSBmuUIhRpuRsAgFMXdF7btM7/73l9GiyA8vPz9fLLL6u8vFzp6elavHixBgwYcM26Sx+7RShSES4CCACanf8/v861bqM0yEMIq1at0ty5czVv3jx9+umnSk9PV1ZWlv8HfgEA0CAB9Morr2jq1KmaMmWKfvCDH2jp0qVq06aN3njjjYbYHQCgGQp5AJ07d067d+8O+GFcYWFhyszM1Pbt268YX11dLZ/PF7AAAFq+kAfQ119/rZqaGiUmJgasT0xMVHl5+RXj8/Ly5PF4/AtPwAHA9cH6F1Fzc3Pl9Xr9S1lZme2WAACNIORPwcXFxSk8PNz/s+QvqaioUFJS0hXj3W633G53qNsAADRxIb8CioqKUr9+/bRp0yb/utraWm3atEkDBw4M9e4AAM1Ug3wPaO7cuZo0aZJ+9KMfacCAAVq0aJEqKys1ZcqUhtgdAKAZapAAuu+++3T8+HE9//zzKi8v16233qr169df8WACAOD65TLGGNtNfJvP55PH49EwjWEmBABohi6Y8yrUWnm9XsXExNQ7zvpTcACA6xMBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArIiw3QBwLeExMY5r/vZc76D29XDWZsc1z8QVO66pMbWOa768cMZxzagdjzmukaQui1yOa1zb/yuofeH6xRUQAMAKAggAYEXIA+iFF16Qy+UKWHr16hXq3QAAmrkGuQfUu3dvbdy48e87ieBWEwAgUIMkQ0REhJKSkhrirQEALUSD3AM6cOCAUlJS1LVrVz344IM6dOhQvWOrq6vl8/kCFgBAyxfyAMrIyFBBQYHWr1+vJUuWqLS0VEOGDNGpU6fqHJ+XlyePx+NfUlNTQ90SAKAJCnkAZWdn695771Xfvn2VlZWldevW6eTJk3rnnXfqHJ+bmyuv1+tfysrKQt0SAKAJavCnA9q3b68ePXro4MGDdW53u91yu90N3QYAoIlp8O8BnT59WiUlJUpOTm7oXQEAmpGQB9CTTz6poqIiffnll/rkk080btw4hYeH6/777w/1rgAAzVjIP4I7fPiw7r//fp04cULx8fEaPHiwduzYofj4+FDvCgDQjLmMMcZ2E9/m8/nk8Xg0TGMU4Yq03Q5CzAy61XHNi7973XFNf7fzyTTxd3+o7OC4piDjNsc1Nd9847gGTd8Fc16FWiuv16uYq0wmzFxwAAArCCAAgBUEEADACgII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mjlzptasWaPNmzcrLS0tYHu/fv0UGRkZcD4UFxfr0KFDLep8uNZxqMvevXslqWmdD7afgvguVq5cadxutykoKDB//etfzbRp00z79u1NeXm57dYa1U9+8hNTWFhoSktLzccff2wyMzNNXFycOXbsmO3WGtSpU6fMnj17zJ49e4wk88orr5g9e/aYr776yhhjzM9//nPTvn17s3btWrNv3z4zZswYk5aWZs6ePWu589C62nE4deqUefLJJ8327dtNaWmp2bhxo7nttttM9+7dTVVVle3WQ2bGjBnG4/GYwsJCc/ToUf9y5swZ/5hHH33UdO7c2WzevNns2rXLDBw40AwcONBi16F3reNw8OBB8+KLL5pdu3aZ0tJSs3btWtO1a1czdOhQy50HahYBZIwxixcvNp07dzZRUVFmwIABZseOHbZbanT33XefSU5ONlFRUeaGG24w9913nzl48KDtthrcli1bjKQrlkmTJhljLj6K/dxzz5nExETjdrvN8OHDTXFxsd2mG8DVjsOZM2fMiBEjTHx8vImMjDRdunQxU6dObXH/Savr9y/JLFu2zD/m7Nmz5rHHHjMdOnQwbdq0MePGjTNHjx6113QDuNZxOHTokBk6dKiJjY01brfb3HTTTeanP/2p8Xq9dhu/DD8PCABgRZO/BwQAaJkIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMCK/wcgFXDPfhuVLAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure()\n", + "plt.title(\"Prediction: {}\".format(prediction))\n", + "plt.imshow(img)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "39167347-0b99-4972-998c-e1230bf1d4d5", + "metadata": {}, + "source": [ + "### 784 columns of float" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "f1285e8b-1b96-437b-973a-eb868e33afb7", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.functions import array, col, struct\n", + "from pyspark.sql.types import ArrayType, FloatType, Union, Dict" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "6bea332e-f6de-494f-a0db-795d9fe3e134", + "metadata": {}, + "outputs": [], + "source": [ + "def predict_batch_fn():\n", + " import tensorflow as tf\n", + " model = tf.keras.models.load_model(model_dir)\n", + " def predict(inputs: np.ndarray) -> np.ndarray:\n", + " return model.predict(inputs)\n", + " \n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "731d234c-549f-4df3-8a2b-312e63195396", + "metadata": {}, + "outputs": [], + "source": [ + "mnist = predict_batch_udf(predict_batch_fn,\n", + " return_type=ArrayType(FloatType()),\n", + " batch_size=1024,\n", + " input_tensor_shapes=[[784]])" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "a40fe207-6246-4b0e-abde-823979878d97", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "784" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = spark.read.parquet(\"mnist_784\")\n", + "len(df.columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "10904f12-03e7-4518-8f12-2aa11989ddf5", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 971 ms, sys: 83 ms, total: 1.05 s\n", + "Wall time: 8.63 s\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", mnist(struct(*df.columns))).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "671128df-f0f4-4f54-b35c-d63a78c7f89a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 823 ms, sys: 136 ms, total: 959 ms\n", + "Wall time: 3.45 s\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", mnist(array(*df.columns))).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "ce35deaf-7d49-4f34-9bf9-b4e6fc5761f4", + "metadata": {}, + "outputs": [], + "source": [ + "# should raise ValueError\n", + "# preds = df.withColumn(\"preds\", mnist(*df.columns)).collect()" + ] + }, + { + "cell_type": "markdown", + "id": "01709833-484b-451f-9aa8-37be5b7baf14", + "metadata": {}, + "source": [ + "### Check prediction" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "f9119632-b284-45d7-a262-c262e034c15c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0123456789...775776777778779780781782783preds
00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.0[-9.66701889038086, -3.6094393730163574, -3.31...
10.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.0[-16.348304748535156, 3.1133787631988525, 6.73...
20.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.0[-21.153539657592773, -6.192655086517334, -6.6...
30.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.0[-13.79001522064209, -16.20423126220703, -8.87...
40.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.0[-18.723485946655273, -7.806203365325928, -8.6...
50.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.0[10.495272636413574, -10.992117881774902, -2.4...
60.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.0[-9.437854766845703, -3.7454347610473633, -3.5...
70.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.0[-12.314886093139648, -2.106672763824463, -0.7...
80.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.0[-22.142608642578125, -2.8917746543884277, -4....
90.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.0[-12.939343452453613, 0.40699127316474915, 15....
\n", + "

10 rows × 785 columns

\n", + "
" + ], + "text/plain": [ + " 0 1 2 3 4 5 6 7 8 9 ... 775 776 777 778 \n", + "0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 \\\n", + "1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 \n", + "2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 \n", + "3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 \n", + "4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 \n", + "5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 \n", + "6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 \n", + "7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 \n", + "8 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 \n", + "9 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 \n", + "\n", + " 779 780 781 782 783 preds \n", + "0 0.0 0.0 0.0 0.0 0.0 [-9.66701889038086, -3.6094393730163574, -3.31... \n", + "1 0.0 0.0 0.0 0.0 0.0 [-16.348304748535156, 3.1133787631988525, 6.73... \n", + "2 0.0 0.0 0.0 0.0 0.0 [-21.153539657592773, -6.192655086517334, -6.6... \n", + "3 0.0 0.0 0.0 0.0 0.0 [-13.79001522064209, -16.20423126220703, -8.87... \n", + "4 0.0 0.0 0.0 0.0 0.0 [-18.723485946655273, -7.806203365325928, -8.6... \n", + "5 0.0 0.0 0.0 0.0 0.0 [10.495272636413574, -10.992117881774902, -2.4... \n", + "6 0.0 0.0 0.0 0.0 0.0 [-9.437854766845703, -3.7454347610473633, -3.5... \n", + "7 0.0 0.0 0.0 0.0 0.0 [-12.314886093139648, -2.106672763824463, -0.7... \n", + "8 0.0 0.0 0.0 0.0 0.0 [-22.142608642578125, -2.8917746543884277, -4.... \n", + "9 0.0 0.0 0.0 0.0 0.0 [-12.939343452453613, 0.40699127316474915, 15.... \n", + "\n", + "[10 rows x 785 columns]" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "preds = df.withColumn(\"preds\", mnist(struct(df.columns))).limit(10).toPandas()\n", + "preds" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "7c067c62-03a6-461e-a1ff-4653276fbea1", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "a7084ad0-c021-4296-bad0-7a238971f53b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[-9.66701889038086,\n", + " -3.6094393730163574,\n", + " -3.3102951049804688,\n", + " -0.32629871368408203,\n", + " -8.564104080200195,\n", + " -3.614396095275879,\n", + " -5.390956878662109,\n", + " -3.0429909229278564,\n", + " 9.717466354370117,\n", + " -5.417511463165283]" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sample = preds.iloc[0]\n", + "sample.preds" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "8167c832-93ef-4f50-873b-07b67c19ef53", + "metadata": {}, + "outputs": [], + "source": [ + "prediction = np.argmax(sample.preds)\n", + "img = sample.drop('preds').to_numpy(dtype=float)\n", + "img = np.array(img).reshape(28,28)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "297811e1-aecb-4afd-9a6a-30c49e8881cc", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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po2Ki4uv2PbFF18oLCxMqamp3+m9gnHpC741NTVXbDt//rwuXLjQYPtGy8c9IFw3/umf/kk1NTV66aWXrth24cIFnTx5UtLFe0yRkZFavHhxwFXDokWLrrmP2267TWlpaVq0aJH//S759ntd+k7S5WMuFx4erhEjRmjt2rX68ssv/esrKiq0YsUKDR48WDExMdfs63Lf9THsm266SWFhYVq1alVA/4cPH9ZHH32kH/7wh473DVzCFRCuG3fccYemT5+uvLw87d27VyNGjFBkZKQOHDig1atX61e/+pX+8R//UfHx8XryySeVl5ene+65R6NGjdKePXv05z//WXFxcVfdR1hYmJYsWaLRo0fr1ltv1ZQpU5ScnKwvvvhCn332mT744ANJUr9+/SRJjz/+uLKyshQeHq6JEyfW+Z4LFizQhg0bNHjwYD322GOKiIjQa6+9purqai1cuDCoY/FdH8OOj4/Xww8/rN/+9rcaPny4xo8fr1OnTunVV1/V2bNnlZubG9T+AYkAwnVm6dKl6tevn1577TU988wzioiI0I033qiHHnpIgwYN8o9bsGCBWrVqpaVLl2rLli3KyMjQhx9+qLvvvvua+8jKytKWLVs0f/58/fKXv1Rtba26deumqVOn+seMHz9es2bN0sqVK/X73/9exph6A6h379766KOPlJubq7y8PNXW1iojI0O///3vr/gOUENYsmSJ0tPT9frrr/sDp3///nrrrbc0dOjQBt8/Wi6XCebOJAAA3xP3gAAAVhBAAAArCCAAgBUEEADACgIIAGAFAQQAsKLJfQ+otrZWR44cUXR0dFCzBwMA7DLG6NSpU0pJSbliTsZva3IBdOTIkQad2woA0DjKysqumJX+25pcAEVHR0uSBmuUIhRpuRsAgFMXdF7btM7/73l9GiyA8vPz9fLLL6u8vFzp6elavHixBgwYcM26Sx+7RShSES4CCACanf8/v861bqM0yEMIq1at0ty5czVv3jx9+umnSk9PV1ZWlv8HfgEA0CAB9Morr2jq1KmaMmWKfvCDH2jp0qVq06aN3njjjYbYHQCgGQp5AJ07d067d+8O+GFcYWFhyszM1Pbt268YX11dLZ/PF7AAAFq+kAfQ119/rZqaGiUmJgasT0xMVHl5+RXj8/Ly5PF4/AtPwAHA9cH6F1Fzc3Pl9Xr9S1lZme2WAACNIORPwcXFxSk8PNz/s+QvqaioUFJS0hXj3W633G53qNsAADRxIb8CioqKUr9+/bRp0yb/utraWm3atEkDBw4M9e4AAM1Ug3wPaO7cuZo0aZJ+9KMfacCAAVq0aJEqKys1ZcqUhtgdAKAZapAAuu+++3T8+HE9//zzKi8v16233qr169df8WACAOD65TLGGNtNfJvP55PH49EwjWEmBABohi6Y8yrUWnm9XsXExNQ7zvpTcACA6xMBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArIiw3QBwLeExMY5r/vZc76D29XDWZsc1z8QVO66pMbWOa768cMZxzagdjzmukaQui1yOa1zb/yuofeH6xRUQAMAKAggAYEXIA+iFF16Qy+UKWHr16hXq3QAAmrkGuQfUu3dvbdy48e87ieBWEwAgUIMkQ0REhJKSkhrirQEALUSD3AM6cOCAUlJS1LVrVz344IM6dOhQvWOrq6vl8/kCFgBAyxfyAMrIyFBBQYHWr1+vJUuWqLS0VEOGDNGpU6fqHJ+XlyePx+NfUlNTQ90SAKAJCnkAZWdn695771Xfvn2VlZWldevW6eTJk3rnnXfqHJ+bmyuv1+tfysrKQt0SAKAJavCnA9q3b68ePXro4MGDdW53u91yu90N3QYAoIlp8O8BnT59WiUlJUpOTm7oXQEAmpGQB9CTTz6poqIiffnll/rkk080btw4hYeH6/777w/1rgAAzVjIP4I7fPiw7r//fp04cULx8fEaPHiwduzYofj4+FDvCgDQjLmMMcZ2E9/m8/nk8Xg0TGMU4Yq03Q5CzAy61XHNi7973XFNf7fzyTTxd3+o7OC4piDjNsc1Nd9847gGTd8Fc16FWiuv16uYq0wmzFxwAAArCCAAgBUEEADACgII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mjlzptasWaPNmzcrLS0tYHu/fv0UGRkZcD4UFxfr0KFDLep8uNZxqMvevXslqWmdD7afgvguVq5cadxutykoKDB//etfzbRp00z79u1NeXm57dYa1U9+8hNTWFhoSktLzccff2wyMzNNXFycOXbsmO3WGtSpU6fMnj17zJ49e4wk88orr5g9e/aYr776yhhjzM9//nPTvn17s3btWrNv3z4zZswYk5aWZs6ePWu589C62nE4deqUefLJJ8327dtNaWmp2bhxo7nttttM9+7dTVVVle3WQ2bGjBnG4/GYwsJCc/ToUf9y5swZ/5hHH33UdO7c2WzevNns2rXLDBw40AwcONBi16F3reNw8OBB8+KLL5pdu3aZ0tJSs3btWtO1a1czdOhQy50HahYBZIwxixcvNp07dzZRUVFmwIABZseOHbZbanT33XefSU5ONlFRUeaGG24w9913nzl48KDtthrcli1bjKQrlkmTJhljLj6K/dxzz5nExETjdrvN8OHDTXFxsd2mG8DVjsOZM2fMiBEjTHx8vImMjDRdunQxU6dObXH/Savr9y/JLFu2zD/m7Nmz5rHHHjMdOnQwbdq0MePGjTNHjx6113QDuNZxOHTokBk6dKiJjY01brfb3HTTTeanP/2p8Xq9dhu/DD8PCABgRZO/BwQAaJkIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMCK/wcgFXDPfhuVLAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure()\n", + "plt.title(\"Prediction: {}\".format(prediction))\n", + "plt.imshow(img)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "5961593d-182e-4620-9a5e-f98ba3d2534d", + "metadata": {}, + "source": [ + "### Using Triton Inference Server\n", + "\n", + "Note: you can restart the kernel and run from this point to simulate running in a different node or environment." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "a64d19b1-ba4a-4dc7-b3a9-368dc47d0fd8", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.functions import col, struct\n", + "from pyspark.sql.types import ArrayType, FloatType" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "8fa92fe4-2e04-4d82-a357-bfdfca38bd8c", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "# copy model to expected layout for Triton\n", + "rm -rf models\n", + "mkdir -p models/mnist_model/1\n", + "cp -r mnist_model models/mnist_model/1/model.savedmodel\n", + "\n", + "# add config.pbtxt\n", + "cp models_config/mnist_model/config.pbtxt models/mnist_model/config.pbtxt" + ] + }, + { + "cell_type": "markdown", + "id": "f1673e0e-5c75-44e1-88c6-5f5cf1275e4b", + "metadata": {}, + "source": [ + "#### Start Triton Server on each executor" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "0f7ecb25-be16-40c4-bdbb-441e2f537000", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "[True]" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "num_executors = 1\n", + "triton_models_dir = \"{}/models\".format(os.getcwd())\n", + "nodeRDD = sc.parallelize(list(range(num_executors)), num_executors)\n", + "\n", + "def start_triton(it):\n", + " import docker\n", + " import time\n", + " import tritonclient.grpc as grpcclient\n", + " \n", + " client=docker.from_env()\n", + " containers=client.containers.list(filters={\"name\": \"spark-triton\"})\n", + " if containers:\n", + " \n", + " print(\">>>> containers: {}\".format([c.short_id for c in containers]))\n", + " else:\n", + " container=client.containers.run(\n", + " \"nvcr.io/nvidia/tritonserver:23.04-py3\", \"tritonserver --model-repository=/models\",\n", + " detach=True,\n", + " device_requests=[docker.types.DeviceRequest(device_ids=[\"0\"], capabilities=[['gpu']])],\n", + " name=\"spark-triton\",\n", + " network_mode=\"host\",\n", + " remove=True,\n", + " shm_size=\"64M\",\n", + " volumes={triton_models_dir: {\"bind\": \"/models\", \"mode\": \"ro\"}}\n", + " )\n", + " print(\">>>> starting triton: {}\".format(container.short_id))\n", + "\n", + " # wait for triton to be running\n", + " time.sleep(15)\n", + " client = grpcclient.InferenceServerClient(\"localhost:8001\")\n", + " ready = False\n", + " while not ready:\n", + " try:\n", + " ready = client.is_server_ready()\n", + " except Exception as e:\n", + " time.sleep(5)\n", + " \n", + " return [True]\n", + "\n", + "nodeRDD.barrier().mapPartitions(start_triton).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "43b93753-1d52-4060-9986-f24c30a67528", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "StructType([StructField('data', ArrayType(DoubleType(), True), True)])" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = spark.read.parquet(\"mnist_1\")\n", + "df.schema" + ] + }, + { + "cell_type": "markdown", + "id": "b37d5026-8abc-45c3-a03c-3222c15e7d93", + "metadata": {}, + "source": [ + "#### Using custom predict_batch_fn" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "f5d4c2c6-d65a-4969-8ffd-8457b6dd35fb", + "metadata": {}, + "outputs": [], + "source": [ + "def predict_batch_fn():\n", + " import numpy as np\n", + " import tritonclient.grpc as grpcclient\n", + " client = grpcclient.InferenceServerClient(\"localhost:8001\")\n", + " def predict(inputs):\n", + " request = [grpcclient.InferInput(\"dense_input\", inputs.shape, \"FP32\")]\n", + " request[0].set_data_from_numpy(inputs.astype(np.float32))\n", + " response = client.infer(\"mnist_model\", inputs=request)\n", + " return response.as_numpy(\"dense_1\")\n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "a158490c-eaf6-4c0a-9f2f-af20df45d126", + "metadata": {}, + "outputs": [], + "source": [ + "mnist = predict_batch_udf(predict_batch_fn,\n", + " input_tensor_shapes=[[784]],\n", + " return_type=ArrayType(FloatType()),\n", + " batch_size=8192)" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "b7bd2504-1ed2-4dfe-a63a-7ed660dd1c80", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 458 ms, sys: 80.5 ms, total: 538 ms\n", + "Wall time: 2.29 s\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", mnist(struct(\"data\"))).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "4b26e237-3690-4350-a5b8-a354e668e9b7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 455 ms, sys: 157 ms, total: 612 ms\n", + "Wall time: 1.31 s\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", mnist(\"data\")).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "d6c19561-16a9-4ce4-b7df-dca9820d6173", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 874 ms, sys: 68.9 ms, total: 943 ms\n", + "Wall time: 1.53 s\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", mnist(col(\"data\"))).collect()" + ] + }, + { + "cell_type": "markdown", + "id": "50b58a82-78de-4749-a7b9-d6f38352fc69", + "metadata": { + "tags": [] + }, + "source": [ + "#### Check predictions" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "bcf123ea-c0f4-4ec7-b52f-c1e9581b83e7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
datapreds
0[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...[-9.66701889038086, -3.6094400882720947, -3.31...
1[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...[-16.348302841186523, 3.1133782863616943, 6.73...
2[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...[-21.153541564941406, -6.192654132843018, -6.6...
3[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...[-13.790016174316406, -16.204233169555664, -8....
4[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...[-18.723485946655273, -7.8062005043029785, -8....
5[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...[10.495272636413574, -10.992119789123535, -2.4...
6[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...[-9.437854766845703, -3.745434284210205, -3.59...
7[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...[-12.314884185791016, -2.106672525405884, -0.7...
8[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...[-22.142610549926758, -2.891775369644165, -4.8...
9[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...[-12.939340591430664, 0.40699198842048645, 15....
\n", + "
" + ], + "text/plain": [ + " data \n", + "0 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... \\\n", + "1 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... \n", + "2 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... \n", + "3 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... \n", + "4 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... \n", + "5 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... \n", + "6 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... \n", + "7 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... \n", + "8 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... \n", + "9 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... \n", + "\n", + " preds \n", + "0 [-9.66701889038086, -3.6094400882720947, -3.31... \n", + "1 [-16.348302841186523, 3.1133782863616943, 6.73... \n", + "2 [-21.153541564941406, -6.192654132843018, -6.6... \n", + "3 [-13.790016174316406, -16.204233169555664, -8.... \n", + "4 [-18.723485946655273, -7.8062005043029785, -8.... \n", + "5 [10.495272636413574, -10.992119789123535, -2.4... \n", + "6 [-9.437854766845703, -3.745434284210205, -3.59... \n", + "7 [-12.314884185791016, -2.106672525405884, -0.7... \n", + "8 [-22.142610549926758, -2.891775369644165, -4.8... \n", + "9 [-12.939340591430664, 0.40699198842048645, 15.... " + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "preds = df.withColumn(\"preds\", mnist(*df.columns)).limit(10).toPandas()\n", + "preds" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "525f0157-6dac-4b62-a88c-4294a9b5e7f5", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "e20b2b47-f5c3-44ad-b971-184b1037c721", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[-9.66701889038086,\n", + " -3.6094400882720947,\n", + " -3.310295581817627,\n", + " -0.3262983560562134,\n", + " -8.564104080200195,\n", + " -3.614396095275879,\n", + " -5.3909592628479,\n", + " -3.0429911613464355,\n", + " 9.717466354370117,\n", + " -5.417511940002441]" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sample = preds.iloc[0]\n", + "sample.preds" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "ca2811fa-f9d4-4c14-b203-c92f56924d8b", + "metadata": {}, + "outputs": [], + "source": [ + "prediction = np.argmax(sample.preds)\n", + "img = np.array(sample.data).reshape(28,28)" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "60dd6b57-85a0-4357-b46c-75bce626ecce", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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po2Ki4uv2PbFF18oLCxMqamp3+m9gnHpC741NTVXbDt//rwuXLjQYPtGy8c9IFw3/umf/kk1NTV66aWXrth24cIFnTx5UtLFe0yRkZFavHhxwFXDokWLrrmP2267TWlpaVq0aJH//S759ntd+k7S5WMuFx4erhEjRmjt2rX68ssv/esrKiq0YsUKDR48WDExMdfs63Lf9THsm266SWFhYVq1alVA/4cPH9ZHH32kH/7wh473DVzCFRCuG3fccYemT5+uvLw87d27VyNGjFBkZKQOHDig1atX61e/+pX+8R//UfHx8XryySeVl5ene+65R6NGjdKePXv05z//WXFxcVfdR1hYmJYsWaLRo0fr1ltv1ZQpU5ScnKwvvvhCn332mT744ANJUr9+/SRJjz/+uLKyshQeHq6JEyfW+Z4LFizQhg0bNHjwYD322GOKiIjQa6+9purqai1cuDCoY/FdH8OOj4/Xww8/rN/+9rcaPny4xo8fr1OnTunVV1/V2bNnlZubG9T+AYkAwnVm6dKl6tevn1577TU988wzioiI0I033qiHHnpIgwYN8o9bsGCBWrVqpaVLl2rLli3KyMjQhx9+qLvvvvua+8jKytKWLVs0f/58/fKXv1Rtba26deumqVOn+seMHz9es2bN0sqVK/X73/9exph6A6h379766KOPlJubq7y8PNXW1iojI0O///3vr/gOUENYsmSJ0tPT9frrr/sDp3///nrrrbc0dOjQBt8/Wi6XCebOJAAA3xP3gAAAVhBAAAArCCAAgBUEEADACgIIAGAFAQQAsKLJfQ+otrZWR44cUXR0dFCzBwMA7DLG6NSpU0pJSbliTsZva3IBdOTIkQad2woA0DjKysqumJX+25pcAEVHR0uSBmuUIhRpuRsAgFMXdF7btM7/73l9GiyA8vPz9fLLL6u8vFzp6elavHixBgwYcM26Sx+7RShSES4CCACanf8/v861bqM0yEMIq1at0ty5czVv3jx9+umnSk9PV1ZWlv8HfgEA0CAB9Morr2jq1KmaMmWKfvCDH2jp0qVq06aN3njjjYbYHQCgGQp5AJ07d067d+8O+GFcYWFhyszM1Pbt268YX11dLZ/PF7AAAFq+kAfQ119/rZqaGiUmJgasT0xMVHl5+RXj8/Ly5PF4/AtPwAHA9cH6F1Fzc3Pl9Xr9S1lZme2WAACNIORPwcXFxSk8PNz/s+QvqaioUFJS0hXj3W633G53qNsAADRxIb8CioqKUr9+/bRp0yb/utraWm3atEkDBw4M9e4AAM1Ug3wPaO7cuZo0aZJ+9KMfacCAAVq0aJEqKys1ZcqUhtgdAKAZapAAuu+++3T8+HE9//zzKi8v16233qr169df8WACAOD65TLGGNtNfJvP55PH49EwjWEmBABohi6Y8yrUWnm9XsXExNQ7zvpTcACA6xMBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArIiw3QBwLeExMY5r/vZc76D29XDWZsc1z8QVO66pMbWOa768cMZxzagdjzmukaQui1yOa1zb/yuofeH6xRUQAMAKAggAYEXIA+iFF16Qy+UKWHr16hXq3QAAmrkGuQfUu3dvbdy48e87ieBWEwAgUIMkQ0REhJKSkhrirQEALUSD3AM6cOCAUlJS1LVrVz344IM6dOhQvWOrq6vl8/kCFgBAyxfyAMrIyFBBQYHWr1+vJUuWqLS0VEOGDNGpU6fqHJ+XlyePx+NfUlNTQ90SAKAJCnkAZWdn695771Xfvn2VlZWldevW6eTJk3rnnXfqHJ+bmyuv1+tfysrKQt0SAKAJavCnA9q3b68ePXro4MGDdW53u91yu90N3QYAoIlp8O8BnT59WiUlJUpOTm7oXQEAmpGQB9CTTz6poqIiffnll/rkk080btw4hYeH6/777w/1rgAAzVjIP4I7fPiw7r//fp04cULx8fEaPHiwduzYofj4+FDvCgDQjLmMMcZ2E9/m8/nk8Xg0TGMU4Yq03Q5CzAy61XHNi7973XFNf7fzyTTxd3+o7OC4piDjNsc1Nd9847gGTd8Fc16FWiuv16uYq0wmzFxwAAArCCAAgBUEEADACgII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mjlzptasWaPNmzcrLS0tYHu/fv0UGRkZcD4UFxfr0KFDLep8uNZxqMvevXslqWmdD7afgvguVq5cadxutykoKDB//etfzbRp00z79u1NeXm57dYa1U9+8hNTWFhoSktLzccff2wyMzNNXFycOXbsmO3WGtSpU6fMnj17zJ49e4wk88orr5g9e/aYr776yhhjzM9//nPTvn17s3btWrNv3z4zZswYk5aWZs6ePWu589C62nE4deqUefLJJ8327dtNaWmp2bhxo7nttttM9+7dTVVVle3WQ2bGjBnG4/GYwsJCc/ToUf9y5swZ/5hHH33UdO7c2WzevNns2rXLDBw40AwcONBi16F3reNw8OBB8+KLL5pdu3aZ0tJSs3btWtO1a1czdOhQy50HahYBZIwxixcvNp07dzZRUVFmwIABZseOHbZbanT33XefSU5ONlFRUeaGG24w9913nzl48KDtthrcli1bjKQrlkmTJhljLj6K/dxzz5nExETjdrvN8OHDTXFxsd2mG8DVjsOZM2fMiBEjTHx8vImMjDRdunQxU6dObXH/Savr9y/JLFu2zD/m7Nmz5rHHHjMdOnQwbdq0MePGjTNHjx6113QDuNZxOHTokBk6dKiJjY01brfb3HTTTeanP/2p8Xq9dhu/DD8PCABgRZO/BwQAaJkIIACAFQQQAMAKAggAYAUBBACwggACAFhBAAEArCCAAABWEEAAACsIIACAFQQQAMCK/wcgFXDPfhuVLAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure()\n", + "plt.title(\"Prediction: {}\".format(prediction))\n", + "plt.imshow(img)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "036680eb-babd-4b07-8b2c-ce6e724f4e85", + "metadata": {}, + "source": [ + "#### Using generic Triton function" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "3af08bd0-3838-4769-a8de-2643db4101c6", + "metadata": {}, + "outputs": [], + "source": [ + "def triton_fn(triton_uri, model_name):\n", + " import numpy as np\n", + " import tritonclient.grpc as grpcclient\n", + "\n", + " np_types = {\n", + " \"BOOL\": np.dtype(np.bool8),\n", + " \"INT8\": np.dtype(np.int8),\n", + " \"INT16\": np.dtype(np.int16),\n", + " \"INT32\": np.dtype(np.int32),\n", + " \"INT64\": np.dtype(np.int64),\n", + " \"FP16\": np.dtype(np.float16),\n", + " \"FP32\": np.dtype(np.float32),\n", + " \"FP64\": np.dtype(np.float64),\n", + " \"FP64\": np.dtype(np.double),\n", + " \"BYTES\": np.dtype(object)\n", + " }\n", + "\n", + " client = grpcclient.InferenceServerClient(triton_uri)\n", + " model_meta = client.get_model_metadata(model_name)\n", + "\n", + " def predict(inputs):\n", + " if isinstance(inputs, np.ndarray):\n", + " # single ndarray input\n", + " request = [grpcclient.InferInput(model_meta.inputs[0].name, inputs.shape, model_meta.inputs[0].datatype)]\n", + " request[0].set_data_from_numpy(inputs.astype(np_types[model_meta.inputs[0].datatype]))\n", + " else:\n", + " # dict of multiple ndarray inputs\n", + " request = [grpcclient.InferInput(i.name, inputs[i.name].shape, i.datatype) for i in model_meta.inputs]\n", + " for i in request:\n", + " i.set_data_from_numpy(inputs[i.name()].astype(np_types[i.datatype()]))\n", + "\n", + " response = client.infer(model_name, inputs=request)\n", + "\n", + " if len(model_meta.outputs) > 1:\n", + " # return dictionary of numpy arrays\n", + " return {o.name: response.as_numpy(o.name) for o in model_meta.outputs}\n", + " else:\n", + " # return single numpy array\n", + " return response.as_numpy(model_meta.outputs[0].name)\n", + "\n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "id": "6658d2a1-ef7b-4ca1-9fb6-f2ac9050f3e5", + "metadata": {}, + "outputs": [], + "source": [ + "from functools import partial\n", + "\n", + "predict = predict_batch_udf(partial(triton_fn, \"localhost:8001\", \"mnist_model\"),\n", + " return_type=ArrayType(FloatType()),\n", + " input_tensor_shapes=[[784]],\n", + " batch_size=8192)" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "8397aa14-82fd-4351-a477-dc8e8b321fa2", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 410 ms, sys: 104 ms, total: 514 ms\n", + "Wall time: 1.65 s\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", predict(struct(\"data\"))).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "82698bd9-377a-4415-8971-835487f876cc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 495 ms, sys: 81.4 ms, total: 576 ms\n", + "Wall time: 1.21 s\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", predict(\"data\")).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "id": "419ad7bd-fa28-49d3-b98d-db9fba5aeaef", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 858 ms, sys: 109 ms, total: 967 ms\n", + "Wall time: 1.58 s\n" + ] + } + ], + "source": [ + "%%time\n", + "preds = df.withColumn(\"preds\", predict(col(\"data\"))).collect()" + ] + }, + { + "cell_type": "markdown", + "id": "6377f41a-5654-410b-8bad-d392e9dce7b8", + "metadata": { + "tags": [] + }, + "source": [ + "#### Stop Triton Server on each executor" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "9c9fd967-5cd9-4265-add9-db5c1ccf9893", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "[True]" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def stop_triton(it):\n", + " import docker\n", + " import time\n", + " \n", + " client=docker.from_env()\n", + " containers=client.containers.list(filters={\"name\": \"spark-triton\"})\n", + " print(\">>>> stopping containers: {}\".format([c.short_id for c in containers]))\n", + " if containers:\n", + " container=containers[0]\n", + " container.stop(timeout=120)\n", + "\n", + " return [True]\n", + "\n", + "nodeRDD.barrier().mapPartitions(stop_triton).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "f612dc0b-538f-4ecf-81f7-ef6b58c493ab", + "metadata": {}, + "outputs": [], + "source": [ + "spark.stop()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "490fc849-e47a-48d7-accc-429ff1cced6b", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/keras-metadata.ipynb b/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/keras-metadata.ipynb new file mode 100644 index 000000000..f9db34ca8 --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/keras-metadata.ipynb @@ -0,0 +1,1160 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8e6810cc-5982-4293-bfbd-c91ef0aca204", + "metadata": {}, + "source": [ + "# Distributed model inference using TensorFlow Keras\n", + "From: https://docs.databricks.com/_static/notebooks/deep-learning/keras-metadata.html" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cf329ac8-0763-44bc-b0f6-b634b7dc480e", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import shutil\n", + "import subprocess\n", + "import time\n", + "import pandas as pd\n", + "from PIL import Image\n", + "import numpy as np\n", + "import uuid\n", + " \n", + "import tensorflow as tf\n", + "from tensorflow.keras.applications.resnet50 import ResNet50\n", + " \n", + "from pyspark.sql.functions import col, pandas_udf, PandasUDFType" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "950b0470-a21e-4778-a80e-b8f6ef792dff", + "metadata": {}, + "outputs": [], + "source": [ + "file_name = \"image_data.parquet\"\n", + "output_file_path = \"predictions\"" + ] + }, + { + "cell_type": "markdown", + "id": "968d08a7-66b9-444f-b362-d8df692aef1c", + "metadata": {}, + "source": [ + "### Prepare trained model and data for inference" + ] + }, + { + "cell_type": "markdown", + "id": "da083168-137f-492c-8769-d8f1e2111756", + "metadata": {}, + "source": [ + "Load the ResNet-50 Model and broadcast the weights." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2ddc715a-cdbc-4c49-93e9-58c9d88511da", + "metadata": {}, + "outputs": [], + "source": [ + "model = ResNet50()\n", + "bc_model_weights = sc.broadcast(model.get_weights())" + ] + }, + { + "cell_type": "markdown", + "id": "77dddfa3-e8df-4e8e-8251-64457f1ebf80", + "metadata": {}, + "source": [ + "Load the data and save the datasets to one Parquet file." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c0738bec-97d4-4946-8c49-5e6d07ff1afc", + "metadata": {}, + "outputs": [], + "source": [ + "import pathlib\n", + "dataset_url = \"https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz\"\n", + "data_dir = tf.keras.utils.get_file(origin=dataset_url,\n", + " fname='flower_photos',\n", + " untar=True)\n", + "data_dir = pathlib.Path(data_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "014644f4-2a45-4474-8afb-0daf90043253", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3670\n" + ] + } + ], + "source": [ + "image_count = len(list(data_dir.glob('*/*.jpg')))\n", + "print(image_count)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d54f470a-d308-4426-8ed0-33f95155bb4f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2048" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import os\n", + "files = [os.path.join(dp, f) for dp, dn, filenames in os.walk(data_dir) for f in filenames if os.path.splitext(f)[1] == '.jpg']\n", + "files = files[:2048]\n", + "len(files)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "fd883dc0-4846-4411-a4d6-4f5f252ac707", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/leey/.keras/datasets/flower_photos\n" + ] + } + ], + "source": [ + "print(data_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "64f94ee0-f1ea-47f6-a77e-be8da5d1b87a", + "metadata": {}, + "outputs": [], + "source": [ + "image_data = []\n", + "for file in files:\n", + " img = Image.open(file)\n", + " img = img.resize([224, 224])\n", + " data = np.asarray(img, dtype=\"float32\").reshape([224*224*3])\n", + "\n", + " image_data.append({\"data\": data})\n", + "\n", + "pandas_df = pd.DataFrame(image_data, columns=['data'])\n", + "pandas_df.to_parquet(file_name)\n", + "# os.makedirs(dbfs_file_path)\n", + "# shutil.copyfile(file_name, dbfs_file_path+file_name)" + ] + }, + { + "cell_type": "markdown", + "id": "f2414b0f-58f2-4e4a-9d09-8ea95b38d413", + "metadata": {}, + "source": [ + "### Save Model\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "670328e3-7274-4d78-b315-487750166a3f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "subprocess.call(\"rm -rf resnet50_model\".split())" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "39c663a9-0526-4573-b7b0-27920e5b0004", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:absl:Found untraced functions such as _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op while saving (showing 5 of 53). These functions will not be directly callable after loading.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: resnet50_model/assets\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: resnet50_model/assets\n" + ] + } + ], + "source": [ + "model.save('resnet50_model')" + ] + }, + { + "cell_type": "markdown", + "id": "b827ad56-1af0-41b7-be68-94bd203a2a70", + "metadata": {}, + "source": [ + "### Load the data into Spark DataFrames" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "8ddc22d0-b88a-4906-bd47-bf247e34feeb", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 1:> (0 + 8) / 8]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2048\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "from pyspark.sql.types import *\n", + "df = spark.read.parquet(file_name)\n", + "print(df.count())" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "c7adf1d9-1fa7-4456-ae32-cf7d1d43bfd3", + "metadata": {}, + "outputs": [], + "source": [ + "# spark.conf.set(\"spark.sql.execution.arrow.maxRecordsPerBatch\", \"1024\")\n", + "spark.conf.set(\"spark.sql.parquet.columnarReaderBatchSize\", \"1024\")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "97173c07-a96e-4262-b60f-82865b997e99", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "assert len(df.head()) > 0, \"`df` should not be empty\" # This line will fail if the vectorized reader runs out of memory" + ] + }, + { + "cell_type": "markdown", + "id": "865929b0-b016-4de4-996d-7f16176cf49c", + "metadata": { + "tags": [] + }, + "source": [ + "### Model inference via pandas UDF" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "a67b3128-13c1-44f1-a0c0-7cf7a836fee3", + "metadata": {}, + "outputs": [], + "source": [ + "def parse_image(image_data):\n", + " image = tf.image.convert_image_dtype(\n", + " image_data, dtype=tf.float32) * (2. / 255) - 1\n", + " image = tf.reshape(image, [224, 224, 3])\n", + " return image" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "7b33185f-6d1e-4ca9-9757-fdc3d736496b", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/leey/devpub/spark/python/pyspark/sql/pandas/functions.py:399: UserWarning: In Python 3.6+ and Spark 3.0+, it is preferred to specify type hints for pandas UDF instead of specifying pandas UDF type which will be deprecated in the future releases. See SPARK-28264 for more details.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "@pandas_udf(ArrayType(FloatType()), PandasUDFType.SCALAR_ITER)\n", + "def predict_batch_udf(image_batch_iter):\n", + " batch_size = 64\n", + " model = ResNet50(weights=None)\n", + " model.set_weights(bc_model_weights.value)\n", + " for image_batch in image_batch_iter:\n", + " images = np.vstack(image_batch)\n", + " dataset = tf.data.Dataset.from_tensor_slices(images)\n", + " dataset = dataset.map(parse_image, num_parallel_calls=8).prefetch(\n", + " 5000).batch(batch_size)\n", + " preds = model.predict(dataset)\n", + " yield pd.Series(list(preds))" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "ad8c05da-db38-45ef-81d0-1f862f575ced", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 7:============================================> (3 + 1) / 4]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------------------------------------------------------------------------------------------------------------------+\n", + "| prediction|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "|[1.7195931E-4, 3.2735552E-4, 7.533328E-5, 1.9810574E-4, 6.6188135E-5, 4.304618E-4, 1.3097588E-5, 5.2791635E-5, 2.3571...|\n", + "|[7.738322E-5, 5.935413E-4, 1.3075814E-4, 1.8000253E-4, 1.3001164E-4, 2.2790757E-4, 5.0780895E-5, 2.3768713E-4, 3.8676...|\n", + "|[2.3994662E-5, 3.4409956E-4, 1.8440963E-4, 1.6311614E-4, 1.4301096E-4, 8.883273E-5, 2.6071444E-5, 2.3609246E-4, 1.481...|\n", + "|[7.33013E-5, 2.6747186E-4, 1.2007599E-4, 2.0717822E-4, 8.630799E-5, 2.2318888E-4, 1.3459768E-5, 8.564859E-5, 1.482114...|\n", + "|[5.592278E-5, 2.5165555E-4, 1.3106635E-4, 1.5746983E-4, 8.4952095E-5, 2.1269226E-4, 9.83865E-6, 1.6246884E-4, 1.24666...|\n", + "|[1.1709497E-4, 3.0075156E-4, 9.33239E-5, 1.6481965E-4, 6.906736E-5, 4.821755E-4, 8.922642E-6, 5.9618797E-5, 1.72143E-...|\n", + "|[1.1801151E-4, 2.1426812E-4, 5.9151847E-5, 1.1427055E-4, 5.1385836E-5, 4.3937864E-4, 4.607807E-6, 3.3783803E-5, 8.869...|\n", + "|[1.04612736E-4, 2.7663654E-4, 9.435623E-5, 1.6525248E-4, 7.4158685E-5, 4.257633E-4, 8.704045E-6, 5.3063635E-5, 1.2789...|\n", + "|[7.352998E-5, 3.3315457E-4, 7.0680355E-5, 1.7582536E-4, 7.606573E-5, 2.8071608E-4, 1.5708138E-5, 7.895344E-5, 1.63833...|\n", + "|[5.4112577E-5, 3.4097856E-4, 4.273796E-5, 6.867077E-5, 4.2725427E-5, 3.6373304E-4, 4.102062E-6, 1.15471645E-4, 1.3269...|\n", + "|[1.6299986E-5, 3.011269E-4, 1.0530894E-4, 1.0999596E-4, 6.247357E-5, 8.1669314E-5, 8.867516E-6, 1.9714379E-4, 9.89142...|\n", + "|[2.4569267E-4, 5.179993E-4, 1.7478937E-4, 2.2669601E-4, 1.2160459E-4, 4.5433E-4, 3.953984E-5, 7.979992E-5, 3.3513832E...|\n", + "|[9.029223E-5, 3.9454165E-4, 1.665605E-4, 1.9196334E-4, 1.1372031E-4, 2.0514896E-4, 2.7878115E-5, 1.4796885E-4, 3.3018...|\n", + "|[8.730619E-6, 3.4874916E-4, 5.797578E-5, 4.9443646E-5, 5.4349573E-5, 4.1568164E-5, 1.4966195E-5, 6.196577E-4, 2.33120...|\n", + "|[2.1702444E-5, 2.3885888E-4, 1.0117506E-4, 7.988898E-5, 7.155834E-5, 1.2449219E-4, 7.99208E-6, 2.611562E-4, 1.5751371...|\n", + "|[8.29938E-5, 3.1705064E-4, 1.587315E-4, 2.3244774E-4, 9.55335E-5, 1.9356904E-4, 1.7146796E-5, 9.8108874E-5, 1.8489505...|\n", + "|[6.3181215E-5, 2.6232892E-4, 1.0581372E-4, 2.0251807E-4, 6.83598E-5, 2.0704906E-4, 1.1209849E-5, 8.139733E-5, 1.70928...|\n", + "|[1.5359989E-4, 3.3213175E-4, 7.3188654E-5, 1.3153376E-4, 6.174973E-5, 3.554963E-4, 1.0753482E-5, 6.729857E-5, 2.27700...|\n", + "|[7.3694064E-5, 3.3086358E-4, 1.6089129E-4, 1.9742687E-4, 1.0419457E-4, 2.0769038E-4, 1.9587573E-5, 1.2341993E-4, 1.45...|\n", + "|[6.0036982E-5, 3.690938E-4, 9.357083E-5, 1.2322696E-4, 7.118597E-5, 2.5646162E-4, 1.1585914E-5, 2.2628417E-4, 2.26159...|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "only showing top 20 rows\n", + "\n", + "CPU times: user 42.3 ms, sys: 2.17 ms, total: 44.5 ms\n", + "Wall time: 12.3 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "predictions_df = df.select(predict_batch_udf(col(\"data\")).alias(\"prediction\"))\n", + "predictions_df.show(truncate=120)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "40799f8e-443e-40ca-919b-391f901cb3f4", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 8:===================================================> (7 + 1) / 8]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 26 ms, sys: 8.71 ms, total: 34.7 ms\n", + "Wall time: 49.9 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "predictions_df.write.mode(\"overwrite\").parquet(output_file_path)" + ] + }, + { + "cell_type": "markdown", + "id": "16726357-65d8-4d3d-aea1-6800101741cc", + "metadata": { + "tags": [] + }, + "source": [ + "### Model inference using Spark DL API" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "e6af27b2-ddc0-42ee-94cc-9ba5ffee6868", + "metadata": {}, + "outputs": [], + "source": [ + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.functions import struct, col\n", + "from pyspark.sql.types import ArrayType, FloatType" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "dda88b46-6300-4bf7-bc10-7403f4fbbf92", + "metadata": {}, + "outputs": [], + "source": [ + "def predict_batch_fn():\n", + " import tensorflow as tf\n", + " from tensorflow.keras.applications.resnet50 import ResNet50\n", + " model = ResNet50()\n", + " def predict(inputs):\n", + " inputs = inputs * (2. / 255) - 1\n", + " return model.predict(inputs)\n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "cff0e851-563d-40b6-9d05-509c22b3b7f9", + "metadata": {}, + "outputs": [], + "source": [ + "classify = predict_batch_udf(predict_batch_fn,\n", + " input_tensor_shapes=[[224, 224, 3]],\n", + " return_type=ArrayType(FloatType()),\n", + " batch_size=50)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "f733c38b-867d-48c1-b9a6-74a931561896", + "metadata": {}, + "outputs": [], + "source": [ + "# spark.conf.set(\"spark.sql.execution.arrow.maxRecordsPerBatch\", \"1024\")\n", + "spark.conf.set(\"spark.sql.parquet.columnarReaderBatchSize\", \"1024\")" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "aa7c156f-e2b3-4837-9427-ccf3a5720412", + "metadata": {}, + "outputs": [], + "source": [ + "df = spark.read.parquet(\"image_data.parquet\")" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "80bc50ad-eaf5-4fce-a354-5e17d65e2da5", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 11:===========================================> (3 + 1) / 4]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------------------------------------------------------------------------------------------------------------------+\n", + "| prediction|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "|[1.7195931E-4, 3.2735552E-4, 7.533328E-5, 1.9810574E-4, 6.6188135E-5, 4.304618E-4, 1.3097588E-5, 5.2791635E-5, 2.3571...|\n", + "|[7.738322E-5, 5.935413E-4, 1.3075814E-4, 1.8000253E-4, 1.3001164E-4, 2.2790757E-4, 5.0780895E-5, 2.3768713E-4, 3.8676...|\n", + "|[2.3994662E-5, 3.4409956E-4, 1.8440963E-4, 1.6311614E-4, 1.4301096E-4, 8.883273E-5, 2.6071444E-5, 2.3609246E-4, 1.481...|\n", + "|[7.33013E-5, 2.6747186E-4, 1.2007599E-4, 2.0717822E-4, 8.630799E-5, 2.2318888E-4, 1.3459768E-5, 8.564859E-5, 1.482114...|\n", + "|[5.592278E-5, 2.5165555E-4, 1.3106635E-4, 1.5746983E-4, 8.4952095E-5, 2.1269226E-4, 9.83865E-6, 1.6246884E-4, 1.24666...|\n", + "|[1.1709497E-4, 3.0075156E-4, 9.33239E-5, 1.6481965E-4, 6.906736E-5, 4.821755E-4, 8.922642E-6, 5.9618797E-5, 1.72143E-...|\n", + "|[1.1801151E-4, 2.1426812E-4, 5.9151847E-5, 1.1427055E-4, 5.1385836E-5, 4.3937864E-4, 4.607807E-6, 3.3783803E-5, 8.869...|\n", + "|[1.04612736E-4, 2.7663654E-4, 9.435623E-5, 1.6525248E-4, 7.4158685E-5, 4.257633E-4, 8.704045E-6, 5.3063635E-5, 1.2789...|\n", + "|[7.352998E-5, 3.3315457E-4, 7.0680355E-5, 1.7582536E-4, 7.606573E-5, 2.8071608E-4, 1.5708138E-5, 7.895344E-5, 1.63833...|\n", + "|[5.4112577E-5, 3.4097856E-4, 4.273796E-5, 6.867077E-5, 4.2725427E-5, 3.6373304E-4, 4.102062E-6, 1.15471645E-4, 1.3269...|\n", + "|[1.6299986E-5, 3.011269E-4, 1.0530894E-4, 1.0999596E-4, 6.247357E-5, 8.1669314E-5, 8.867516E-6, 1.9714379E-4, 9.89142...|\n", + "|[2.4569267E-4, 5.179993E-4, 1.7478937E-4, 2.2669601E-4, 1.2160459E-4, 4.5433E-4, 3.953984E-5, 7.979992E-5, 3.3513832E...|\n", + "|[9.029223E-5, 3.9454165E-4, 1.665605E-4, 1.9196334E-4, 1.1372031E-4, 2.0514896E-4, 2.7878115E-5, 1.4796885E-4, 3.3018...|\n", + "|[8.730619E-6, 3.4874916E-4, 5.797578E-5, 4.9443646E-5, 5.4349573E-5, 4.1568164E-5, 1.4966195E-5, 6.196577E-4, 2.33120...|\n", + "|[2.1702444E-5, 2.3885888E-4, 1.0117506E-4, 7.988898E-5, 7.155834E-5, 1.2449219E-4, 7.99208E-6, 2.611562E-4, 1.5751371...|\n", + "|[8.29938E-5, 3.1705064E-4, 1.587315E-4, 2.3244774E-4, 9.55335E-5, 1.9356904E-4, 1.7146796E-5, 9.8108874E-5, 1.8489505...|\n", + "|[6.3181215E-5, 2.6232892E-4, 1.0581372E-4, 2.0251807E-4, 6.83598E-5, 2.0704906E-4, 1.1209849E-5, 8.139733E-5, 1.70928...|\n", + "|[1.5359989E-4, 3.3213175E-4, 7.3188654E-5, 1.3153376E-4, 6.174973E-5, 3.554963E-4, 1.0753482E-5, 6.729857E-5, 2.27700...|\n", + "|[7.3694064E-5, 3.3086358E-4, 1.6089129E-4, 1.9742687E-4, 1.0419457E-4, 2.0769038E-4, 1.9587573E-5, 1.2341993E-4, 1.45...|\n", + "|[6.0036982E-5, 3.690938E-4, 9.357083E-5, 1.2322696E-4, 7.118597E-5, 2.5646162E-4, 1.1585914E-5, 2.2628417E-4, 2.26159...|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "only showing top 20 rows\n", + "\n", + "CPU times: user 19.7 ms, sys: 7.84 ms, total: 27.5 ms\n", + "Wall time: 7.41 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "# first pass caches model/fn\n", + "predictions = df.select(classify(struct(\"data\")).alias(\"prediction\"))\n", + "predictions.show(truncate=120)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "41cace80-7a4b-4929-8e63-9c83f9745e02", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 13:===========================================> (3 + 1) / 4]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------------------------------------------------------------------------------------------------------------------+\n", + "| prediction|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "|[1.7195931E-4, 3.2735552E-4, 7.533328E-5, 1.9810574E-4, 6.6188135E-5, 4.304618E-4, 1.3097588E-5, 5.2791635E-5, 2.3571...|\n", + "|[7.738322E-5, 5.935413E-4, 1.3075814E-4, 1.8000253E-4, 1.3001164E-4, 2.2790757E-4, 5.0780895E-5, 2.3768713E-4, 3.8676...|\n", + "|[2.3994662E-5, 3.4409956E-4, 1.8440963E-4, 1.6311614E-4, 1.4301096E-4, 8.883273E-5, 2.6071444E-5, 2.3609246E-4, 1.481...|\n", + "|[7.33013E-5, 2.6747186E-4, 1.2007599E-4, 2.0717822E-4, 8.630799E-5, 2.2318888E-4, 1.3459768E-5, 8.564859E-5, 1.482114...|\n", + "|[5.592278E-5, 2.5165555E-4, 1.3106635E-4, 1.5746983E-4, 8.4952095E-5, 2.1269226E-4, 9.83865E-6, 1.6246884E-4, 1.24666...|\n", + "|[1.1709497E-4, 3.0075156E-4, 9.33239E-5, 1.6481965E-4, 6.906736E-5, 4.821755E-4, 8.922642E-6, 5.9618797E-5, 1.72143E-...|\n", + "|[1.1801151E-4, 2.1426812E-4, 5.9151847E-5, 1.1427055E-4, 5.1385836E-5, 4.3937864E-4, 4.607807E-6, 3.3783803E-5, 8.869...|\n", + "|[1.04612736E-4, 2.7663654E-4, 9.435623E-5, 1.6525248E-4, 7.4158685E-5, 4.257633E-4, 8.704045E-6, 5.3063635E-5, 1.2789...|\n", + "|[7.352998E-5, 3.3315457E-4, 7.0680355E-5, 1.7582536E-4, 7.606573E-5, 2.8071608E-4, 1.5708138E-5, 7.895344E-5, 1.63833...|\n", + "|[5.4112577E-5, 3.4097856E-4, 4.273796E-5, 6.867077E-5, 4.2725427E-5, 3.6373304E-4, 4.102062E-6, 1.15471645E-4, 1.3269...|\n", + "|[1.6299986E-5, 3.011269E-4, 1.0530894E-4, 1.0999596E-4, 6.247357E-5, 8.1669314E-5, 8.867516E-6, 1.9714379E-4, 9.89142...|\n", + "|[2.4569267E-4, 5.179993E-4, 1.7478937E-4, 2.2669601E-4, 1.2160459E-4, 4.5433E-4, 3.953984E-5, 7.979992E-5, 3.3513832E...|\n", + "|[9.029223E-5, 3.9454165E-4, 1.665605E-4, 1.9196334E-4, 1.1372031E-4, 2.0514896E-4, 2.7878115E-5, 1.4796885E-4, 3.3018...|\n", + "|[8.730619E-6, 3.4874916E-4, 5.797578E-5, 4.9443646E-5, 5.4349573E-5, 4.1568164E-5, 1.4966195E-5, 6.196577E-4, 2.33120...|\n", + "|[2.1702444E-5, 2.3885888E-4, 1.0117506E-4, 7.988898E-5, 7.155834E-5, 1.2449219E-4, 7.99208E-6, 2.611562E-4, 1.5751371...|\n", + "|[8.29938E-5, 3.1705064E-4, 1.587315E-4, 2.3244774E-4, 9.55335E-5, 1.9356904E-4, 1.7146796E-5, 9.8108874E-5, 1.8489505...|\n", + "|[6.3181215E-5, 2.6232892E-4, 1.0581372E-4, 2.0251807E-4, 6.83598E-5, 2.0704906E-4, 1.1209849E-5, 8.139733E-5, 1.70928...|\n", + "|[1.5359989E-4, 3.3213175E-4, 7.3188654E-5, 1.3153376E-4, 6.174973E-5, 3.554963E-4, 1.0753482E-5, 6.729857E-5, 2.27700...|\n", + "|[7.3694064E-5, 3.3086358E-4, 1.6089129E-4, 1.9742687E-4, 1.0419457E-4, 2.0769038E-4, 1.9587573E-5, 1.2341993E-4, 1.45...|\n", + "|[6.0036982E-5, 3.690938E-4, 9.357083E-5, 1.2322696E-4, 7.118597E-5, 2.5646162E-4, 1.1585914E-5, 2.2628417E-4, 2.26159...|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "only showing top 20 rows\n", + "\n", + "CPU times: user 31.5 ms, sys: 6.18 ms, total: 37.6 ms\n", + "Wall time: 6.06 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "predictions = df.select(classify(\"data\").alias(\"prediction\"))\n", + "predictions.show(truncate=120)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "56a2ec8a-de09-4d7c-9666-1b3c76f10657", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 14:==================================================> (7 + 1) / 8]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 30.8 ms, sys: 4.88 ms, total: 35.7 ms\n", + "Wall time: 49.1 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "predictions = df.select(classify(col(\"data\")).alias(\"prediction\"))\n", + "predictions.write.mode(\"overwrite\").parquet(output_file_path + \"_1\")" + ] + }, + { + "cell_type": "markdown", + "id": "0efa48e9-2eda-4d57-8174-8850e5bca4af", + "metadata": {}, + "source": [ + "### Using Triton Inference Server\n", + "\n", + "Note: you can restart the kernel and run from this point to simulate running in a different node or environment." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "2605d134-ef75-4d94-9b16-2c6d85f29bef", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.functions import col, struct\n", + "from pyspark.sql.types import ArrayType, FloatType" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "4666e618-8038-4dc5-9be7-793aedbf4500", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "# copy model to expected layout for Triton\n", + "rm -rf models\n", + "mkdir -p models/resnet50/1\n", + "cp -r resnet50_model models/resnet50/1/model.savedmodel\n", + "\n", + "# add config.pbtxt\n", + "cp models_config/resnet50/config.pbtxt models/resnet50/config.pbtxt" + ] + }, + { + "cell_type": "markdown", + "id": "e07f1d6d-334e-4f85-9472-171dda09bae4", + "metadata": {}, + "source": [ + "#### Start Triton Server on each executor" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "8c8c0744-0558-4dac-bbfe-8bdde4b2af2d", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "[True]" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "num_executors = 1\n", + "triton_models_dir = \"{}/models\".format(os.getcwd())\n", + "nodeRDD = sc.parallelize(list(range(num_executors)), num_executors)\n", + "\n", + "def start_triton(it):\n", + " import docker\n", + " import time\n", + " import tritonclient.grpc as grpcclient\n", + " \n", + " client=docker.from_env()\n", + " containers=client.containers.list(filters={\"name\": \"spark-triton\"})\n", + " if containers:\n", + " print(\">>>> containers: {}\".format([c.short_id for c in containers]))\n", + " else:\n", + " container=client.containers.run(\n", + " \"nvcr.io/nvidia/tritonserver:23.04-py3\", \"tritonserver --model-repository=/models\",\n", + " detach=True,\n", + " device_requests=[docker.types.DeviceRequest(device_ids=[\"0\"], capabilities=[['gpu']])],\n", + " name=\"spark-triton\",\n", + " network_mode=\"host\",\n", + " remove=True,\n", + " shm_size=\"512M\",\n", + " volumes={triton_models_dir: {\"bind\": \"/models\", \"mode\": \"ro\"}}\n", + " )\n", + " print(\">>>> starting triton: {}\".format(container.short_id))\n", + "\n", + " # wait for triton to be running\n", + " time.sleep(15)\n", + " client = grpcclient.InferenceServerClient(\"localhost:8001\")\n", + " ready = False\n", + " while not ready:\n", + " try:\n", + " ready = client.is_server_ready()\n", + " except Exception as e:\n", + " time.sleep(5)\n", + "\n", + " return [True]\n", + "\n", + "nodeRDD.barrier().mapPartitions(start_triton).collect()" + ] + }, + { + "cell_type": "markdown", + "id": "8c07365c-0a14-49b3-9bd8-cfb35f48b089", + "metadata": {}, + "source": [ + "#### Run inference" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "bcd46360-6851-4a9d-8590-c086e001242a", + "metadata": {}, + "outputs": [], + "source": [ + "def triton_fn(triton_uri, model_name):\n", + " import numpy as np\n", + " import tritonclient.grpc as grpcclient\n", + " \n", + " np_types = {\n", + " \"BOOL\": np.dtype(np.bool8),\n", + " \"INT8\": np.dtype(np.int8),\n", + " \"INT16\": np.dtype(np.int16),\n", + " \"INT32\": np.dtype(np.int32),\n", + " \"INT64\": np.dtype(np.int64),\n", + " \"FP16\": np.dtype(np.float16),\n", + " \"FP32\": np.dtype(np.float32),\n", + " \"FP64\": np.dtype(np.float64),\n", + " \"FP64\": np.dtype(np.double),\n", + " \"BYTES\": np.dtype(object)\n", + " }\n", + "\n", + " client = grpcclient.InferenceServerClient(triton_uri)\n", + " model_meta = client.get_model_metadata(model_name)\n", + " \n", + " def predict(inputs):\n", + " if isinstance(inputs, np.ndarray):\n", + " # single ndarray input\n", + " inputs = inputs * (2. / 255) - 1 # add normalization\n", + " request = [grpcclient.InferInput(model_meta.inputs[0].name, inputs.shape, model_meta.inputs[0].datatype)]\n", + " request[0].set_data_from_numpy(inputs.astype(np_types[model_meta.inputs[0].datatype]))\n", + " else:\n", + " # dict of multiple ndarray inputs\n", + " request = [grpcclient.InferInput(i.name, inputs[i.name].shape, i.datatype) for i in model_meta.inputs]\n", + " for i in request:\n", + " i.set_data_from_numpy(inputs[i.name()].astype(np_types[i.datatype()]))\n", + " \n", + " response = client.infer(model_name, inputs=request)\n", + " \n", + " if len(model_meta.outputs) > 1:\n", + " # return dictionary of numpy arrays\n", + " return {o.name: response.as_numpy(o.name) for o in model_meta.outputs}\n", + " else:\n", + " # return single numpy array\n", + " return response.as_numpy(model_meta.outputs[0].name)\n", + " \n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "9fabcaeb-5a44-42bb-8097-5dbc2d0cee3e", + "metadata": {}, + "outputs": [], + "source": [ + "from functools import partial\n", + "\n", + "classify = predict_batch_udf(partial(triton_fn, triton_uri=\"localhost:8001\", model_name=\"resnet50\"),\n", + " input_tensor_shapes=[[224, 224, 3]],\n", + " return_type=ArrayType(FloatType()),\n", + " batch_size=50)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "b17f33c8-a0f0-4bce-91f8-5838ba9b12a7", + "metadata": {}, + "outputs": [], + "source": [ + "# spark.conf.set(\"spark.sql.execution.arrow.maxRecordsPerBatch\", \"1024\")\n", + "spark.conf.set(\"spark.sql.parquet.columnarReaderBatchSize\", \"1024\")" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "8e5b9e99-a1cf-43d3-a795-c7271a917057", + "metadata": {}, + "outputs": [], + "source": [ + "df = spark.read.parquet(\"image_data.parquet\")" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "e595473d-1a5d-46a6-a6ba-89d2ea903de9", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 18:===========================================> (3 + 1) / 4]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------------------------------------------------------------------------------------------------------------------+\n", + "| prediction|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "|[1.7042673E-4, 3.267522E-4, 7.581915E-5, 1.9806583E-4, 6.629557E-5, 4.2843417E-4, 1.31030665E-5, 5.2828378E-5, 2.3425...|\n", + "|[7.658893E-5, 5.898446E-4, 1.3134143E-4, 1.7956285E-4, 1.2959713E-4, 2.2623697E-4, 5.0602717E-5, 2.387755E-4, 3.85566...|\n", + "|[2.3643051E-5, 3.3990925E-4, 1.8499317E-4, 1.6320233E-4, 1.4257104E-4, 8.804509E-5, 2.6084534E-5, 2.3692146E-4, 1.479...|\n", + "|[7.265595E-5, 2.660495E-4, 1.2043192E-4, 2.0687138E-4, 8.6514396E-5, 2.2079627E-4, 1.3474356E-5, 8.564823E-5, 1.47982...|\n", + "|[5.583156E-5, 2.5246604E-4, 1.3152408E-4, 1.5752943E-4, 8.486259E-5, 2.1114835E-4, 9.902404E-6, 1.6352077E-4, 1.25058...|\n", + "|[1.1620977E-4, 2.9887763E-4, 9.283447E-5, 1.6428927E-4, 6.8689915E-5, 4.8077543E-4, 8.824636E-6, 5.926726E-5, 1.70530...|\n", + "|[1.1755548E-4, 2.1347901E-4, 5.9497E-5, 1.1462011E-4, 5.154583E-5, 4.378169E-4, 4.606332E-6, 3.3860095E-5, 8.858123E-...|\n", + "|[1.0416699E-4, 2.7650507E-4, 9.4154115E-5, 1.6408198E-4, 7.396577E-5, 4.2134034E-4, 8.686047E-6, 5.308059E-5, 1.27552...|\n", + "|[7.3212854E-5, 3.3290745E-4, 7.060745E-5, 1.7570716E-4, 7.5938726E-5, 2.7863326E-4, 1.5730891E-5, 7.8610516E-5, 1.641...|\n", + "|[5.3438263E-5, 3.4120653E-4, 4.2561773E-5, 6.7946996E-5, 4.2590156E-5, 3.6005717E-4, 4.079908E-6, 1.1698964E-4, 1.331...|\n", + "|[1.6286886E-5, 3.0098078E-4, 1.0513259E-4, 1.0939782E-4, 6.222565E-5, 8.1393446E-5, 8.843026E-6, 1.9695786E-4, 9.9110...|\n", + "|[2.4522765E-4, 5.1859417E-4, 1.7468519E-4, 2.262611E-4, 1.2124745E-4, 4.519367E-4, 3.961034E-5, 7.9740654E-5, 3.36356...|\n", + "|[8.990819E-5, 3.942771E-4, 1.682308E-4, 1.9284713E-4, 1.1525641E-4, 2.0554545E-4, 2.831427E-5, 1.4873769E-4, 3.316071...|\n", + "|[8.54337E-6, 3.4811173E-4, 5.7887002E-5, 4.8874565E-5, 5.402399E-5, 4.112481E-5, 1.4895271E-5, 6.21633E-4, 2.3461927E...|\n", + "|[2.1293292E-5, 2.3748633E-4, 9.990328E-5, 7.8908284E-5, 7.079569E-5, 1.2173247E-4, 7.88914E-6, 2.6103947E-4, 1.563249...|\n", + "|[8.190444E-5, 3.168154E-4, 1.590983E-4, 2.3166533E-4, 9.556332E-5, 1.9129038E-4, 1.7210512E-5, 9.8816345E-5, 1.854863...|\n", + "|[6.291183E-5, 2.6241466E-4, 1.054902E-4, 2.0039888E-4, 6.793013E-5, 2.0695888E-4, 1.1183583E-5, 8.1747305E-5, 1.71265...|\n", + "|[1.5287477E-4, 3.303019E-4, 7.293286E-5, 1.3093611E-4, 6.1460145E-5, 3.5471437E-4, 1.069333E-5, 6.7022884E-5, 2.26818...|\n", + "|[7.34195E-5, 3.2822473E-4, 1.6043369E-4, 1.9740193E-4, 1.036919E-4, 2.0666287E-4, 1.9626465E-5, 1.2458269E-4, 1.46395...|\n", + "|[5.8976515E-5, 3.6673344E-4, 9.322759E-5, 1.222245E-4, 7.065327E-5, 2.5420502E-4, 1.145865E-5, 2.2733102E-4, 2.255583...|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "only showing top 20 rows\n", + "\n", + "CPU times: user 18.5 ms, sys: 11.6 ms, total: 30.1 ms\n", + "Wall time: 6.85 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "# first pass caches model/fn\n", + "predictions = df.select(classify(struct(\"data\")).alias(\"prediction\"))\n", + "predictions.show(truncate=120)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "5f66d468-e0b1-4589-8606-b3848063a823", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 20:===========================================> (3 + 1) / 4]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------------------------------------------------------------------------------------------------------------------+\n", + "| prediction|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "|[1.7042673E-4, 3.267522E-4, 7.581915E-5, 1.9806583E-4, 6.629557E-5, 4.2843417E-4, 1.31030665E-5, 5.2828378E-5, 2.3425...|\n", + "|[7.658893E-5, 5.898446E-4, 1.3134143E-4, 1.7956285E-4, 1.2959713E-4, 2.2623697E-4, 5.0602717E-5, 2.387755E-4, 3.85566...|\n", + "|[2.3643051E-5, 3.3990925E-4, 1.8499317E-4, 1.6320233E-4, 1.4257104E-4, 8.804509E-5, 2.6084534E-5, 2.3692146E-4, 1.479...|\n", + "|[7.265595E-5, 2.660495E-4, 1.2043192E-4, 2.0687138E-4, 8.6514396E-5, 2.2079627E-4, 1.3474356E-5, 8.564823E-5, 1.47982...|\n", + "|[5.583156E-5, 2.5246604E-4, 1.3152408E-4, 1.5752943E-4, 8.486259E-5, 2.1114835E-4, 9.902404E-6, 1.6352077E-4, 1.25058...|\n", + "|[1.1620977E-4, 2.9887763E-4, 9.283447E-5, 1.6428927E-4, 6.8689915E-5, 4.8077543E-4, 8.824636E-6, 5.926726E-5, 1.70530...|\n", + "|[1.1755548E-4, 2.1347901E-4, 5.9497E-5, 1.1462011E-4, 5.154583E-5, 4.378169E-4, 4.606332E-6, 3.3860095E-5, 8.858123E-...|\n", + "|[1.0416699E-4, 2.7650507E-4, 9.4154115E-5, 1.6408198E-4, 7.396577E-5, 4.2134034E-4, 8.686047E-6, 5.308059E-5, 1.27552...|\n", + "|[7.3212854E-5, 3.3290745E-4, 7.060745E-5, 1.7570716E-4, 7.5938726E-5, 2.7863326E-4, 1.5730891E-5, 7.8610516E-5, 1.641...|\n", + "|[5.3438263E-5, 3.4120653E-4, 4.2561773E-5, 6.7946996E-5, 4.2590156E-5, 3.6005717E-4, 4.079908E-6, 1.1698964E-4, 1.331...|\n", + "|[1.6286886E-5, 3.0098078E-4, 1.0513259E-4, 1.0939782E-4, 6.222565E-5, 8.1393446E-5, 8.843026E-6, 1.9695786E-4, 9.9110...|\n", + "|[2.4522765E-4, 5.1859417E-4, 1.7468519E-4, 2.262611E-4, 1.2124745E-4, 4.519367E-4, 3.961034E-5, 7.9740654E-5, 3.36356...|\n", + "|[8.990819E-5, 3.942771E-4, 1.682308E-4, 1.9284713E-4, 1.1525641E-4, 2.0554545E-4, 2.831427E-5, 1.4873769E-4, 3.316071...|\n", + "|[8.54337E-6, 3.4811173E-4, 5.7887002E-5, 4.8874565E-5, 5.402399E-5, 4.112481E-5, 1.4895271E-5, 6.21633E-4, 2.3461927E...|\n", + "|[2.1293292E-5, 2.3748633E-4, 9.990328E-5, 7.8908284E-5, 7.079569E-5, 1.2173247E-4, 7.88914E-6, 2.6103947E-4, 1.563249...|\n", + "|[8.190444E-5, 3.168154E-4, 1.590983E-4, 2.3166533E-4, 9.556332E-5, 1.9129038E-4, 1.7210512E-5, 9.8816345E-5, 1.854863...|\n", + "|[6.291183E-5, 2.6241466E-4, 1.054902E-4, 2.0039888E-4, 6.793013E-5, 2.0695888E-4, 1.1183583E-5, 8.1747305E-5, 1.71265...|\n", + "|[1.5287477E-4, 3.303019E-4, 7.293286E-5, 1.3093611E-4, 6.1460145E-5, 3.5471437E-4, 1.069333E-5, 6.7022884E-5, 2.26818...|\n", + "|[7.34195E-5, 3.2822473E-4, 1.6043369E-4, 1.9740193E-4, 1.036919E-4, 2.0666287E-4, 1.9626465E-5, 1.2458269E-4, 1.46395...|\n", + "|[5.8976515E-5, 3.6673344E-4, 9.322759E-5, 1.222245E-4, 7.065327E-5, 2.5420502E-4, 1.145865E-5, 2.2733102E-4, 2.255583...|\n", + "+------------------------------------------------------------------------------------------------------------------------+\n", + "only showing top 20 rows\n", + "\n", + "CPU times: user 5.48 ms, sys: 4.51 ms, total: 9.99 ms\n", + "Wall time: 3.9 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "predictions = df.select(classify(\"data\").alias(\"prediction\"))\n", + "predictions.show(truncate=120)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "632c4c3a-fa52-4c3d-b71e-7526286e353a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 21:==================================================> (7 + 1) / 8]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 18.8 ms, sys: 6.13 ms, total: 25 ms\n", + "Wall time: 22.2 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "%%time\n", + "predictions = df.select(classify(col(\"data\")).alias(\"prediction\"))\n", + "predictions.write.mode(\"overwrite\").parquet(output_file_path + \"_2\")" + ] + }, + { + "cell_type": "markdown", + "id": "4dc06b7e-f750-40b5-9208-a035db11d937", + "metadata": { + "tags": [] + }, + "source": [ + "#### Stop Triton Server on each executor" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "bbfcaa51-3b9f-43ff-a4a8-4b46766115b8", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "[True]" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def stop_triton(it):\n", + " import docker\n", + " import time\n", + " \n", + " client=docker.from_env()\n", + " containers=client.containers.list(filters={\"name\": \"spark-triton\"})\n", + " print(\">>>> stopping containers: {}\".format([c.short_id for c in containers]))\n", + " if containers:\n", + " container=containers[0]\n", + " container.stop(timeout=120)\n", + "\n", + " return [True]\n", + "\n", + "nodeRDD.barrier().mapPartitions(stop_triton).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "0d88639b-d934-4eb4-ae2f-cc13b9b10456", + "metadata": {}, + "outputs": [], + "source": [ + "spark.stop()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "df8cc28a-34d7-479c-be7e-9a380d39e25e", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/feature_columns/1/model.py b/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/feature_columns/1/model.py new file mode 100644 index 000000000..aa251e3d0 --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/feature_columns/1/model.py @@ -0,0 +1,162 @@ +# Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of NVIDIA CORPORATION nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import numpy as np +import json +import tensorflow as tf + +# triton_python_backend_utils is available in every Triton Python model. You +# need to use this module to create inference requests and responses. It also +# contains some utility functions for extracting information from model_config +# and converting Triton input/output types to numpy types. +import triton_python_backend_utils as pb_utils + + +class TritonPythonModel: + """Your Python model must use the same class name. Every Python model + that is created must have "TritonPythonModel" as the class name. + """ + + def initialize(self, args): + """`initialize` is called only once when the model is being loaded. + Implementing `initialize` function is optional. This function allows + the model to intialize any state associated with this model. + + Parameters + ---------- + args : dict + Both keys and values are strings. The dictionary keys and values are: + * model_config: A JSON string containing the model configuration + * model_instance_kind: A string containing model instance kind + * model_instance_device_id: A string containing model instance device ID + * model_repository: Model repository path + * model_version: Model version + * model_name: Model name + """ + print("tf: {}".format(tf.__version__)) + gpus = tf.config.list_physical_devices('GPU') + if gpus: + try: + # Currently, memory growth needs to be the same across GPUs + for gpu in gpus: + tf.config.experimental.set_memory_growth(gpu, True) + logical_gpus = tf.config.list_logical_devices('GPU') + print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs") + except RuntimeError as e: + # Memory growth must be set before GPUs have been initialized + print(e) + + self.model = tf.keras.models.load_model("/my_pet_classifier") + + # You must parse model_config. JSON string is not parsed here + self.model_config = model_config = json.loads(args['model_config']) + + # Get output configuration + pred_config = pb_utils.get_output_config_by_name(model_config, "pred") + + # Convert Triton types to numpy types + self.pred_dtype = pb_utils.triton_string_to_numpy(pred_config['data_type']) + + def execute(self, requests): + """`execute` MUST be implemented in every Python model. `execute` + function receives a list of pb_utils.InferenceRequest as the only + argument. This function is called when an inference request is made + for this model. Depending on the batching configuration (e.g. Dynamic + Batching) used, `requests` may contain multiple requests. Every + Python model, must create one pb_utils.InferenceResponse for every + pb_utils.InferenceRequest in `requests`. If there is an error, you can + set the error argument when creating a pb_utils.InferenceResponse + + Parameters + ---------- + requests : list + A list of pb_utils.InferenceRequest + + Returns + ------- + list + A list of pb_utils.InferenceResponse. The length of this list must + be the same as `requests` + """ + + pred_dtype = self.pred_dtype + + responses = [] + + def decode(input_tensor): + return tf.convert_to_tensor([[s[0].decode('utf-8')] for s in input_tensor.as_numpy()]) + + def identity(input_tensor): + return tf.convert_to_tensor(input_tensor.as_numpy()) + + input_transforms = { + "Type": decode, + "Age": identity, + "Breed1": decode, + "Gender": decode, + "Color1": decode, + "Color2": decode, + "MaturitySize": decode, + "FurLength": decode, + "Vaccinated": decode, + "Sterilized": decode, + "Health": decode, + "Fee": identity, + "PhotoAmt": identity + } + + # Every Python backend must iterate over everyone of the requests + # and create a pb_utils.InferenceResponse for each of them. + for request in requests: + # Get input numpy + inputs = {name: transform(pb_utils.get_input_tensor_by_name(request, name)) for name, transform in input_transforms.items()} + + pred = self.model.predict(inputs) + + # Create output tensors. You need pb_utils.Tensor + # objects to create pb_utils.InferenceResponse. + pred_tensor = pb_utils.Tensor("pred", np.squeeze(pred).astype(pred_dtype)) + + # Create InferenceResponse. You can set an error here in case + # there was a problem with handling this inference request. + # Below is an example of how you can set errors in inference + # response: + # + # pb_utils.InferenceResponse( + # output_tensors=..., TritonError("An error occured")) + inference_response = pb_utils.InferenceResponse(output_tensors=[pred_tensor]) + responses.append(inference_response) + + # You should return a list of pb_utils.InferenceResponse. Length + # of this list must match the length of `requests` list. + return responses + + def finalize(self): + """`finalize` is called only once when the model is being unloaded. + Implementing `finalize` function is OPTIONAL. This function allows + the model to perform any necessary clean ups before exit. + """ + print('Cleaning up...') diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/feature_columns/config.pbtxt b/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/feature_columns/config.pbtxt new file mode 100644 index 000000000..93a7cf045 --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/feature_columns/config.pbtxt @@ -0,0 +1,111 @@ +# Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of NVIDIA CORPORATION nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +name: "feature_columns" +backend: "python" +max_batch_size: 8192 + +input [ + { + name: "Type" + data_type: TYPE_STRING + dims: [1] + }, + { + name: "Age" + data_type: TYPE_INT64 + dims: [1] + }, + { + name: "Breed1" + data_type: TYPE_STRING + dims: [1] + }, + { + name: "Gender" + data_type: TYPE_STRING + dims: [1] + }, + { + name: "Color1" + data_type: TYPE_STRING + dims: [1] + }, + { + name: "Color2" + data_type: TYPE_STRING + dims: [1] + }, + { + name: "MaturitySize" + data_type: TYPE_STRING + dims: [1] + }, + { + name: "FurLength" + data_type: TYPE_STRING + dims: [1] + }, + { + name: "Vaccinated" + data_type: TYPE_STRING + dims: [1] + }, + { + name: "Sterilized" + data_type: TYPE_STRING + dims: [1] + }, + { + name: "Health" + data_type: TYPE_STRING + dims: [1] + }, + { + name: "Fee" + data_type: TYPE_FP32 + dims: [1] + }, + { + name: "PhotoAmt" + data_type: TYPE_FP32 + dims: [1] + } +] +output [ + { + name: "pred" + data_type: TYPE_FP32 + dims: [1] + } +] + +instance_group [{ kind: KIND_GPU }] + +parameters: { + key: "EXECUTION_ENV_PATH", + value: {string_value: "$$TRITON_MODEL_DIRECTORY/../tf-gpu.tar.gz"} +} diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/mnist_model/config.pbtxt b/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/mnist_model/config.pbtxt new file mode 100644 index 000000000..76a1437eb --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/mnist_model/config.pbtxt @@ -0,0 +1,3 @@ +platform: "tensorflow_savedmodel" +max_batch_size: 8192 + diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/resnet50/config.pbtxt b/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/resnet50/config.pbtxt new file mode 100644 index 000000000..76a1437eb --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/resnet50/config.pbtxt @@ -0,0 +1,3 @@ +platform: "tensorflow_savedmodel" +max_batch_size: 8192 + diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/text_classification/1/model.py b/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/text_classification/1/model.py new file mode 100644 index 000000000..50afea521 --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/text_classification/1/model.py @@ -0,0 +1,158 @@ +# Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of NVIDIA CORPORATION nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import numpy as np +import json + +# triton_python_backend_utils is available in every Triton Python model. You +# need to use this module to create inference requests and responses. It also +# contains some utility functions for extracting information from model_config +# and converting Triton input/output types to numpy types. +import triton_python_backend_utils as pb_utils + + +class TritonPythonModel: + """Your Python model must use the same class name. Every Python model + that is created must have "TritonPythonModel" as the class name. + """ + + def initialize(self, args): + """`initialize` is called only once when the model is being loaded. + Implementing `initialize` function is optional. This function allows + the model to intialize any state associated with this model. + + Parameters + ---------- + args : dict + Both keys and values are strings. The dictionary keys and values are: + * model_config: A JSON string containing the model configuration + * model_instance_kind: A string containing model instance kind + * model_instance_device_id: A string containing model instance device ID + * model_repository: Model repository path + * model_version: Model version + * model_name: Model name + """ + import re + import string + import tensorflow as tf + from tensorflow.keras import layers + + print("tf: {}".format(tf.__version__)) + + def custom_standardization(input_data): + lowercase = tf.strings.lower(input_data) + stripped_html = tf.strings.regex_replace(lowercase, "
", " ") + return tf.strings.regex_replace( + stripped_html, "[%s]" % re.escape(string.punctuation), "" + ) + + max_features = 10000 + sequence_length = 250 + + vectorize_layer = layers.TextVectorization( + standardize=custom_standardization, + max_tokens=max_features, + output_mode="int", + output_sequence_length=sequence_length, + ) + + custom_objects = {"vectorize_layer": vectorize_layer, + "custom_standardization": custom_standardization} + with tf.keras.utils.custom_object_scope(custom_objects): + self.model = tf.keras.models.load_model( + "/text_model" + ) + + # You must parse model_config. JSON string is not parsed here + self.model_config = model_config = json.loads(args['model_config']) + + # Get output configuration + pred_config = pb_utils.get_output_config_by_name(model_config, "pred") + + # Convert Triton types to numpy types + self.pred_dtype = pb_utils.triton_string_to_numpy(pred_config['data_type']) + + def execute(self, requests): + """`execute` MUST be implemented in every Python model. `execute` + function receives a list of pb_utils.InferenceRequest as the only + argument. This function is called when an inference request is made + for this model. Depending on the batching configuration (e.g. Dynamic + Batching) used, `requests` may contain multiple requests. Every + Python model, must create one pb_utils.InferenceResponse for every + pb_utils.InferenceRequest in `requests`. If there is an error, you can + set the error argument when creating a pb_utils.InferenceResponse + + Parameters + ---------- + requests : list + A list of pb_utils.InferenceRequest + + Returns + ------- + list + A list of pb_utils.InferenceResponse. The length of this list must + be the same as `requests` + """ + + pred_dtype = self.pred_dtype + + responses = [] + + # Every Python backend must iterate over everyone of the requests + # and create a pb_utils.InferenceResponse for each of them. + for request in requests: + # Get input numpy + sentence_input = pb_utils.get_input_tensor_by_name(request, "sentence") + sentences = list(sentence_input.as_numpy()) + sentences = np.squeeze(sentences).tolist() + sentences = [s.decode('utf-8') for s in sentences] + + pred = self.model.predict(sentences) + + # Create output tensors. You need pb_utils.Tensor + # objects to create pb_utils.InferenceResponse. + pred_tensor = pb_utils.Tensor("pred", pred.astype(pred_dtype)) + + # Create InferenceResponse. You can set an error here in case + # there was a problem with handling this inference request. + # Below is an example of how you can set errors in inference + # response: + # + # pb_utils.InferenceResponse( + # output_tensors=..., TritonError("An error occured")) + inference_response = pb_utils.InferenceResponse(output_tensors=[pred_tensor]) + responses.append(inference_response) + + # You should return a list of pb_utils.InferenceResponse. Length + # of this list must match the length of `requests` list. + return responses + + def finalize(self): + """`finalize` is called only once when the model is being unloaded. + Implementing `finalize` function is OPTIONAL. This function allows + the model to perform any necessary clean ups before exit. + """ + print('Cleaning up...') diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/text_classification/config.pbtxt b/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/text_classification/config.pbtxt new file mode 100644 index 000000000..44b21bf39 --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/models_config/text_classification/config.pbtxt @@ -0,0 +1,51 @@ +# Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of NVIDIA CORPORATION nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +name: "text_classification" +backend: "python" +max_batch_size: 8192 + +input [ + { + name: "sentence" + data_type: TYPE_STRING + dims: [1] + } +] +output [ + { + name: "pred" + data_type: TYPE_FP32 + dims: [1] + } +] + +instance_group [{ kind: KIND_GPU }] + +parameters: { + key: "EXECUTION_ENV_PATH", + value: {string_value: "$$TRITON_MODEL_DIRECTORY/../tf-gpu.tar.gz"} +} diff --git a/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/text_classification.ipynb b/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/text_classification.ipynb new file mode 100644 index 000000000..ed1289b11 --- /dev/null +++ b/examples/ML+DL-Examples/Spark-DL/dl_inference/tensorflow/text_classification.ipynb @@ -0,0 +1,1638 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2cd2accf-5877-4136-a243-7a33a13ce2b4", + "metadata": {}, + "source": [ + "# Pyspark TensorFlow Inference\n", + "\n", + "## Text classification\n", + "Based on: https://www.tensorflow.org/tutorials/keras/text_classification" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "76f0f5df-502f-444e-b2ee-1122e1dea870", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import re\n", + "import shutil\n", + "import string\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import tensorflow as tf\n", + "from tensorflow.keras import layers, losses" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a364ad5f-b269-45b5-ab8b-d8f34fb642b7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.12.0\n" + ] + } + ], + "source": [ + "print(tf.__version__)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "d229c1b6-3967-46b5-9ea8-68f4b42dd211", + "metadata": {}, + "outputs": [], + "source": [ + "url = \"https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz\"\n", + "\n", + "dataset = tf.keras.utils.get_file(\n", + " \"aclImdb_v1\", url, untar=True, cache_dir=\".\", cache_subdir=\"\"\n", + ")\n", + "\n", + "dataset_dir = os.path.join(os.path.dirname(dataset), \"aclImdb\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "1f8038ae-8bc1-46bf-ae4c-6da08886c473", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['imdbEr.txt', 'imdb.vocab', 'train', 'test', 'README']" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "os.listdir(dataset_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "12faaa3f-3441-4361-b9eb-4317e8c2c2f7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['urls_unsup.txt',\n", + " 'neg',\n", + " 'unsupBow.feat',\n", + " 'unsup',\n", + " 'urls_pos.txt',\n", + " 'urls_neg.txt',\n", + " 'labeledBow.feat',\n", + " 'pos']" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train_dir = os.path.join(dataset_dir, \"train\")\n", + "os.listdir(train_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "152cc0cc-65d0-4e17-9ee8-222390df45b5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Rachel Griffiths writes and directs this award winning short film. A heartwarming story about coping with grief and cherishing the memory of those we've loved and lost. Although, only 15 minutes long, Griffiths manages to capture so much emotion and truth onto film in the short space of time. Bud Tingwell gives a touching performance as Will, a widower struggling to cope with his wife's death. Will is confronted by the harsh reality of loneliness and helplessness as he proceeds to take care of Ruth's pet cow, Tulip. The film displays the grief and responsibility one feels for those they have loved and lost. Good cinematography, great direction, and superbly acted. It will bring tears to all those who have lost a loved one, and survived.\n" + ] + } + ], + "source": [ + "sample_file = os.path.join(train_dir, \"pos/1181_9.txt\")\n", + "with open(sample_file) as f:\n", + " print(f.read())" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "b2277f58-78c8-4a12-bc98-5103e7c81a35", + "metadata": {}, + "outputs": [], + "source": [ + "remove_dir = os.path.join(train_dir, \"unsup\")\n", + "shutil.rmtree(remove_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "ed83de92-ebb3-4170-b2bf-25265c6a6942", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 25000 files belonging to 2 classes.\n", + "Using 20000 files for training.\n" + ] + } + ], + "source": [ + "batch_size = 32\n", + "seed = 42\n", + "\n", + "raw_train_ds = tf.keras.utils.text_dataset_from_directory(\n", + " \"aclImdb/train\",\n", + " batch_size=batch_size,\n", + " validation_split=0.2,\n", + " subset=\"training\",\n", + " seed=seed,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "57c30568-daa8-4b2b-b30a-577c984a8af5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Review b'\"Pandemonium\" is a horror movie spoof that comes off more stupid than funny. Believe me when I tell you, I love comedies. Especially comedy spoofs. \"Airplane\", \"The Naked Gun\" trilogy, \"Blazing Saddles\", \"High Anxiety\", and \"Spaceballs\" are some of my favorite comedies that spoof a particular genre. \"Pandemonium\" is not up there with those films. Most of the scenes in this movie had me sitting there in stunned silence because the movie wasn\\'t all that funny. There are a few laughs in the film, but when you watch a comedy, you expect to laugh a lot more than a few times and that\\'s all this film has going for it. Geez, \"Scream\" had more laughs than this film and that was more of a horror film. How bizarre is that?

*1/2 (out of four)'\n", + "Label 0\n", + "Review b\"David Mamet is a very interesting and a very un-equal director. His first movie 'House of Games' was the one I liked best, and it set a series of films with characters whose perspective of life changes as they get into complicated situations, and so does the perspective of the viewer.

So is 'Homicide' which from the title tries to set the mind of the viewer to the usual crime drama. The principal characters are two cops, one Jewish and one Irish who deal with a racially charged area. The murder of an old Jewish shop owner who proves to be an ancient veteran of the Israeli Independence war triggers the Jewish identity in the mind and heart of the Jewish detective.

This is were the flaws of the film are the more obvious. The process of awakening is theatrical and hard to believe, the group of Jewish militants is operatic, and the way the detective eventually walks to the final violent confrontation is pathetic. The end of the film itself is Mamet-like smart, but disappoints from a human emotional perspective.

Joe Mantegna and William Macy give strong performances, but the flaws of the story are too evident to be easily compensated.\"\n", + "Label 0\n", + "Review b'Great documentary about the lives of NY firefighters during the worst terrorist attack of all time.. That reason alone is why this should be a must see collectors item.. What shocked me was not only the attacks, but the\"High Fat Diet\" and physical appearance of some of these firefighters. I think a lot of Doctors would agree with me that,in the physical shape they were in, some of these firefighters would NOT of made it to the 79th floor carrying over 60 lbs of gear. Having said that i now have a greater respect for firefighters and i realize becoming a firefighter is a life altering job. The French have a history of making great documentary\\'s and that is what this is, a Great Documentary.....'\n", + "Label 1\n" + ] + } + ], + "source": [ + "for text_batch, label_batch in raw_train_ds.take(1):\n", + " for i in range(3):\n", + " print(\"Review\", text_batch.numpy()[i])\n", + " print(\"Label\", label_batch.numpy()[i])" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "1e863eb6-4bd7-4da0-b10d-d951b5ee52bd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Label 0 corresponds to neg\n", + "Label 1 corresponds to pos\n" + ] + } + ], + "source": [ + "print(\"Label 0 corresponds to\", raw_train_ds.class_names[0])\n", + "print(\"Label 1 corresponds to\", raw_train_ds.class_names[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "1593e2e5-df51-4fbf-b4be-c786e740ddab", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 25000 files belonging to 2 classes.\n", + "Using 5000 files for validation.\n" + ] + } + ], + "source": [ + "raw_val_ds = tf.keras.utils.text_dataset_from_directory(\n", + " \"aclImdb/train\",\n", + " batch_size=batch_size,\n", + " validation_split=0.2,\n", + " subset=\"validation\",\n", + " seed=seed,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "944fd61d-3926-4296-889a-b2a375a1b039", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 25000 files belonging to 2 classes.\n" + ] + } + ], + "source": [ + "raw_test_ds = tf.keras.utils.text_dataset_from_directory(\n", + " \"aclImdb/test\", batch_size=batch_size\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "cb141709-fcc1-4cee-bc98-9c89aaba8648", + "metadata": {}, + "outputs": [], + "source": [ + "def custom_standardization(input_data):\n", + " lowercase = tf.strings.lower(input_data)\n", + " stripped_html = tf.strings.regex_replace(lowercase, \"
\", \" \")\n", + " return tf.strings.regex_replace(\n", + " stripped_html, \"[%s]\" % re.escape(string.punctuation), \"\"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "d4e80ea9-536a-4ebc-8b35-1eca73dbba7d", + "metadata": {}, + "outputs": [], + "source": [ + "max_features = 10000\n", + "sequence_length = 250\n", + "\n", + "vectorize_layer = layers.TextVectorization(\n", + " standardize=custom_standardization,\n", + " max_tokens=max_features,\n", + " output_mode=\"int\",\n", + " output_sequence_length=sequence_length,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "ad1e5d81-7dae-4b08-b520-ca45501b9510", + "metadata": {}, + "outputs": [], + "source": [ + "# Make a text-only dataset (without labels), then call adapt\n", + "train_text = raw_train_ds.map(lambda x, y: x)\n", + "vectorize_layer.adapt(train_text)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "80f243f5-edd3-4e1c-bddc-abc1cc6673ef", + "metadata": {}, + "outputs": [], + "source": [ + "def vectorize_text(text, label):\n", + " text = tf.expand_dims(text, -1)\n", + " return vectorize_layer(text), label" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "8f37e95c-515c-4edb-a1ee-fc47be5df4b9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Review tf.Tensor(b'Great movie - especially the music - Etta James - \"At Last\". This speaks volumes when you have finally found that special someone.', shape=(), dtype=string)\n", + "Label neg\n", + "Vectorized review (, )\n" + ] + } + ], + "source": [ + "# retrieve a batch (of 32 reviews and labels) from the dataset\n", + "text_batch, label_batch = next(iter(raw_train_ds))\n", + "first_review, first_label = text_batch[0], label_batch[0]\n", + "print(\"Review\", first_review)\n", + "print(\"Label\", raw_train_ds.class_names[first_label])\n", + "print(\"Vectorized review\", vectorize_text(first_review, first_label))" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "60c9208a-39ac-4e6c-a603-61038cdf3d10", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1287 ---> silent\n", + " 313 ---> night\n", + "Vocabulary size: 10000\n" + ] + } + ], + "source": [ + "print(\"1287 ---> \",vectorize_layer.get_vocabulary()[1287])\n", + "print(\" 313 ---> \",vectorize_layer.get_vocabulary()[313])\n", + "print('Vocabulary size: {}'.format(len(vectorize_layer.get_vocabulary())))" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "3cf90d4b-8dae-44b2-b32b-80cb0092c430", + "metadata": {}, + "outputs": [], + "source": [ + "train_ds = raw_train_ds.map(vectorize_text)\n", + "val_ds = raw_val_ds.map(vectorize_text)\n", + "test_ds = raw_test_ds.map(vectorize_text)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "115a5aba-8a00-458f-be25-0aae9f55de22", + "metadata": {}, + "outputs": [], + "source": [ + "AUTOTUNE = tf.data.AUTOTUNE\n", + "\n", + "train_ds = train_ds.cache().prefetch(buffer_size=AUTOTUNE)\n", + "val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)\n", + "test_ds = test_ds.cache().prefetch(buffer_size=AUTOTUNE)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "d64f4495-102d-4244-9b42-1ba9976a366e", + "metadata": {}, + "outputs": [], + "source": [ + "embedding_dim = 16" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "3dc95d22-935f-4091-b0ee-da95174eb9a0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " embedding (Embedding) (None, None, 16) 160016 \n", + " \n", + " dropout (Dropout) (None, None, 16) 0 \n", + " \n", + " global_average_pooling1d (G (None, 16) 0 \n", + " lobalAveragePooling1D) \n", + " \n", + " dropout_1 (Dropout) (None, 16) 0 \n", + " \n", + " dense (Dense) (None, 1) 17 \n", + " \n", + "=================================================================\n", + "Total params: 160,033\n", + "Trainable params: 160,033\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model = tf.keras.Sequential([\n", + " layers.Embedding(max_features + 1, embedding_dim),\n", + " layers.Dropout(0.2),\n", + " layers.GlobalAveragePooling1D(),\n", + " layers.Dropout(0.2),\n", + " layers.Dense(1)])\n", + "\n", + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "d9059b93-7666-46db-bf15-517c4c205df9", + "metadata": {}, + "outputs": [], + "source": [ + "model.compile(loss=losses.BinaryCrossentropy(from_logits=True),\n", + " optimizer='adam',\n", + " metrics=tf.metrics.BinaryAccuracy(threshold=0.0))" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "b1d5959f-1bd8-48da-9815-8239599519b2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/10\n", + "625/625 [==============================] - 5s 7ms/step - loss: 0.6647 - binary_accuracy: 0.6946 - val_loss: 0.6154 - val_binary_accuracy: 0.7736\n", + "Epoch 2/10\n", + "625/625 [==============================] - 4s 7ms/step - loss: 0.5483 - binary_accuracy: 0.8021 - val_loss: 0.4979 - val_binary_accuracy: 0.8232\n", + "Epoch 3/10\n", + "625/625 [==============================] - 4s 7ms/step - loss: 0.4444 - binary_accuracy: 0.8442 - val_loss: 0.4200 - val_binary_accuracy: 0.8468\n", + "Epoch 4/10\n", + "625/625 [==============================] - 4s 7ms/step - loss: 0.3781 - binary_accuracy: 0.8654 - val_loss: 0.3738 - val_binary_accuracy: 0.8598\n", + "Epoch 5/10\n", + "625/625 [==============================] - 4s 7ms/step - loss: 0.3351 - binary_accuracy: 0.8786 - val_loss: 0.3447 - val_binary_accuracy: 0.8674\n", + "Epoch 6/10\n", + "625/625 [==============================] - 4s 7ms/step - loss: 0.3054 - binary_accuracy: 0.8877 - val_loss: 0.3261 - val_binary_accuracy: 0.8704\n", + "Epoch 7/10\n", + "625/625 [==============================] - 4s 7ms/step - loss: 0.2802 - binary_accuracy: 0.8977 - val_loss: 0.3128 - val_binary_accuracy: 0.8734\n", + "Epoch 8/10\n", + "625/625 [==============================] - 4s 7ms/step - loss: 0.2616 - binary_accuracy: 0.9056 - val_loss: 0.3031 - val_binary_accuracy: 0.8756\n", + "Epoch 9/10\n", + "625/625 [==============================] - 4s 7ms/step - loss: 0.2461 - binary_accuracy: 0.9111 - val_loss: 0.2965 - val_binary_accuracy: 0.8778\n", + "Epoch 10/10\n", + "625/625 [==============================] - 4s 7ms/step - loss: 0.2309 - binary_accuracy: 0.9170 - val_loss: 0.2918 - val_binary_accuracy: 0.8794\n" + ] + } + ], + "source": [ + "epochs = 10\n", + "history = model.fit(\n", + " train_ds,\n", + " validation_data=val_ds,\n", + " epochs=epochs)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "656afe07-354f-4ff2-8e3e-d02bad6c5958", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "782/782 [==============================] - 3s 3ms/step - loss: 0.3103 - binary_accuracy: 0.8737\n", + "Loss: 0.3103351294994354\n", + "Accuracy: 0.8736799955368042\n" + ] + } + ], + "source": [ + "loss, accuracy = model.evaluate(test_ds)\n", + "\n", + "print(\"Loss: \", loss)\n", + "print(\"Accuracy: \", accuracy)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "a01d0f13-d0b8-4d78-9ddc-ede5ed402446", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys(['loss', 'binary_accuracy', 'val_loss', 'val_binary_accuracy'])" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "history_dict = history.history\n", + "history_dict.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "1f7484c3-3cdf-46d5-b95d-80316f0e6240", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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uHAhdevWpUaNGuk+b7FixfD398+KEu8qJCQEHx+fHLlWXqVwIyIibuPRRx+lWLFiLFq0yGl/XFwcy5Yt45lnnuGvv/7iiSeeoESJEvj7+1O9enWWLFmS6nn/3i116NAhmjZtiq+vL1WrVmXDhg1J3jN06FAqVqyIv78/ZcuWZdSoUdy6dQuARYsWMW7cOH766SdsNhs2m81R89+7pfbt28f999+Pn58fRYoU4bnnniMuLs7xes+ePWnfvj1vvvkmoaGhFClShL59+zqulRbx8fGMHz+ekiVL4uPjQ61atVi7dq3j9Zs3b9KvXz9CQ0Px9fUlIiKCSZMmAWAYBmPHjqVUqVL4+PgQFhbGgAED0nztjNDyCyIikiUMA65eteba/v5gs939OC8vL7p3786iRYsYMWIEtv9/07Jly7Db7TzxxBPExcVRp04dhg4dSmBgIF999RVPPfUU5cqVo379+ne9Rnx8PB07diQ4OJj//ve/xMTEOI3PSVCgQAEWLVpEWFgY+/bto3fv3hQoUIB//etfREZG8ssvv7B27Vo2btwIQFBQUJJzXLlyhZYtW9KwYUN27drF2bNnefbZZ+nXr59TgNu8eTOhoaFs3ryZw4cPExkZSa1atejdu/fd/9KA6dOnM3XqVN59911q167NggULaNu2Lfv376dChQrMmDGDVatW8emnn1KqVClOnDjBiRMnAPjss894++23+eSTT6hWrRrR0dH89NNPabpuhhluJiYmxgCMmJgYq0sREcmzrl27Zvz666/GtWvXHPvi4gzDjDg5/4iLS3vtBw4cMABj8+bNjn1NmjQxunXrluJ7HnnkEePll192PG/WrJkxcOBAx/OIiAjj7bffNgzDMNatW2d4eXkZJ0+edLy+Zs0aAzBWrFiR4jWmTJli1KlTx/F8zJgxRs2aNZMcl/g88+bNMwoVKmTEJfoL+OqrrwwPDw8jOjraMAzD6NGjhxEREWHcvn3bcczjjz9uREZGpljL368dFhZmvPbaa07H1KtXz3jxxRcNwzCM/v37G/fff78RHx+f5FxTp041KlasaNy8eTPF6yVI7vcqQXq+v9UtJSIibqVy5co0atSIBQsWAHD48GG2bt3KM888A4DdbmfChAlUr16dwoULExAQwLp16zh+/Hiazn/gwAHCw8MJCwtz7GvYsGGS45YuXUrjxo0JCQkhICCAkSNHpvkaia9Vs2ZN8ufP79jXuHFj4uPjOXjwoGNftWrV8PT0dDwPDQ3l7NmzabpGbGwsp06donHjxk77GzduzIEDBwCz62vv3r1UqlSJAQMGsH79esdxjz/+ONeuXaNs2bL07t2bFStWcPv27XR9zvRSuBERkSzh7w9xcdY80juW95lnnuGzzz7j8uXLLFy4kHLlytGsWTMApkyZwvTp0xk6dCibN29m7969tGzZkps3b2bZ39WOHTvo2rUrDz/8MF9++SV79uxhxIgRWXqNxPLly+f03GazER8fn2Xnv/feezly5AgTJkzg2rVrdO7cmU6dOgHmauYHDx5k9uzZ+Pn58eKLL9K0adN0jflJL425ERGRLGGzQaIGhFytc+fODBw4kI8//pgPPviAPn36OMbfbNu2jXbt2tGtWzfAHEPz+++/U7Vq1TSdu0qVKpw4cYLTp08TGhoKwPfff+90zPbt24mIiGDEiBGOfceOHXM6xtvbG7vdftdrLVq0iCtXrjhab7Zt24aHhweVKlVKU713ExgYSFhYGNu2bXMEwITrJB6DFBgYSGRkJJGRkXTq1IlWrVpx4cIFChcujJ+fH23atKFNmzb07duXypUrs2/fPu69994sqfHvFG5ERMTtBAQEEBkZyfDhw4mNjaVnz56O1ypUqMDy5cvZvn07hQoV4q233uLMmTNpDjctWrSgYsWK9OjRgylTphAbG+sUYhKucfz4cT755BPq1avHV199xYoVK5yOKV26NEeOHGHv3r2ULFmSAgUKJLkFvGvXrowZM4YePXowduxYzp07R//+/XnqqacIDg7O2F9OMl555RXGjBlDuXLlqFWrFgsXLmTv3r189NFHALz11luEhoZSu3ZtPDw8WLZsGSEhIRQsWJBFixZht9tp0KAB/v7+fPjhh/j5+REREZFl9f2duqVERMQtPfPMM1y8eJGWLVs6jY8ZOXIk9957Ly1btqR58+aEhITQvn37NJ/Xw8ODFStWcO3aNerXr8+zzz7La6+95nRM27Zteemll+jXrx+1atVi+/btjBo1yumYxx57jFatWnHfffdRrFixZG9H9/f3Z926dVy4cIF69erRqVMnHnjgAWbNmpW+v4y7GDBgAIMHD+bll1+mevXqrF27llWrVlGhQgXAvPNr8uTJ1K1bl3r16nH06FFWr16Nh4cHBQsW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uWJ1aW5t165dvPvuu9SoUcPqUtzaxYsXady4Mfny5WPNmjX8+uuvTJ06lUKFClldmlt64403mDNnDrNmzeLAgQO88cYbTJ48mZkzZ1pdmlu4cuUKNWvW5J133kn29cmTJzNjxgzmzp3Lf//7X/Lnz0/Lli25fv16jtSnW8ElRefOnaN48eJ88803NG3a1Opy3FJcXBz33nsvs2fP5tVXX6VWrVpMmzbN6rLc0rBhw9i2bRtbt261uhQBHn30UYKDg3nvvfcc+x577DH8/Pz48MMPLazM/dhsNlasWEH79u0Bs9UmLCyMl19+mSFDhgAQExNDcHAwixYtokuXLtlek1puJEUxMTEAFC5c2OJK3Fffvn155JFHaNGihdWluL1Vq1ZRt25dHn/8cYoXL07t2rWZP3++1WW5rUaNGrFp0yZ+//13AH766Se+++47WrdubXFlcuTIEaKjo53+vxUUFESDBg3YsWNHjtTgdgtnStrEx8czaNAgGjduzD333GN1OW7pk08+Yffu3ezatcvqUgT4448/mDNnDoMHD+bf//43u3btYsCAAXh7e9OjRw+ry3M7w4YNIzY2lsqVK+Pp6Yndbue1116ja9euVpfm9qKjowEIDg522h8cHOx4Lbsp3Eiy+vbtyy+//MJ3331ndSlu6cSJEwwcOJANGzbg6+trdTmCGfjr1q3LxIkTAahduza//PILc+fOVbixwKeffspHH33Exx9/TLVq1di7dy+DBg0iLCxMPw9Rt5Qk1a9fP7788ks2b95MyZIlrS7HLf3444+cPXuWe++9Fy8vL7y8vPjmm2+YMWMGXl5e2O12q0t0O6GhoVStWtVpX5UqVTh+/LhFFbm3V155hWHDhtGlSxeqV6/OU089xUsvvcSkSZOsLs3thYSEAHDmzBmn/WfOnHG8lt0UbsTBMAz69evHihUr+PrrrylTpozVJbmtBx54gH379rF3717Ho27dunTt2pW9e/fi6elpdYlup3HjxkmmRvj999+JiIiwqCL3dvXqVTw8nL/CPD09iY+Pt6giSVCmTBlCQkLYtGmTY19sbCz//e9/adiwYY7UoG4pcejbty8ff/wxn3/+OQUKFHD0jQYFBeHn52dxde6lQIECScY65c+fnyJFimgMlEVeeuklGjVqxMSJE+ncuTM7d+5k3rx5zJs3z+rS3FKbNm147bXXKFWqFNWqVWPPnj289dZbPP3001aX5hbi4uI4fPiw4/mRI0fYu3cvhQsXplSpUgwaNIhXX32VChUqUKZMGUaNGkVYWJjjjqpsZ4j8PyDZx8KFC60uTQzDaNasmTFw4ECry3BrX3zxhXHPPfcYPj4+RuXKlY158+ZZXZLbio2NNQYOHGiUKlXK8PX1NcqWLWuMGDHCuHHjhtWluYXNmzcn+33Ro0cPwzAMIz4+3hg1apQRHBxs+Pj4GA888IBx8ODBHKtP89yIiIiIS9GYGxEREXEpCjciIiLiUhRuRERExKUo3IiIiIhLUbgRERERl6JwIyIiIi5F4UZERERcisKNiLglm83GypUrrS5DRLKBwo2I5LiePXtis9mSPFq1amV1aSLiArS2lIhYolWrVixcuNBpn4+Pj0XViIgrUcuNiFjCx8eHkJAQp0ehQoUAs8tozpw5tG7dGj8/P8qWLcvy5cud3r9v3z7uv/9+/Pz8KFKkCM899xxxcXFOxyxYsIBq1arh4+NDaGgo/fr1c3r9/PnzdOjQAX9/fypUqMCqVascr128eJGuXbtSrFgx/Pz8qFChQpIwJiK5k8KNiORKo0aN4rHHHuOnn36ia9eudOnShQMHDgBw5coVWrZsSaFChdi1axfLli1j48aNTuFlzpw59O3bl+eee459+/axatUqypcv73SNcePG0blzZ37++WcefvhhunbtyoULFxzX//XXX1mzZg0HDhxgzpw5FC1aNOf+AkQk43JsiU4Rkf/Xo0cPw9PT08ifP7/T47XXXjMMw1yh/oUXXnB6T4MGDYw+ffoYhmEY8+bNMwoVKmTExcU5Xv/qq68MDw8PIzo62jAMwwgLCzNGjBiRYg2AMXLkSMfzuLg4AzDWrFljGIZhtGnTxujVq1fWfGARyVEacyMilrjvvvuYM2eO077ChQs7ths2bOj0WsOGDdm7dy8ABw4coGbNmuTPn9/xeuPGjYmPj+fgwYPYbDZOnTrFAw88kGoNNWrUcGznz5+fwMBAzp49C0CfPn147LHH2L17Nw899BDt27enUaNGGfqsIpKzFG5ExBL58+dP0k2UVfz8/NJ0XL58+Zye22w24uPjAWjdujXHjh1j9erVbNiwgQceeIC+ffvy5ptvZnm9IpK1NOZGRHKl77//PsnzKlWqAFClShV++uknrly54nh927ZteHh4UKlSJQoUKEDp0qXZtGlTpmooVqwYPXr04MMPP2TatGnMmzcvU+cTkZyhlhsRscSNGzeIjo522ufl5eUYtLts2TLq1q3LP//5Tz766CN27tzJe++9B0DXrl0ZM2YMPXr0YOzYsZw7d47+/fvz1FNPERwcDMDYsWN54YUXKF68OK1bt+by5cts27aN/v37p6m+0aNHU6dOHapVq8aNGzf48ssvHeFKRHI3hRsRscTatWsJDQ112lepUiV+++03wLyT6ZNPPuHFF18kNDSUJUuWULVqVQD8/f1Zt24dAwcOpF69evj7+/PYY4/x1ltvOc7Vo0cPrl+/zttvv82QIUMoWrQonTp1SnN93t7eDB8+nKNHj+Ln50eTJk345JNPsuCTi0h2sxmGYVhdhIhIYjabjRUrVtC+fXurSxGRPEhjbkRERMSlKNyIiIiIS9GYGxHJddRbLiKZoZYbERERcSkKNyIiIuJSFG5ERETEpSjciIiIiEtRuBERERGXonAjIiIiLkXhRkRERFyKwo2IiIi4FIUbERERcSn/ByuJn8U9bHqcAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "acc = history_dict['binary_accuracy']\n", + "val_acc = history_dict['val_binary_accuracy']\n", + "loss = history_dict['loss']\n", + "val_loss = history_dict['val_loss']\n", + "\n", + "epochs = range(1, len(acc) + 1)\n", + "\n", + "# \"bo\" is for \"blue dot\"\n", + "plt.plot(epochs, loss, 'bo', label='Training loss')\n", + "# b is for \"solid blue line\"\n", + "plt.plot(epochs, val_loss, 'b', label='Validation loss')\n", + "plt.title('Training and validation loss')\n", + "plt.xlabel('Epochs')\n", + "plt.ylabel('Loss')\n", + "plt.legend()\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "af51178e-fe0b-40ca-9260-2190fb52d960", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHHCAYAAABXx+fLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABXZUlEQVR4nO3deXhMZ/8G8HsySSb7IoksEgmhtsZObEErbdCmiCWWElu1ilLVonZetKjGVsobay0pQr1VKlJqX4pYaqm1ISTEkkgQyeT8/ji/TDIyiZlsZ5Jzf65rLplnzjnznckwt+d5znMUgiAIICIiIpIRE6kLICIiIiptDEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQERERCQ7DEBEREQkOwxAREREJDsMQETFoH///vDx8SnUvlOnToVCoSjegozMrVu3oFAosHr16lJ93v3790OhUGD//v2aNn1/VyVVs4+PD/r371+sxyQiwzEAUbmmUCj0uuX+giQqqiNHjmDq1Kl48uSJ1KUQUT5MpS6AqCStW7dO6/7atWsRHR2dp71WrVpFep4VK1YgKyurUPtOnDgR48aNK9Lzk/6K8rvS15EjRzBt2jT0798fDg4OWo9duXIFJib8vyeR1BiAqFz78MMPte4fO3YM0dHRedpf9ezZM1hZWen9PGZmZoWqDwBMTU1hasq/iqWlKL+r4qBSqSR9/rIiLS0N1tbWUpdB5Rj/G0Ky17ZtW7z55ps4deoUWrduDSsrK3z99dcAgF9++QXvvfcePDw8oFKp4OvrixkzZkCtVmsd49V5JdnzR+bNm4fly5fD19cXKpUKTZo0wcmTJ7X21TUHSKFQYPjw4di+fTvefPNNqFQq1KlTB7t3785T//79+9G4cWNYWFjA19cXP/74o97zig4ePIju3bujcuXKUKlU8PLywueff47nz5/neX02NjaIj49H586dYWNjAxcXF4wZMybPe/HkyRP0798f9vb2cHBwQFhYmF5DQX/99RcUCgXWrFmT57Hff/8dCoUCv/76KwDg33//xaeffooaNWrA0tISTk5O6N69O27duvXa59E1B0jfms+dO4f+/fujatWqsLCwgJubGwYOHIiHDx9qtpk6dSq+/PJLAECVKlU0w6zZtemaA3Tjxg10794dFSpUgJWVFZo1a4adO3dqbZM9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8vIq/IsiIiIioyf5HKCiiIiIgJ+fH5o2barV3rNnT83Pfn5+qFu3Lnx9fbF//360a9cuz3HGjx+P0aNHa+6npKQwBBEREZVjkvYAOTs7Q6lUIjExUas9MTERbm5uBe6blpaGTZs2YdCgQa99nqpVq8LZ2RnXrl3T+bhKpYKdnZ3WjYiIiMovSQOQubk5GjVqhJiYGE1bVlYWYmJi0Lx58wL33bx5M9LT0/Hhhx++9nnu3LmDhw8fwt3dvcg1ExERUdkn+Vlgo0ePxooVK7BmzRpcunQJQ4cORVpaGgYMGAAA6NevH8aPH59nv4iICHTu3BlOTk5a7ampqfjyyy9x7Ngx3Lp1CzExMejUqROqVauGoKCgUnlNREREZNwknwMUGhqKBw8eYPLkyUhISED9+vWxe/duzcTouLg4mJho57QrV67g0KFD2LNnT57jKZVKnDt3DmvWrMGTJ0/g4eGBd999FzNmzOBaQERERAQAUAiCIEhdhLFJSUmBvb09kpOTOR+IiIiojDDk+1vyITAiIiKi0sYARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREsmMqdQFERCQvarUaGRkZUpdBZZCZmRmUSmWxHIsBiIiISoUgCEhISMCTJ0+kLoXKMAcHB7i5uUGhUBTpOAxARERUKrLDT8WKFWFlZVXkLzCSF0EQ8OzZM9y/fx8A4O7uXqTjMQAREVGJU6vVmvDj5OQkdTlURllaWgIA7t+/j4oVKxZpOIyToImIqMRlz/mxsrKSuBIq67I/Q0WdR8YAREREpYbDXlRUxfUZYgAiIiIqRT4+PggPD9d7+/3790OhUHDyeDHjHCAiIioz1Grg4EHg3j3A3R0ICACK6azoPF7X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oXr16tixY4fmscePH6NPnz5wcXGBpaUlqlevniewEZFxYgAiojJr0qRJ6Nq1K86ePYs+ffqgZ8+euHTpEgAgLS0NQUFBcHR0xMmTJ7F582bs3btXK+AsXboUw4YNw5AhQ3D+/Hns2LED1apV03qOadOmoUePHjh37hw6duyIPn364NGjR5rnv3jxInbt2oVLly5h6dKlcHZ2Lr03gIgKr9Quu0pEZICwsDBBqVQK1tbWWreZM2cKgiAIAIRPPvlEax9/f39h6NChgiAIwvLlywVHR0chNTVV8/jOnTsFExMTISEhQRAEQfDw8BAmTJiQbw0AhIkTJ2rup6amCgCEXbt2CYIgCMHBwcKAAQOK5wUTUaniHCAiMlpvvfUWli5dqtVWoUIFzc/NmzfXeqx58+aIjY0FAFy6dAn16tWDtbW15vGWLVsiKysLV65cgUKhwN27d9GuXbsCa6hbt67mZ2tra9jZ2eH+/fsAgKFDh6Jr1644ffo03n33XXTu3BktWrQo1GslotLFAERERsva2jrPkFRxsbS01Gs7MzMzrfsKhQJZWVkAgA4dOuDff//Fb7/9hujoaLRr1w7Dhg3DvHnzir1eIipenANERGXWsWPH8tyvVasWAKBWrVo4e/Ys0tLSNI8fPnwYJiYmqFGjBmxtbeHj44OYmJgi1eDi4oKwsDD89NNPCA8Px/Lly4t0PCIqHewBIiKjlZ6ejoSEBK02U1NTzUTjzZs3o3HjxmjVqhXWr1+PEydOICIiAgDQp08fTJkyBWFhYZg6dSoePHiAESNGoG/fvnB1dQUATJ06FZ988gkqVqyIDh064OnTpzh8+DBGjBihV32TJ09Go0aNUKdOHaSnp+PXX3/VBDAiMm4MQERktHbv3g13d3ettho1auDy5csAxDO0Nm3ahE8//RTu7u7YuHEjateuDQCwsrLC77//jpEjR6JJkyawsrJC165dMX/+fM2xwsLC8OLFC3z//fcYM2YMnJ2d0a1bN73rMzc3x/jx43Hr1i1YWloiICAAmzZtKoZXTkQlTSEIgiB1EUREhlIoFNi2bRs6d+4sdSlEVAZxDhARERHJDgMQERERyQ7nABFRmcTReyIqCvYAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7DAAERERkewwABEREZHsMAARERGR7Pwfdn0MxQovG2kAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(epochs, acc, 'bo', label='Training acc')\n", + "plt.plot(epochs, val_acc, 'b', label='Validation acc')\n", + "plt.title('Training and validation accuracy')\n", + "plt.xlabel('Epochs')\n", + "plt.ylabel('Accuracy')\n", + "plt.legend(loc='lower right')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "93b0a42c-437e-41bb-99e7-d58cb8036a3a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "782/782 [==============================] - 5s 6ms/step - loss: 0.3103 - accuracy: 0.8737\n", + "0.8736799955368042\n" + ] + } + ], + "source": [ + "export_model = tf.keras.Sequential([\n", + " vectorize_layer,\n", + " model,\n", + " layers.Activation('sigmoid')\n", + "])\n", + "\n", + "export_model.compile(\n", + " loss=losses.BinaryCrossentropy(from_logits=False), optimizer=\"adam\", metrics=['accuracy']\n", + ")\n", + "\n", + "# Test it with `raw_test_ds`, which yields raw strings\n", + "loss, accuracy = export_model.evaluate(raw_test_ds)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "8939539b-a600-48b1-a55e-3f1087f4a855", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/1 [==============================] - 0s 99ms/step\n" + ] + }, + { + "data": { + "text/plain": [ + "array([[0.6167954],\n", + " [0.4397881],\n", + " [0.3572815]], dtype=float32)" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "examples = [\n", + " \"The movie was great!\",\n", + " \"The movie was okay.\",\n", + " \"The movie was terrible...\"\n", + "]\n", + "\n", + "export_model.predict(examples)" + ] + }, + { + "cell_type": "markdown", + "id": "f6b40a59-8d3b-44ec-a4f7-92c5742a0c1c", + "metadata": {}, + "source": [ + "### Save Model" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "e2aa1770-2bf9-436b-af32-16b64fc97490", + "metadata": {}, + "outputs": [], + "source": [ + "!rm -rf text_model" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "7f22cc32-2708-4808-8e76-99024da87a21", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:absl:Found untraced functions such as _update_step_xla, _update_step_xla while saving (showing 2 of 2). These functions will not be directly callable after loading.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: text_model/assets\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: text_model/assets\n" + ] + } + ], + "source": [ + "export_model.save('text_model')" + ] + }, + { + "cell_type": "markdown", + "id": "3add8a92-bb90-415b-ae21-417a6b722a8b", + "metadata": {}, + "source": [ + "### Inspect saved model" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "d5dda184-8288-4de2-95a9-41d0a9744b2c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[01;34mtext_model\u001b[00m\n", + "├── \u001b[01;34massets\u001b[00m\n", + "├── fingerprint.pb\n", + "├── keras_metadata.pb\n", + "├── saved_model.pb\n", + "└── \u001b[01;34mvariables\u001b[00m\n", + " ├── variables.data-00000-of-00001\n", + " └── variables.index\n", + "\n", + "2 directories, 5 files\n" + ] + } + ], + "source": [ + "!tree text_model" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "e756f01d-dcef-4132-a0e6-4231792356de", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The given SavedModel SignatureDef contains the following input(s):\n", + " inputs['text_vectorization_input'] tensor_info:\n", + " dtype: DT_STRING\n", + " shape: (-1)\n", + " name: serving_default_text_vectorization_input:0\n", + "The given SavedModel SignatureDef contains the following output(s):\n", + " outputs['activation'] tensor_info:\n", + " dtype: DT_FLOAT\n", + " shape: (-1, 1)\n", + " name: StatefulPartitionedCall:0\n", + "Method name is: tensorflow/serving/predict\n" + ] + } + ], + "source": [ + "!saved_model_cli show --dir text_model --tag_set serve --signature_def serving_default" + ] + }, + { + "cell_type": "markdown", + "id": "e0461f74-fdd0-4f30-9f44-0be7ad00d9b0", + "metadata": {}, + "source": [ + "### Load model" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "c9cf2c7f-5e86-4ff8-984e-dd0ed7a3ece9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential_1\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " text_vectorization (TextVec (None, 250) 0 \n", + " torization) \n", + " \n", + " sequential (Sequential) (None, 1) 160033 \n", + " \n", + " activation (Activation) (None, 1) 0 \n", + " \n", + "=================================================================\n", + "Total params: 160,033\n", + "Trainable params: 160,033\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "# register callables as custom objects before loading\n", + "custom_objects = {\"vectorize_layer\": vectorize_layer, \"custom_standardization\": custom_standardization}\n", + "with tf.keras.utils.custom_object_scope(custom_objects):\n", + " new_model = tf.keras.models.load_model('text_model')\n", + "\n", + "new_model.summary()" + ] + }, + { + "cell_type": "markdown", + "id": "242a4f7e-fa45-4d21-b103-fe3718bc0f10", + "metadata": {}, + "source": [ + "### Predict" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "531680b2-42ef-4205-9a38-6995aee9f340", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/1 [==============================] - 0s 69ms/step\n" + ] + }, + { + "data": { + "text/plain": [ + "array([[0.6167954],\n", + " [0.4397881],\n", + " [0.3572815]], dtype=float32)" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "new_model.predict(examples)" + ] + }, + { + "cell_type": "markdown", + "id": "a82ae387-1587-4175-b4b2-66586e4668f7", + "metadata": {}, + "source": [ + "## PySpark" + ] + }, + { + "cell_type": "markdown", + "id": "0b5ac416-a37f-4f0b-8c77-628f0fcede69", + "metadata": {}, + "source": [ + "## Inference using Spark DL API\n", + "Note: you can restart the kernel and run from this point to simulate running in a different node or environment." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "d6d515c2-ce53-4af5-a936-ae91fdecea99", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pyspark.ml.functions import predict_batch_udf\n", + "from pyspark.sql.functions import struct, col\n", + "from pyspark.sql.types import ArrayType, FloatType, DoubleType" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "6d0d567a-0ef8-4a93-8235-e89ace2c82ad", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 1:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+----------------------------------------------------------------------------------------------------+\n", + "| lines|\n", + "+----------------------------------------------------------------------------------------------------+\n", + "|...But not this one! I always wanted to know \"what happened\" next. We will never know for sure wh...|\n", + "|Hard up, No proper jobs going down at the pit, why not rent your kids! DIY pimp story without the...|\n", + "|I watched this movie to see the direction one of the most promising young talents in movies was g...|\n", + "|This movie makes you wish imdb would let you vote a zero. One of the two movies I've ever walked ...|\n", + "|I never want to see this movie again!

Not only is it dreadfully bad, but I can't stand...|\n", + "|(As a note, I'd like to say that I saw this movie at my annual church camp, where the entire yout...|\n", + "|Don't get me wrong, I love the TV series of League Of Gentlemen. It was funny, twisted and comple...|\n", + "|Did you ever think, like after watching a horror movie with a group of friends: \"Wow, this is so ...|\n", + "|Awful, awful, awful...

I loved the original film. It was funny, charming, and had hear...|\n", + "|This movie seems a little clunky around the edges, like not quite enough zaniness was thrown it w...|\n", + "|I rented this movie hoping that it would provide some good entertainment and some cool poker know...|\n", + "|Well, where to start describing this celluloid debacle? You already know the big fat NADA passing...|\n", + "|I hoped for this show to be somewhat realistic. It stroke me as just another mainstream show afte...|\n", + "|All I have to say is one word...SUCKS!!!!. The only reason I gave this a 2 is because Josh Hartne...|\n", + "|Honestly awful film, bad editing, awful lighting, dire dialog and scrappy screenplay.

...|\n", + "|This critique tells the story of 4 little friends who went to watch Angels and Demons the movie o...|\n", + "|This review contains a partial spoiler.

Shallow from the outset, 'D.O.A.' at least sta...|\n", + "|I'm rather surprised that anybody found this film touching or moving.

The basic premis...|\n", + "|If you like bad movies (and you must to watch this one) here's a good one. Not quite as funny as ...|\n", + "|This is really bad, the characters were bland, the story was boring, and there is no sex scene. F...|\n", + "+----------------------------------------------------------------------------------------------------+\n", + "only showing top 20 rows\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "# note: using IMDB parquet dataset from huggingface/conditional_generation.ipynb\n", + "df = spark.read.parquet(\"../huggingface/imdb_test\")\n", + "df.show(truncate=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "7b7a8395-e2ae-4c3c-bf57-763dfde600ad", + "metadata": {}, + "outputs": [], + "source": [ + "text_model_path = \"{}/text_model\".format(os.getcwd())" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "8c0524cf-3a75-4fb8-8025-f0654acce13e", + "metadata": {}, + "outputs": [], + "source": [ + "def predict_batch_fn():\n", + " # since this function runs on the executor, any required imports should be added inside the function.\n", + " import re\n", + " import string\n", + " import tensorflow as tf\n", + " from tensorflow.keras import layers\n", + "\n", + " def custom_standardization(input_data):\n", + " lowercase = tf.strings.lower(input_data)\n", + " stripped_html = tf.strings.regex_replace(lowercase, \"
\", \" \")\n", + " return tf.strings.regex_replace(\n", + " stripped_html, \"[%s]\" % re.escape(string.punctuation), \"\"\n", + " )\n", + "\n", + " max_features = 10000\n", + " sequence_length = 250\n", + "\n", + " vectorize_layer = layers.TextVectorization(\n", + " standardize=custom_standardization,\n", + " max_tokens=max_features,\n", + " output_mode=\"int\",\n", + " output_sequence_length=sequence_length,\n", + " )\n", + "\n", + " custom_objects = {\"vectorize_layer\": vectorize_layer,\n", + " \"custom_standardization\": custom_standardization}\n", + " with tf.keras.utils.custom_object_scope(custom_objects):\n", + " model = tf.keras.models.load_model(text_model_path)\n", + "\n", + " def predict(inputs):\n", + " return model.predict(inputs)\n", + "\n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "0d603644-d938-4c87-aa8a-2512251638d5", + "metadata": {}, + "outputs": [], + "source": [ + "classify = predict_batch_udf(predict_batch_fn,\n", + " return_type=FloatType(),\n", + " batch_size=256)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "0b480622-8dc1-4879-933e-c43112768630", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 269 ms, sys: 76.7 ms, total: 345 ms\n", + "Wall time: 6.81 s\n" + ] + } + ], + "source": [ + "%%time\n", + "predictions = df.withColumn(\"preds\", classify(struct(\"lines\")))\n", + "results = predictions.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "31b0a262-387e-4a5e-a60e-b9b8ee456199", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 106 ms, sys: 10 ms, total: 116 ms\n", + "Wall time: 2.47 s\n" + ] + } + ], + "source": [ + "%%time\n", + "predictions = df.withColumn(\"preds\", classify(\"lines\"))\n", + "results = predictions.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "7ef9e431-59f5-4b29-9f79-ae16a9cfb0b9", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 93.7 ms, sys: 21.3 ms, total: 115 ms\n", + "Wall time: 2.51 s\n" + ] + } + ], + "source": [ + "%%time\n", + "predictions = df.withColumn(\"preds\", classify(col(\"lines\")))\n", + "results = predictions.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "9a325ee2-3268-414a-bb75-a5fcf794f512", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------------------------------------------------------------------+------------+\n", + "| lines| preds|\n", + "+--------------------------------------------------------------------------------+------------+\n", + "|...But not this one! I always wanted to know \"what happened\" next. We will ne...| 0.55854315|\n", + "|Hard up, No proper jobs going down at the pit, why not rent your kids! DIY pi...| 0.20151669|\n", + "|I watched this movie to see the direction one of the most promising young tal...| 0.2886543|\n", + "|This movie makes you wish imdb would let you vote a zero. One of the two movi...| 0.4254548|\n", + "|I never want to see this movie again!

Not only is it dreadfully ba...| 0.007963314|\n", + "|(As a note, I'd like to say that I saw this movie at my annual church camp, w...| 0.52016854|\n", + "|Don't get me wrong, I love the TV series of League Of Gentlemen. It was funny...|3.7298937E-4|\n", + "|Did you ever think, like after watching a horror movie with a group of friend...|0.0073868474|\n", + "|Awful, awful, awful...

I loved the original film. It was funny, ch...|0.0020545013|\n", + "|This movie seems a little clunky around the edges, like not quite enough zani...| 0.19478825|\n", + "|I rented this movie hoping that it would provide some good entertainment and ...| 0.010234797|\n", + "|Well, where to start describing this celluloid debacle? You already know the ...| 0.02019683|\n", + "|I hoped for this show to be somewhat realistic. It stroke me as just another ...| 0.39049864|\n", + "|All I have to say is one word...SUCKS!!!!. The only reason I gave this a 2 is...| 0.19343555|\n", + "|Honestly awful film, bad editing, awful lighting, dire dialog and scrappy scr...| 3.712686E-5|\n", + "|This critique tells the story of 4 little friends who went to watch Angels an...| 0.16827627|\n", + "|This review contains a partial spoiler.

Shallow from the outset, '...| 0.043480344|\n", + "|I'm rather surprised that anybody found this film touching or moving.
>>> containers: {}\".format([c.short_id for c in containers]))\n", + " else:\n", + " container=client.containers.run(\n", + " \"nvcr.io/nvidia/tritonserver:23.04-py3\", \"tritonserver --model-repository=/models\",\n", + " detach=True,\n", + " device_requests=[docker.types.DeviceRequest(device_ids=[\"0\"], capabilities=[['gpu']])],\n", + " name=\"spark-triton\",\n", + " network_mode=\"host\",\n", + " remove=True,\n", + " shm_size=\"128M\",\n", + " volumes={\n", + " triton_models_dir: {\"bind\": \"/models\", \"mode\": \"ro\"},\n", + " text_model_dir: {\"bind\": \"/text_model\", \"mode\": \"ro\"}\n", + " }\n", + " )\n", + " print(\">>>> starting triton: {}\".format(container.short_id))\n", + "\n", + " # wait for triton to be running\n", + " time.sleep(15)\n", + " client = grpcclient.InferenceServerClient(\"localhost:8001\")\n", + " ready = False\n", + " while not ready:\n", + " try:\n", + " ready = client.is_server_ready()\n", + " except Exception as e:\n", + " time.sleep(5)\n", + " \n", + " return [True]\n", + "\n", + "nodeRDD.barrier().mapPartitions(start_triton).collect()" + ] + }, + { + "cell_type": "markdown", + "id": "287873da-6202-4b55-97fb-cda8644b1fee", + "metadata": {}, + "source": [ + "#### Run inference" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "41106a02-236e-4cb3-ac51-76aa64b663c2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+----------------------------------------------------------------------------------------------------+\n", + "| lines|\n", + "+----------------------------------------------------------------------------------------------------+\n", + "|...But not this one! I always wanted to know \"what happened\" next. We will never know for sure wh...|\n", + "|Hard up, No proper jobs going down at the pit, why not rent your kids! DIY pimp story without the...|\n", + "|I watched this movie to see the direction one of the most promising young talents in movies was g...|\n", + "|This movie makes you wish imdb would let you vote a zero. One of the two movies I've ever walked ...|\n", + "|I never want to see this movie again!

Not only is it dreadfully bad, but I can't stand...|\n", + "|(As a note, I'd like to say that I saw this movie at my annual church camp, where the entire yout...|\n", + "|Don't get me wrong, I love the TV series of League Of Gentlemen. It was funny, twisted and comple...|\n", + "|Did you ever think, like after watching a horror movie with a group of friends: \"Wow, this is so ...|\n", + "|Awful, awful, awful...

I loved the original film. It was funny, charming, and had hear...|\n", + "|This movie seems a little clunky around the edges, like not quite enough zaniness was thrown it w...|\n", + "|I rented this movie hoping that it would provide some good entertainment and some cool poker know...|\n", + "|Well, where to start describing this celluloid debacle? You already know the big fat NADA passing...|\n", + "|I hoped for this show to be somewhat realistic. It stroke me as just another mainstream show afte...|\n", + "|All I have to say is one word...SUCKS!!!!. The only reason I gave this a 2 is because Josh Hartne...|\n", + "|Honestly awful film, bad editing, awful lighting, dire dialog and scrappy screenplay.

...|\n", + "|This critique tells the story of 4 little friends who went to watch Angels and Demons the movie o...|\n", + "|This review contains a partial spoiler.

Shallow from the outset, 'D.O.A.' at least sta...|\n", + "|I'm rather surprised that anybody found this film touching or moving.

The basic premis...|\n", + "|If you like bad movies (and you must to watch this one) here's a good one. Not quite as funny as ...|\n", + "|This is really bad, the characters were bland, the story was boring, and there is no sex scene. F...|\n", + "+----------------------------------------------------------------------------------------------------+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "# note: using IMDB parquet dataset from huggingface/conditional_generation.ipynb\n", + "df = spark.read.parquet(\"../huggingface/imdb_test\").repartition(1)\n", + "df.show(truncate=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "8b763167-7f50-4278-9bc9-6c3433b62294", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['lines']" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "columns = df.columns\n", + "columns" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "29b0cc0d-c480-4e4a-bd41-207dc314cba5", + "metadata": {}, + "outputs": [], + "source": [ + "def triton_fn(triton_uri, model_name):\n", + " import numpy as np\n", + " import tritonclient.grpc as grpcclient\n", + " \n", + " np_types = {\n", + " \"BOOL\": np.dtype(np.bool8),\n", + " \"INT8\": np.dtype(np.int8),\n", + " \"INT16\": np.dtype(np.int16),\n", + " \"INT32\": np.dtype(np.int32),\n", + " \"INT64\": np.dtype(np.int64),\n", + " \"FP16\": np.dtype(np.float16),\n", + " \"FP32\": np.dtype(np.float32),\n", + " \"FP64\": np.dtype(np.float64),\n", + " \"FP64\": np.dtype(np.double),\n", + " \"BYTES\": np.dtype(object)\n", + " }\n", + "\n", + " client = grpcclient.InferenceServerClient(triton_uri)\n", + " model_meta = client.get_model_metadata(model_name)\n", + " \n", + " def predict(inputs):\n", + " if isinstance(inputs, np.ndarray):\n", + " # single ndarray input\n", + " request = [grpcclient.InferInput(model_meta.inputs[0].name, inputs.shape, model_meta.inputs[0].datatype)]\n", + " request[0].set_data_from_numpy(inputs.astype(np_types[model_meta.inputs[0].datatype]))\n", + " else:\n", + " # dict of multiple ndarray inputs\n", + " request = [grpcclient.InferInput(i.name, inputs[i.name].shape, i.datatype) for i in model_meta.inputs]\n", + " for i in request:\n", + " i.set_data_from_numpy(inputs[i.name()].astype(np_types[i.datatype()]))\n", + " \n", + " response = client.infer(model_name, inputs=request)\n", + " \n", + " if len(model_meta.outputs) > 1:\n", + " # return dictionary of numpy arrays\n", + " return {o.name: response.as_numpy(o.name) for o in model_meta.outputs}\n", + " else:\n", + " # return single numpy array\n", + " return response.as_numpy(model_meta.outputs[0].name)\n", + " \n", + " return predict" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "8e06d33f-5cef-4a48-afc3-5d468f8ec2b4", + "metadata": {}, + "outputs": [], + "source": [ + "from functools import partial\n", + "\n", + "classify = predict_batch_udf(partial(triton_fn, triton_uri=\"localhost:8001\", model_name=\"text_classification\"),\n", + " input_tensor_shapes=[[1]],\n", + " return_type=FloatType(),\n", + " batch_size=2048)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "d89e74ad-e551-4bfa-ad08-98725878630a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------------------------------------------------------------------+------------+\n", + "| lines| preds|\n", + "+--------------------------------------------------------------------------------+------------+\n", + "|...But not this one! I always wanted to know \"what happened\" next. We will ne...| 0.55854315|\n", + "|Hard up, No proper jobs going down at the pit, why not rent your kids! DIY pi...| 0.20151669|\n", + "|I watched this movie to see the direction one of the most promising young tal...| 0.2886543|\n", + "|This movie makes you wish imdb would let you vote a zero. One of the two movi...| 0.4254548|\n", + "|I never want to see this movie again!

Not only is it dreadfully ba...| 0.007963314|\n", + "|(As a note, I'd like to say that I saw this movie at my annual church camp, w...| 0.52016854|\n", + "|Don't get me wrong, I love the TV series of League Of Gentlemen. It was funny...|3.7298937E-4|\n", + "|Did you ever think, like after watching a horror movie with a group of friend...|0.0073868474|\n", + "|Awful, awful, awful...

I loved the original film. It was funny, ch...|0.0020545013|\n", + "|This movie seems a little clunky around the edges, like not quite enough zani...| 0.19478825|\n", + "|I rented this movie hoping that it would provide some good entertainment and ...| 0.010234797|\n", + "|Well, where to start describing this celluloid debacle? You already know the ...| 0.02019683|\n", + "|I hoped for this show to be somewhat realistic. It stroke me as just another ...| 0.39049864|\n", + "|All I have to say is one word...SUCKS!!!!. The only reason I gave this a 2 is...| 0.19343555|\n", + "|Honestly awful film, bad editing, awful lighting, dire dialog and scrappy scr...| 3.712686E-5|\n", + "|This critique tells the story of 4 little friends who went to watch Angels an...| 0.16827627|\n", + "|This review contains a partial spoiler.

Shallow from the outset, '...| 0.043480344|\n", + "|I'm rather surprised that anybody found this film touching or moving.

Not only is it dreadfully ba...| 0.007963314|\n", + "|(As a note, I'd like to say that I saw this movie at my annual church camp, w...| 0.52016854|\n", + "|Don't get me wrong, I love the TV series of League Of Gentlemen. It was funny...|3.7298937E-4|\n", + "|Did you ever think, like after watching a horror movie with a group of friend...|0.0073868474|\n", + "|Awful, awful, awful...

I loved the original film. It was funny, ch...|0.0020545013|\n", + "|This movie seems a little clunky around the edges, like not quite enough zani...| 0.19478825|\n", + "|I rented this movie hoping that it would provide some good entertainment and ...| 0.010234797|\n", + "|Well, where to start describing this celluloid debacle? You already know the ...| 0.02019683|\n", + "|I hoped for this show to be somewhat realistic. It stroke me as just another ...| 0.39049864|\n", + "|All I have to say is one word...SUCKS!!!!. The only reason I gave this a 2 is...| 0.19343555|\n", + "|Honestly awful film, bad editing, awful lighting, dire dialog and scrappy scr...| 3.712686E-5|\n", + "|This critique tells the story of 4 little friends who went to watch Angels an...| 0.16827627|\n", + "|This review contains a partial spoiler.

Shallow from the outset, '...| 0.043480344|\n", + "|I'm rather surprised that anybody found this film touching or moving.
>>> stopping containers: {}\".format([c.short_id for c in containers]))\n", + " if containers:\n", + " container=containers[0]\n", + " container.stop(timeout=120)\n", + "\n", + " return [True]\n", + "\n", + "nodeRDD.barrier().mapPartitions(stop_triton).collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "54a90574-7cbb-487b-b7a8-dcda0e6e301f", + "metadata": {}, + "outputs": [], + "source": [ + "spark.stop()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "88e3bfea-a825-46eb-b8c2-921a932c0089", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From f9c45c274e0b98a3af115b93338278c107645415 Mon Sep 17 00:00:00 2001 From: Peixin Date: Tue, 23 May 2023 09:45:20 +0800 Subject: [PATCH 09/12] Enable automerge from branch-23.06 to branch-23.08 (#300) Signed-off-by: Peixin Li --- .github/workflows/auto-merge.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/auto-merge.yml b/.github/workflows/auto-merge.yml index e6b3b9afa..7e6ce9a14 100644 --- a/.github/workflows/auto-merge.yml +++ b/.github/workflows/auto-merge.yml @@ -18,7 +18,7 @@ name: auto-merge HEAD to BASE on: pull_request_target: branches: - - branch-23.04 + - branch-23.06 types: [closed] jobs: @@ -29,14 +29,14 @@ jobs: steps: - uses: actions/checkout@v3 with: - ref: branch-23.04 # force to fetch from latest upstream instead of PR ref + ref: branch-23.06 # force to fetch from latest upstream instead of PR ref - name: auto-merge job uses: ./.github/workflows/auto-merge env: OWNER: NVIDIA REPO_NAME: spark-rapids-examples - HEAD: branch-23.04 - BASE: branch-23.06 + HEAD: branch-23.06 + BASE: branch-23.08 AUTOMERGE_TOKEN: ${{ secrets.AUTOMERGE_TOKEN }} # use to merge PR From da69189fbae930491a69d0b647bf9622094c4b6d Mon Sep 17 00:00:00 2001 From: liyuan <84758614+nvliyuan@users.noreply.github.com> Date: Wed, 14 Jun 2023 22:28:21 +0800 Subject: [PATCH 10/12] update getting started guide based on latest databricks env (#290) * update getting started doc according latest databricks env Signed-off-by: liyuan * sync addressed comments from spark-rapids repo pr 8221 Signed-off-by: liyuan --------- Signed-off-by: liyuan --- .../csp/databricks/databricks.md | 89 ++++------ .../generate-init-script-10.4.ipynb | 166 ------------------ .../generate-init-script-11.3.ipynb | 166 ------------------ .../csp/databricks/generate-init-script.ipynb | 166 ------------------ .../xgboost-examples/csp/databricks/init.sh | 17 ++ docs/img/databricks/initscript.png | Bin 12946 -> 40769 bytes 6 files changed, 56 insertions(+), 548 deletions(-) delete mode 100644 docs/get-started/xgboost-examples/csp/databricks/generate-init-script-10.4.ipynb delete mode 100644 docs/get-started/xgboost-examples/csp/databricks/generate-init-script-11.3.ipynb delete mode 100644 docs/get-started/xgboost-examples/csp/databricks/generate-init-script.ipynb create mode 100644 docs/get-started/xgboost-examples/csp/databricks/init.sh diff --git a/docs/get-started/xgboost-examples/csp/databricks/databricks.md b/docs/get-started/xgboost-examples/csp/databricks/databricks.md index 012c59e17..28fa17470 100644 --- a/docs/get-started/xgboost-examples/csp/databricks/databricks.md +++ b/docs/get-started/xgboost-examples/csp/databricks/databricks.md @@ -14,55 +14,26 @@ The number of GPUs per node dictates the number of Spark executors that can run Start A Databricks Cluster -------------------------- - -Create a Databricks cluster by going to "Compute", then clicking `+ Create compute`. Ensure the -cluster meets the prerequisites above by configuring it as follows: +Before creating the cluster, we will need to create an [initialization script](https://docs.databricks.com/clusters/init-scripts.html) for the +cluster to install the RAPIDS jars. Databricks recommends storing all cluster-scoped init scripts using workspace files. +Each user has a Home directory configured under the /Users directory in the workspace. +Navigate to your home directory in the UI and select **Create** > **File** from the menu, +create an `init.sh` scripts with contents: + ```bash + #!/bin/bash + sudo wget -O /databricks/jars/rapids-4-spark_2.12-23.04.0.jar https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.04.0/rapids-4-spark_2.12-23.04.0.jar + ``` 1. Select the Databricks Runtime Version from one of the supported runtimes specified in the Prerequisites section. 2. Choose the number of workers that matches the number of GPUs you want to use. 3. Select a worker type. On AWS, use nodes with 1 GPU each such as `p3.2xlarge` or `g4dn.xlarge`. - p2 nodes do not meet the architecture requirements (Pascal or higher) for the Spark worker - (although they can be used for the driver node). For Azure, choose GPU nodes such as - Standard_NC6s_v3. For GCP, choose N1 or A2 instance types with GPUs. + For Azure, choose GPU nodes such as Standard_NC6s_v3. For GCP, choose N1 or A2 instance types with GPUs. 4. Select the driver type. Generally this can be set to be the same as the worker. -5. Start the cluster. - -Advanced Cluster Configuration --------------------------- - -We will need to create an initialization script for the cluster that installs the RAPIDS jars to the -cluster. - -1. To create the initialization script, import the initialization script notebook from the repo to - your workspace. See [Managing - Notebooks](https://docs.databricks.com/notebooks/notebooks-manage.html#id2) for instructions on - how to import a notebook. - Select the version of the RAPIDS Accelerator for Apache Spark based on the Databricks runtime - version: - - [Databricks 10.4 LTS - ML](https://docs.databricks.com/release-notes/runtime/10.4ml.html#system-environment) has CUDA 11 - installed. Users will need to use 22.04.0 or later on Databricks 10.4 LTS ML. - - [Databricks 11.3 LTS - ML](https://docs.databricks.com/release-notes/runtime/11.3ml.html#system-environment) has CUDA 11 - installed. Users will need to use 23.04.0 or later on Databricks 11.3 LTS ML. - - In both cases use - [generate-init-script.ipynb](./generate-init-script.ipynb) which will install - the RAPIDS Spark plugin. - -2. Once you are in the notebook, click the “Run All” button. -3. Ensure that the newly created init.sh script is present in the output from cell 2 and that the - contents of the script are correct. -4. Go back and edit your cluster to configure it to use the init script. To do this, click the - “Compute” button on the left panel, then select your cluster. -5. Click the “Edit” button, then navigate down to the “Advanced Options” section. Select the “Init - Scripts” tab in the advanced options section, and paste the initialization script: - `dbfs:/databricks/init_scripts/init.sh`, then click “Add”. - - ![Init Script](../../../../img/databricks/initscript.png) - +5. Click the “Edit” button, then navigate down to the “Advanced Options” section. Select the “Init Scripts” tab in + the advanced options section, and paste the workspace path to the initialization script:`/Users/user@domain/init.sh`, then click “Add”. + ![Init Script](../../../../img/databricks/initscript.png) 6. Now select the “Spark” tab, and paste the following config options into the Spark Config section. - Change the config values based on the workers you choose. See Apache Spark + Change the config values based on the workers you choose. See Apache Spark [configuration](https://spark.apache.org/docs/latest/configuration.html) and RAPIDS Accelerator for Apache Spark [descriptions](https://nvidia.github.io/spark-rapids/docs/configs.html) for each config. @@ -74,18 +45,36 @@ cluster. like the CPU side. Having the value smaller is fine as well. Note: Please remove the `spark.task.resource.gpu.amount` config for a single-node Databricks cluster because Spark local mode does not support GPU scheduling. - + ```bash - spark.plugins com.nvidia.spark.SQLPlugin - spark.task.resource.gpu.amount 0.1 - spark.rapids.memory.pinnedPool.size 2G - spark.rapids.sql.concurrentGpuTasks 2 + spark.plugins com.nvidia.spark.SQLPlugin + spark.task.resource.gpu.amount 0.1 + spark.rapids.memory.pinnedPool.size 2G + spark.rapids.sql.concurrentGpuTasks 2 ``` ![Spark Config](../../../../img/databricks/sparkconfig.png) -7. Once you’ve added the Spark config, click “Confirm and Restart”. -8. Once the cluster comes back up, it is now enabled for GPU-accelerated Spark with RAPIDS and cuDF. + If running Pandas UDFs with GPU support from the plugin, at least three additional options + as below are required. The `spark.python.daemon.module` option is to choose the right daemon module + of python for Databricks. On Databricks, the python runtime requires different parameters than the + Spark one, so a dedicated python demon module `rapids.daemon_databricks` is created and should + be specified here. Set the config + [`spark.rapids.sql.python.gpu.enabled`](https://nvidia.github.io/spark-rapids/docs/configs.html#sql.python.gpu.enabled) to `true` to + enable GPU support for python. Add the path of the plugin jar (supposing it is placed under + `/databricks/jars/`) to the `spark.executorEnv.PYTHONPATH` option. For more details please go to + [GPU Scheduling For Pandas UDF](https://nvidia.github.io/spark-rapids/docs/additional-functionality/rapids-udfs.html#gpu-support-for-pandas-udf) + + ```bash + spark.rapids.sql.python.gpu.enabled true + spark.python.daemon.module rapids.daemon_databricks + spark.executorEnv.PYTHONPATH /databricks/jars/rapids-4-spark_2.12-23.04.0.jar:/databricks/spark/python + ``` + Note that since python memory pool require installing the cudf library, so you need to install cudf library in + each worker nodes `pip install cudf-cu11 --extra-index-url=https://pypi.nvidia.com` or disable python memory pool + `spark.rapids.python.memory.gpu.pooling.enabled=false`. + +7. Click `Create Cluster`, it is now enabled for GPU-accelerated Spark. Install the xgboost4j_spark jar in the cluster --------------------------- diff --git a/docs/get-started/xgboost-examples/csp/databricks/generate-init-script-10.4.ipynb b/docs/get-started/xgboost-examples/csp/databricks/generate-init-script-10.4.ipynb deleted file mode 100644 index c3c19f153..000000000 --- a/docs/get-started/xgboost-examples/csp/databricks/generate-init-script-10.4.ipynb +++ /dev/null @@ -1,166 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Download latest Jars" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "dbutils.fs.mkdirs(\"dbfs:/FileStore/jars/\")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "%sh\n", - "cd ../../dbfs/FileStore/jars/\n", - "sudo wget -O rapids-4-spark_2.12-23.04.0.jar https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.04.0/rapids-4-spark_2.12-23.04.0.jar\n", - "sudo wget -O xgboost4j-gpu_2.12-1.7.1.jar https://repo1.maven.org/maven2/ml/dmlc/xgboost4j-gpu_2.12/1.7.1/xgboost4j-gpu_2.12-1.7.1.jar\n", - "sudo wget -O xgboost4j-spark-gpu_2.12-1.7.1.jar https://repo1.maven.org/maven2/ml/dmlc/xgboost4j-spark-gpu_2.12/1.7.1/xgboost4j-spark-gpu_2.12-1.7.1.jar\n", - "ls -ltr\n", - "\n", - "# Your Jars are downloaded in dbfs:/FileStore/jars directory" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create a Directory for your init script" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "dbutils.fs.mkdirs(\"dbfs:/databricks/init_scripts/\")" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "dbutils.fs.put(\"/databricks/init_scripts/init.sh\",\"\"\"\n", - "#!/bin/bash\n", - "sudo rm -f /databricks/jars/spark--maven-trees--ml--10.x--xgboost-gpu--ml.dmlc--xgboost4j-gpu_2.12--ml.dmlc__xgboost4j-gpu_2.12__1.5.2.jar\n", - "sudo rm -f /databricks/jars/spark--maven-trees--ml--10.x--xgboost-gpu--ml.dmlc--xgboost4j-spark-gpu_2.12--ml.dmlc__xgboost4j-spark-gpu_2.12__1.5.2.jar\n", - "\n", - "sudo cp /dbfs/FileStore/jars/xgboost4j-gpu_2.12-1.7.1.jar /databricks/jars/\n", - "sudo cp /dbfs/FileStore/jars/rapids-4-spark_2.12-23.04.0.jar /databricks/jars/\n", - "sudo cp /dbfs/FileStore/jars/xgboost4j-spark-gpu_2.12-1.7.1.jar /databricks/jars/\"\"\", True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Confirm your init script is in the new directory" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "%sh\n", - "cd ../../dbfs/databricks/init_scripts\n", - "pwd\n", - "ls -ltr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Download the Mortgage Dataset into your local machine and upload Data using import Data" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "dbutils.fs.mkdirs(\"dbfs:/FileStore/tables/\")" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "%sh\n", - "cd /dbfs/FileStore/tables/\n", - "wget -O mortgage.zip https://rapidsai-data.s3.us-east-2.amazonaws.com/spark/mortgage.zip\n", - "ls\n", - "unzip mortgage.zip" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "%sh\n", - "pwd\n", - "cd ../../dbfs/FileStore/tables\n", - "ls -ltr mortgage/csv/*" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Next steps\n", - "\n", - "1. Edit your cluster, adding an initialization script from `dbfs:/databricks/init_scripts/init.sh` in the \"Advanced Options\" under \"Init Scripts\" tab\n", - "2. Reboot the cluster\n", - "3. Go to \"Libraries\" tab under your cluster and install `dbfs:/FileStore/jars/xgboost4j-spark-gpu_2.12-1.7.1.jar` in your cluster by selecting the \"DBFS\" option for installing jars\n", - "4. Import the mortgage example notebook from `https://github.com/NVIDIA/spark-rapids-examples/blob/branch-23.04/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb`\n", - "5. Inside the mortgage example notebook, update the data paths\n", - " `train_data = reader.schema(schema).option('header', True).csv('/data/mortgage/csv/small-train.csv')`\n", - " `trans_data = reader.schema(schema).option('header', True).csv('/data/mortgage/csv/small-trans.csv')`" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.2" - }, - "name": "Init Scripts_demo", - "notebookId": 2585487876834616 - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/docs/get-started/xgboost-examples/csp/databricks/generate-init-script-11.3.ipynb b/docs/get-started/xgboost-examples/csp/databricks/generate-init-script-11.3.ipynb deleted file mode 100644 index fb24ef76e..000000000 --- a/docs/get-started/xgboost-examples/csp/databricks/generate-init-script-11.3.ipynb +++ /dev/null @@ -1,166 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Download latest Jars" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "dbutils.fs.mkdirs(\"dbfs:/FileStore/jars/\")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "%sh\n", - "cd ../../dbfs/FileStore/jars/\n", - "sudo wget -O rapids-4-spark_2.12-23.04.0.jar https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.04.0/rapids-4-spark_2.12-23.04.0.jar\n", - "sudo wget -O xgboost4j-gpu_2.12-1.7.3.jar https://repo1.maven.org/maven2/ml/dmlc/xgboost4j-gpu_2.12/1.7.3/xgboost4j-gpu_2.12-1.7.3.jar\n", - "sudo wget -O xgboost4j-spark-gpu_2.12-1.7.3.jar https://repo1.maven.org/maven2/ml/dmlc/xgboost4j-spark-gpu_2.12/1.7.3/xgboost4j-spark-gpu_2.12-1.7.3.jar\n", - "ls -ltr\n", - "\n", - "# Your Jars are downloaded in dbfs:/FileStore/jars directory" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create a Directory for your init script" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "dbutils.fs.mkdirs(\"dbfs:/databricks/init_scripts/\")" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "dbutils.fs.put(\"/databricks/init_scripts/init.sh\",\"\"\"\n", - "#!/bin/bash\n", - "sudo rm -f /databricks/jars/spark--maven-trees--ml--10.x--xgboost-gpu--ml.dmlc--xgboost4j-gpu_2.12--ml.dmlc__xgboost4j-gpu_2.12__1.5.2.jar\n", - "sudo rm -f /databricks/jars/spark--maven-trees--ml--10.x--xgboost-gpu--ml.dmlc--xgboost4j-spark-gpu_2.12--ml.dmlc__xgboost4j-spark-gpu_2.12__1.5.2.jar\n", - "\n", - "sudo cp /dbfs/FileStore/jars/xgboost4j-gpu_2.12-1.7.3.jar /databricks/jars/\n", - "sudo cp /dbfs/FileStore/jars/rapids-4-spark_2.12-23.04.0.jar /databricks/jars/\n", - "sudo cp /dbfs/FileStore/jars/xgboost4j-spark-gpu_2.12-1.7.3.jar /databricks/jars/\"\"\", True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Confirm your init script is in the new directory" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "%sh\n", - "cd ../../dbfs/databricks/init_scripts\n", - "pwd\n", - "ls -ltr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Download the Mortgage Dataset into your local machine and upload Data using import Data" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "dbutils.fs.mkdirs(\"dbfs:/FileStore/tables/\")" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "%sh\n", - "cd /dbfs/FileStore/tables/\n", - "wget -O mortgage.zip https://rapidsai-data.s3.us-east-2.amazonaws.com/spark/mortgage.zip\n", - "ls\n", - "unzip mortgage.zip" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "%sh\n", - "pwd\n", - "cd ../../dbfs/FileStore/tables\n", - "ls -ltr mortgage/csv/*" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Next steps\n", - "\n", - "1. Edit your cluster, adding an initialization script from `dbfs:/databricks/init_scripts/init.sh` in the \"Advanced Options\" under \"Init Scripts\" tab\n", - "2. Reboot the cluster\n", - "3. Go to \"Libraries\" tab under your cluster and install `dbfs:/FileStore/jars/xgboost4j-spark-gpu_2.12-1.7.3.jar` in your cluster by selecting the \"DBFS\" option for installing jars\n", - "4. Import the mortgage example notebook from `https://github.com/NVIDIA/spark-rapids-examples/blob/branch-23.04/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb`\n", - "5. Inside the mortgage example notebook, update the data paths\n", - " `train_data = reader.schema(schema).option('header', True).csv('/data/mortgage/csv/small-train.csv')`\n", - " `trans_data = reader.schema(schema).option('header', True).csv('/data/mortgage/csv/small-trans.csv')`" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.2" - }, - "name": "Init Scripts_demo", - "notebookId": 2585487876834616 - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/docs/get-started/xgboost-examples/csp/databricks/generate-init-script.ipynb b/docs/get-started/xgboost-examples/csp/databricks/generate-init-script.ipynb deleted file mode 100644 index d96dbe59d..000000000 --- a/docs/get-started/xgboost-examples/csp/databricks/generate-init-script.ipynb +++ /dev/null @@ -1,166 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Download latest Jars" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "dbutils.fs.mkdirs(\"dbfs:/FileStore/jars/\")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "%sh\n", - "cd ../../dbfs/FileStore/jars/\n", - "sudo wget -O rapids-4-spark_2.12-23.04.0.jar https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.04.0/rapids-4-spark_2.12-23.04.0.jar\n", - "sudo wget -O xgboost4j-gpu_2.12-1.7.1.jar https://repo1.maven.org/maven2/ml/dmlc/xgboost4j-gpu_2.12/1.7.1/xgboost4j-gpu_2.12-1.7.1.jar\n", - "sudo wget -O xgboost4j-spark-gpu_2.12-1.7.1.jar https://repo1.maven.org/maven2/ml/dmlc/xgboost4j-spark-gpu_2.12/1.7.1/xgboost4j-spark-gpu_2.12-1.7.1.jar\n", - "ls -ltr\n", - "\n", - "# Your Jars are downloaded in dbfs:/FileStore/jars directory" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create a Directory for your init script" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "dbutils.fs.mkdirs(\"dbfs:/databricks/init_scripts/\")" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "dbutils.fs.put(\"/databricks/init_scripts/init.sh\",\"\"\"\n", - "#!/bin/bash\n", - "sudo rm -f /databricks/jars/spark--maven-trees--ml--9.x--xgboost-gpu--ml.dmlc--xgboost4j-gpu_2.12--ml.dmlc__xgboost4j-gpu_2.12__1.4.1.jar\n", - "sudo rm -f /databricks/jars/spark--maven-trees--ml--9.x--xgboost-gpu--ml.dmlc--xgboost4j-spark-gpu_2.12--ml.dmlc__xgboost4j-spark-gpu_2.12__1.4.1.jar\n", - "\n", - "sudo cp /dbfs/FileStore/jars/xgboost4j-gpu_2.12-1.7.1.jar /databricks/jars/\n", - "sudo cp /dbfs/FileStore/jars/rapids-4-spark_2.12-23.04.0.jar /databricks/jars/\n", - "sudo cp /dbfs/FileStore/jars/xgboost4j-spark-gpu_2.12-1.7.1.jar /databricks/jars/\"\"\", True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Confirm your init script is in the new directory" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "%sh\n", - "cd ../../dbfs/databricks/init_scripts\n", - "pwd\n", - "ls -ltr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Download the Mortgage Dataset into your local machine and upload Data using import Data" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "dbutils.fs.mkdirs(\"dbfs:/FileStore/tables/\")" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "%sh\n", - "cd /dbfs/FileStore/tables/\n", - "wget -O mortgage.zip https://rapidsai-data.s3.us-east-2.amazonaws.com/spark/mortgage.zip\n", - "ls\n", - "unzip mortgage.zip" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "%sh\n", - "pwd\n", - "cd ../../dbfs/FileStore/tables\n", - "ls -ltr mortgage/csv/*" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Next steps\n", - "\n", - "1. Edit your cluster, adding an initialization script from `dbfs:/databricks/init_scripts/init.sh` in the \"Advanced Options\" under \"Init Scripts\" tab\n", - "2. Reboot the cluster\n", - "3. Go to \"Libraries\" tab under your cluster and install `dbfs:/FileStore/jars/xgboost4j-spark-gpu_2.12-1.7.1.jar` in your cluster by selecting the \"DBFS\" option for installing jars\n", - "4. Import the mortgage example notebook from `https://github.com/NVIDIA/spark-rapids-examples/blob/branch-23.04/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb`\n", - "5. Inside the mortgage example notebook, update the data paths\n", - " `train_data = reader.schema(schema).option('header', True).csv('/data/mortgage/csv/small-train.csv')`\n", - " `trans_data = reader.schema(schema).option('header', True).csv('/data/mortgage/csv/small-trans.csv')`" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.2" - }, - "name": "Init Scripts_demo", - "notebookId": 2585487876834616 - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/docs/get-started/xgboost-examples/csp/databricks/init.sh b/docs/get-started/xgboost-examples/csp/databricks/init.sh new file mode 100644 index 000000000..953e247d9 --- /dev/null +++ b/docs/get-started/xgboost-examples/csp/databricks/init.sh @@ -0,0 +1,17 @@ +sudo rm -f /databricks/jars/spark--maven-trees--ml--10.x--xgboost-gpu--ml.dmlc--xgboost4j-gpu_2.12--ml.dmlc__xgboost4j-gpu_2.12__1.5.2.jar +sudo rm -f /databricks/jars/spark--maven-trees--ml--10.x--xgboost-gpu--ml.dmlc--xgboost4j-spark-gpu_2.12--ml.dmlc__xgboost4j-spark-gpu_2.12__1.5.2.jar + +sudo wget -O /databricks/jars/rapids-4-spark_2.12-23.04.0.jar https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.04.0/rapids-4-spark_2.12-23.04.0.jar +sudo wget -O /databricks/jars/xgboost4j-gpu_2.12-1.7.1.jar https://repo1.maven.org/maven2/ml/dmlc/xgboost4j-gpu_2.12/1.7.1/xgboost4j-gpu_2.12-1.7.1.jar +sudo wget -O /databricks/jars/xgboost4j-spark-gpu_2.12-1.7.1.jar https://repo1.maven.org/maven2/ml/dmlc/xgboost4j-spark-gpu_2.12/1.7.1/xgboost4j-spark-gpu_2.12-1.7.1.jar +ls -ltr + +mkdir -p /dbfs/FileStore/tables/ +cd /dbfs/FileStore/tables/ +# Note that this is just a dummy dataset for quickly hands on, please refer the instructions to download the full dataset: +# https://github.com/NVIDIA/spark-rapids-examples/blob/main/docs/get-started/xgboost-examples/dataset/mortgage.md +wget -O mortgage.zip https://rapidsai-data.s3.us-east-2.amazonaws.com/spark/mortgage.zip +ls +unzip -o mortgage.zip +pwd +ls -ltr mortgage/csv/* \ No newline at end of file diff --git a/docs/img/databricks/initscript.png b/docs/img/databricks/initscript.png index 01111a5235a408da9d613fabbe7bd94d865ed870..56207b26b897a0e9a2390cd99fb7dee481acab0c 100644 GIT binary patch literal 40769 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 literal 12946 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 Uki3 Date: Thu, 29 Jun 2023 10:26:52 +0800 Subject: [PATCH 11/12] update the release version (#304) Signed-off-by: liyuan --- .../xgboost-examples/csp/databricks/databricks.md | 4 ++-- docs/get-started/xgboost-examples/csp/databricks/init.sh | 2 +- .../xgboost-examples/on-prem-cluster/kubernetes-scala.md | 2 +- .../prepare-package-data/preparation-python.md | 2 +- .../prepare-package-data/preparation-scala.md | 2 +- examples/ML+DL-Examples/Spark-cuML/pca/Dockerfile | 2 +- examples/ML+DL-Examples/Spark-cuML/pca/README.md | 4 ++-- examples/ML+DL-Examples/Spark-cuML/pca/pom.xml | 4 ++-- examples/ML+DL-Examples/Spark-cuML/pca/spark-submit.sh | 6 +++--- .../micro-benchmarks/notebooks/micro-benchmarks-gpu.ipynb | 2 +- examples/UDF-Examples/RAPIDS-accelerated-UDFs/README.md | 2 +- examples/UDF-Examples/Spark-cuSpatial/Dockerfile.awsdb | 2 +- examples/UDF-Examples/Spark-cuSpatial/README.md | 7 ++++--- .../notebooks/cuspatial_sample_standalone.ipynb | 2 +- .../Spark-cuSpatial/src/main/native/CMakeLists.txt | 2 +- .../agaricus/notebooks/python/agaricus-gpu.ipynb | 2 +- .../mortgage/notebooks/python/MortgageETL+XGBoost.ipynb | 2 +- .../mortgage/notebooks/python/MortgageETL.ipynb | 6 +++--- .../mortgage/notebooks/python/cv-mortgage-gpu.ipynb | 2 +- .../mortgage/notebooks/python/mortgage-gpu.ipynb | 2 +- .../mortgage/notebooks/scala/mortgage-ETL.ipynb | 8 ++++---- .../taxi/notebooks/python/cv-taxi-gpu.ipynb | 2 +- .../XGBoost-Examples/taxi/notebooks/python/taxi-ETL.ipynb | 4 ++-- .../XGBoost-Examples/taxi/notebooks/python/taxi-gpu.ipynb | 2 +- .../XGBoost-Examples/taxi/notebooks/scala/taxi-ETL.ipynb | 4 ++-- ...r Apache Spark] Profiling Tool Notebook Template.ipynb | 2 +- ...ache Spark] Qualification Tool Notebook Template.ipynb | 2 +- 27 files changed, 42 insertions(+), 41 deletions(-) diff --git a/docs/get-started/xgboost-examples/csp/databricks/databricks.md b/docs/get-started/xgboost-examples/csp/databricks/databricks.md index 28fa17470..d63f7da28 100644 --- a/docs/get-started/xgboost-examples/csp/databricks/databricks.md +++ b/docs/get-started/xgboost-examples/csp/databricks/databricks.md @@ -21,7 +21,7 @@ Navigate to your home directory in the UI and select **Create** > **File** from create an `init.sh` scripts with contents: ```bash #!/bin/bash - sudo wget -O /databricks/jars/rapids-4-spark_2.12-23.04.0.jar https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.04.0/rapids-4-spark_2.12-23.04.0.jar + sudo wget -O /databricks/jars/rapids-4-spark_2.12-23.06.0.jar https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.06.0/rapids-4-spark_2.12-23.06.0.jar ``` 1. Select the Databricks Runtime Version from one of the supported runtimes specified in the Prerequisites section. @@ -68,7 +68,7 @@ create an `init.sh` scripts with contents: ```bash spark.rapids.sql.python.gpu.enabled true spark.python.daemon.module rapids.daemon_databricks - spark.executorEnv.PYTHONPATH /databricks/jars/rapids-4-spark_2.12-23.04.0.jar:/databricks/spark/python + spark.executorEnv.PYTHONPATH /databricks/jars/rapids-4-spark_2.12-23.06.0.jar:/databricks/spark/python ``` Note that since python memory pool require installing the cudf library, so you need to install cudf library in each worker nodes `pip install cudf-cu11 --extra-index-url=https://pypi.nvidia.com` or disable python memory pool diff --git a/docs/get-started/xgboost-examples/csp/databricks/init.sh b/docs/get-started/xgboost-examples/csp/databricks/init.sh index 953e247d9..9e35f2727 100644 --- a/docs/get-started/xgboost-examples/csp/databricks/init.sh +++ b/docs/get-started/xgboost-examples/csp/databricks/init.sh @@ -1,7 +1,7 @@ sudo rm -f /databricks/jars/spark--maven-trees--ml--10.x--xgboost-gpu--ml.dmlc--xgboost4j-gpu_2.12--ml.dmlc__xgboost4j-gpu_2.12__1.5.2.jar sudo rm -f /databricks/jars/spark--maven-trees--ml--10.x--xgboost-gpu--ml.dmlc--xgboost4j-spark-gpu_2.12--ml.dmlc__xgboost4j-spark-gpu_2.12__1.5.2.jar -sudo wget -O /databricks/jars/rapids-4-spark_2.12-23.04.0.jar https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.04.0/rapids-4-spark_2.12-23.04.0.jar +sudo wget -O /databricks/jars/rapids-4-spark_2.12-23.06.0.jar https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.06.0/rapids-4-spark_2.12-23.06.0.jar sudo wget -O /databricks/jars/xgboost4j-gpu_2.12-1.7.1.jar https://repo1.maven.org/maven2/ml/dmlc/xgboost4j-gpu_2.12/1.7.1/xgboost4j-gpu_2.12-1.7.1.jar sudo wget -O /databricks/jars/xgboost4j-spark-gpu_2.12-1.7.1.jar https://repo1.maven.org/maven2/ml/dmlc/xgboost4j-spark-gpu_2.12/1.7.1/xgboost4j-spark-gpu_2.12-1.7.1.jar ls -ltr diff --git a/docs/get-started/xgboost-examples/on-prem-cluster/kubernetes-scala.md b/docs/get-started/xgboost-examples/on-prem-cluster/kubernetes-scala.md index 35c792669..2fba8d97e 100644 --- a/docs/get-started/xgboost-examples/on-prem-cluster/kubernetes-scala.md +++ b/docs/get-started/xgboost-examples/on-prem-cluster/kubernetes-scala.md @@ -40,7 +40,7 @@ export SPARK_DOCKER_IMAGE= export SPARK_DOCKER_TAG= pushd ${SPARK_HOME} -wget https://github.com/NVIDIA/spark-rapids-examples/raw/branch-23.04/dockerfile/Dockerfile +wget https://github.com/NVIDIA/spark-rapids-examples/raw/branch-23.06/dockerfile/Dockerfile # Optionally install additional jars into ${SPARK_HOME}/jars/ diff --git a/docs/get-started/xgboost-examples/prepare-package-data/preparation-python.md b/docs/get-started/xgboost-examples/prepare-package-data/preparation-python.md index 9a868126c..f84e7a167 100644 --- a/docs/get-started/xgboost-examples/prepare-package-data/preparation-python.md +++ b/docs/get-started/xgboost-examples/prepare-package-data/preparation-python.md @@ -5,7 +5,7 @@ For simplicity export the location to these jars. All examples assume the packag ### Download the jars Download the RAPIDS Accelerator for Apache Spark plugin jar - * [RAPIDS Spark Package](https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.04.0/rapids-4-spark_2.12-23.04.0.jar) + * [RAPIDS Spark Package](https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.06.0/rapids-4-spark_2.12-23.06.0.jar) ### Build XGBoost Python Examples diff --git a/docs/get-started/xgboost-examples/prepare-package-data/preparation-scala.md b/docs/get-started/xgboost-examples/prepare-package-data/preparation-scala.md index 221db8aef..00d7899bd 100644 --- a/docs/get-started/xgboost-examples/prepare-package-data/preparation-scala.md +++ b/docs/get-started/xgboost-examples/prepare-package-data/preparation-scala.md @@ -5,7 +5,7 @@ For simplicity export the location to these jars. All examples assume the packag ### Download the jars 1. Download the RAPIDS Accelerator for Apache Spark plugin jar - * [RAPIDS Spark Package](https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.04.0/rapids-4-spark_2.12-23.04.0.jar) + * [RAPIDS Spark Package](https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.06.0/rapids-4-spark_2.12-23.06.0.jar) ### Build XGBoost Scala Examples diff --git a/examples/ML+DL-Examples/Spark-cuML/pca/Dockerfile b/examples/ML+DL-Examples/Spark-cuML/pca/Dockerfile index 4ae6f238c..04f69b52c 100644 --- a/examples/ML+DL-Examples/Spark-cuML/pca/Dockerfile +++ b/examples/ML+DL-Examples/Spark-cuML/pca/Dockerfile @@ -17,7 +17,7 @@ ARG CUDA_VER=11.5.1 FROM nvidia/cuda:${CUDA_VER}-devel-ubuntu20.04 -ARG BRANCH_VER=23.04 +ARG BRANCH_VER=23.06 RUN apt-get update RUN apt-get install -y wget ninja-build git diff --git a/examples/ML+DL-Examples/Spark-cuML/pca/README.md b/examples/ML+DL-Examples/Spark-cuML/pca/README.md index 494a3703e..1af1c8424 100644 --- a/examples/ML+DL-Examples/Spark-cuML/pca/README.md +++ b/examples/ML+DL-Examples/Spark-cuML/pca/README.md @@ -12,7 +12,7 @@ User can also download the release jar from Maven central: [rapids-4-spark-ml_2.12-22.02.0-cuda11.jar](https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark-ml_2.12/22.02.0/rapids-4-spark-ml_2.12-22.02.0-cuda11.jar) -[rapids-4-spark_2.12-23.04.0.jar](https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.04.0/rapids-4-spark_2.12-23.04.0.jar) +[rapids-4-spark_2.12-23.06.0.jar](https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.06.0/rapids-4-spark_2.12-23.06.0.jar) ## Sample code @@ -48,7 +48,7 @@ It is assumed that a Standalone Spark cluster has been set up, the `SPARK_MASTER ``` bash RAPIDS_ML_JAR=PATH_TO_rapids-4-spark-ml_2.12-22.02.0-cuda11.jar - PLUGIN_JAR=PATH_TO_rapids-4-spark_2.12-23.04.0-SNAPSHOT.jar + PLUGIN_JAR=PATH_TO_rapids-4-spark_2.12-23.06.0.jar jupyter toree install \ --spark_home=${SPARK_HOME} \ diff --git a/examples/ML+DL-Examples/Spark-cuML/pca/pom.xml b/examples/ML+DL-Examples/Spark-cuML/pca/pom.xml index 103d3a0cc..205b7a141 100644 --- a/examples/ML+DL-Examples/Spark-cuML/pca/pom.xml +++ b/examples/ML+DL-Examples/Spark-cuML/pca/pom.xml @@ -21,7 +21,7 @@ com.nvidia PCAExample jar - 23.04.0-SNAPSHOT + 23.06.0-SNAPSHOT 8 @@ -51,7 +51,7 @@ com.nvidia rapids-4-spark-ml_2.12 - 23.04.0-SNAPSHOT + 23.06.0-SNAPSHOT diff --git a/examples/ML+DL-Examples/Spark-cuML/pca/spark-submit.sh b/examples/ML+DL-Examples/Spark-cuML/pca/spark-submit.sh index 7d19018f9..6965d597f 100755 --- a/examples/ML+DL-Examples/Spark-cuML/pca/spark-submit.sh +++ b/examples/ML+DL-Examples/Spark-cuML/pca/spark-submit.sh @@ -15,8 +15,8 @@ # limitations under the License. # -ML_JAR=/root/.m2/repository/com/nvidia/rapids-4-spark-ml_2.12/23.04.0-SNAPSHOT/rapids-4-spark-ml_2.12-23.04.0-SNAPSHOT.jar -PLUGIN_JAR=/root/.m2/repository/com/nvidia/rapids-4-spark_2.12/23.04.0-SNAPSHOT/rapids-4-spark_2.12-23.04.0-SNAPSHOT.jar +ML_JAR=/root/.m2/repository/com/nvidia/rapids-4-spark-ml_2.12/23.06.0-SNAPSHOT/rapids-4-spark-ml_2.12-23.06.0-SNAPSHOT.jar +PLUGIN_JAR=/root/.m2/repository/com/nvidia/rapids-4-spark_2.12/23.06.0-SNAPSHOT/rapids-4-spark_2.12-23.06.0-SNAPSHOT.jar $SPARK_HOME/bin/spark-submit \ --master spark://127.0.0.1:7077 \ @@ -38,4 +38,4 @@ $SPARK_HOME/bin/spark-submit \ --conf spark.network.timeout=1000s \ --jars $ML_JAR,$PLUGIN_JAR \ --class com.nvidia.spark.examples.pca.Main \ -/workspace/target/PCAExample-23.04.0-SNAPSHOT.jar +/workspace/target/PCAExample-23.06.0-SNAPSHOT.jar diff --git a/examples/SQL+DF-Examples/micro-benchmarks/notebooks/micro-benchmarks-gpu.ipynb b/examples/SQL+DF-Examples/micro-benchmarks/notebooks/micro-benchmarks-gpu.ipynb index db4f49121..b03365b1d 100644 --- a/examples/SQL+DF-Examples/micro-benchmarks/notebooks/micro-benchmarks-gpu.ipynb +++ b/examples/SQL+DF-Examples/micro-benchmarks/notebooks/micro-benchmarks-gpu.ipynb @@ -22,7 +22,7 @@ "import os\n", "# Change to your cluster ip:port and directories\n", "SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"spark:your-ip:port\")\n", - "RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/your-path/rapids-4-spark_2.12-23.04.0.jar\")\n" + "RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/your-path/rapids-4-spark_2.12-23.06.0.jar\")\n" ] }, { diff --git a/examples/UDF-Examples/RAPIDS-accelerated-UDFs/README.md b/examples/UDF-Examples/RAPIDS-accelerated-UDFs/README.md index 66660c525..f6e4943e8 100644 --- a/examples/UDF-Examples/RAPIDS-accelerated-UDFs/README.md +++ b/examples/UDF-Examples/RAPIDS-accelerated-UDFs/README.md @@ -108,7 +108,7 @@ See above Prerequisites section First finish the steps in "Building with Native Code Examples and run test cases" section, then do the following in the docker. ### Get jars from Maven Central -[rapids-4-spark_2.12-23.04.0.jar](https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.04.0/rapids-4-spark_2.12-23.04.0.jar) +[rapids-4-spark_2.12-23.06.0.jar](https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.06.0/rapids-4-spark_2.12-23.06.0.jar) ### Launch a local mode Spark diff --git a/examples/UDF-Examples/Spark-cuSpatial/Dockerfile.awsdb b/examples/UDF-Examples/Spark-cuSpatial/Dockerfile.awsdb index 39a6e736a..8f7bdc660 100644 --- a/examples/UDF-Examples/Spark-cuSpatial/Dockerfile.awsdb +++ b/examples/UDF-Examples/Spark-cuSpatial/Dockerfile.awsdb @@ -48,7 +48,7 @@ RUN wget -q https://repo.continuum.io/miniconda/Miniconda3-py38_4.9.2-Linux-x86_ conda config --system --set always_yes True && \ conda clean --all -RUN conda install -c rapidsai-nightly -c nvidia -c conda-forge -c defaults libcuspatial=23.06 +RUN conda install -c rapidsai-nightly -c nvidia -c conda-forge -c defaults libcuspatial=23.02 RUN conda install -c conda-forge libgdal==3.3.1 RUN pip install jupyter ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk-amd64 diff --git a/examples/UDF-Examples/Spark-cuSpatial/README.md b/examples/UDF-Examples/Spark-cuSpatial/README.md index bdf7b5c8c..0daf9fe0f 100644 --- a/examples/UDF-Examples/Spark-cuSpatial/README.md +++ b/examples/UDF-Examples/Spark-cuSpatial/README.md @@ -21,6 +21,7 @@ The polygon data can be downloaded from [taxi_zone dataset](https://data.cityofn Note: Please update the `x,y` column names to `Start_Lon,Start_Lat` in the [notebook](./notebooks/cuspatial_sample_db.ipynb) if you test with the download points. +This demo could only work with v23.02.0 version or previous. taxi-zones map: @@ -47,7 +48,7 @@ or [in local machine](#build-in-local-machine) after prerequisites. ``` 2. Bash into the Docker and install libcuspatial ```Bash - conda install -c rapidsai-nightly -c nvidia -c conda-forge -c defaults libcuspatial=23.04 + conda install -c rapidsai-nightly -c nvidia -c conda-forge -c defaults libcuspatial=23.02 ``` 3. Get the code, then run `mvn package`. ```Bash @@ -69,7 +70,7 @@ Note: The docker env is just for building the jar, not for running the applicati 4. [cuspatial](https://github.com/rapidsai/cuspatial): install libcuspatial ```Bash # Install libcuspatial from conda - conda install -c rapidsai-nightly -c nvidia -c conda-forge -c defaults libcuspatial=23.04 + conda install -c rapidsai-nightly -c nvidia -c conda-forge -c defaults libcuspatial=23.02 ``` 5. Build the JAR using `mvn package`. ```Bash @@ -84,7 +85,7 @@ Note: The docker env is just for building the jar, not for running the applicati 1. Set up [a standalone cluster](/docs/get-started/xgboost-examples/on-prem-cluster/standalone-scala.md) of Spark. Make sure the conda/lib is included in LD_LIBRARY_PATH, so that spark executors can load libcuspatial.so. 2. Download Spark RAPIDS JAR - * [Spark RAPIDS JAR v23.04.0](https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.04.0/rapids-4-spark_2.12-23.04.0.jar) or above + * [Spark RAPIDS JAR v23.02.0](https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.02.0/rapids-4-spark_2.12-23.02.0.jar) or above 3. Prepare sample dataset and JARs. Copy the [sample dataset](../../../datasets/cuspatial_data.tar.gz) to `/data/cuspatial_data/`. Copy Spark RAPIDS JAR and `spark-cuspatial-.jar` to `/data/cuspatial_data/jars/`. If you build the `spark-cuspatial-.jar` in docker, please copy the jar from docker to local: diff --git a/examples/UDF-Examples/Spark-cuSpatial/notebooks/cuspatial_sample_standalone.ipynb b/examples/UDF-Examples/Spark-cuSpatial/notebooks/cuspatial_sample_standalone.ipynb index 0bdf84ad8..1fd1c4855 100644 --- a/examples/UDF-Examples/Spark-cuSpatial/notebooks/cuspatial_sample_standalone.ipynb +++ b/examples/UDF-Examples/Spark-cuSpatial/notebooks/cuspatial_sample_standalone.ipynb @@ -9,7 +9,7 @@ "source": [ "from pyspark.sql import SparkSession\n", "import os\n", - "jarsPath = os.getenv(\"JARS_PATH\", \"/data/cuspatial_data/jars/rapids-4-spark_2.12-23.04.0-SNAPSHOT.jar,/data/cuspatial_data/jars/spark-cuspatial-23.04.0-SNAPSHOT.jar\")\n", + "jarsPath = os.getenv(\"JARS_PATH\", \"/data/cuspatial_data/jars/rapids-4-spark_2.12-23.02.0-SNAPSHOT.jar,/data/cuspatial_data/jars/spark-cuspatial-23.02.0-SNAPSHOT.jar\")\n", "spark = SparkSession.builder \\\n", " .config(\"spark.jars\", jarsPath) \\\n", " .config(\"spark.sql.adaptive.enabled\", \"false\") \\\n", diff --git a/examples/UDF-Examples/Spark-cuSpatial/src/main/native/CMakeLists.txt b/examples/UDF-Examples/Spark-cuSpatial/src/main/native/CMakeLists.txt index 09124da0e..4cf897378 100755 --- a/examples/UDF-Examples/Spark-cuSpatial/src/main/native/CMakeLists.txt +++ b/examples/UDF-Examples/Spark-cuSpatial/src/main/native/CMakeLists.txt @@ -16,7 +16,7 @@ cmake_minimum_required(VERSION 3.20.1 FATAL_ERROR) -project(SPATIALUDJNI VERSION 23.04.0 LANGUAGES C CXX CUDA) +project(SPATIALUDJNI VERSION 23.02.0 LANGUAGES C CXX CUDA) ################################################################################################### # - build type ------------------------------------------------------------------------------------ diff --git a/examples/XGBoost-Examples/agaricus/notebooks/python/agaricus-gpu.ipynb b/examples/XGBoost-Examples/agaricus/notebooks/python/agaricus-gpu.ipynb index 1f49e9217..20dc75e36 100644 --- a/examples/XGBoost-Examples/agaricus/notebooks/python/agaricus-gpu.ipynb +++ b/examples/XGBoost-Examples/agaricus/notebooks/python/agaricus-gpu.ipynb @@ -73,7 +73,7 @@ "Setting default log level to \"WARN\".\n", "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", "2022-11-30 06:57:40,550 WARN resource.ResourceUtils: The configuration of cores (exec = 2 task = 1, runnable tasks = 2) will result in wasted resources due to resource gpu limiting the number of runnable tasks per executor to: 1. Please adjust your configuration.\n", - "2022-11-30 06:57:54,195 WARN rapids.RapidsPluginUtils: RAPIDS Accelerator 23.04.0 using cudf 23.04.0.\n", + "2022-11-30 06:57:54,195 WARN rapids.RapidsPluginUtils: RAPIDS Accelerator 23.06.0 using cudf 23.06.0.\n", "2022-11-30 06:57:54,210 WARN rapids.RapidsPluginUtils: spark.rapids.sql.multiThreadedRead.numThreads is set to 20.\n", "2022-11-30 06:57:54,214 WARN rapids.RapidsPluginUtils: RAPIDS Accelerator is enabled, to disable GPU support set `spark.rapids.sql.enabled` to false.\n", "2022-11-30 06:57:54,214 WARN rapids.RapidsPluginUtils: spark.rapids.sql.explain is set to `NOT_ON_GPU`. Set it to 'NONE' to suppress the diagnostics logging about the query placement on the GPU.\n", diff --git a/examples/XGBoost-Examples/mortgage/notebooks/python/MortgageETL+XGBoost.ipynb b/examples/XGBoost-Examples/mortgage/notebooks/python/MortgageETL+XGBoost.ipynb index f8013280d..d8b2a4b52 100644 --- a/examples/XGBoost-Examples/mortgage/notebooks/python/MortgageETL+XGBoost.ipynb +++ b/examples/XGBoost-Examples/mortgage/notebooks/python/MortgageETL+XGBoost.ipynb @@ -6,7 +6,7 @@ "source": [ "# Dataset\n", "\n", - "Dataset is derived from Fannie Mae’s [Single-Family Loan Performance Data](http://www.fanniemae.com/portal/funding-the-market/data/loan-performance-data.html) with all rights reserved by Fannie Mae. Refer to these [instructions](https://github.com/NVIDIA/spark-rapids-examples/blob/branch-23.04/docs/get-started/xgboost-examples/dataset/mortgage.md) to download the dataset.\n", + "Dataset is derived from Fannie Mae’s [Single-Family Loan Performance Data](http://www.fanniemae.com/portal/funding-the-market/data/loan-performance-data.html) with all rights reserved by Fannie Mae. Refer to these [instructions](https://github.com/NVIDIA/spark-rapids-examples/blob/branch-23.06/docs/get-started/xgboost-examples/dataset/mortgage.md) to download the dataset.\n", "\n", "# ETL + XGBoost train & transform\n", "\n", diff --git a/examples/XGBoost-Examples/mortgage/notebooks/python/MortgageETL.ipynb b/examples/XGBoost-Examples/mortgage/notebooks/python/MortgageETL.ipynb index 6c5238f71..81ba037e1 100644 --- a/examples/XGBoost-Examples/mortgage/notebooks/python/MortgageETL.ipynb +++ b/examples/XGBoost-Examples/mortgage/notebooks/python/MortgageETL.ipynb @@ -6,10 +6,10 @@ "source": [ "## Prerequirement\n", "### 1. Download data\n", - "Dataset is derived from Fannie Mae’s [Single-Family Loan Performance Data](http://www.fanniemae.com/portal/funding-the-market/data/loan-performance-data.html) with all rights reserved by Fannie Mae. Refer to these [instructions](https://github.com/NVIDIA/spark-rapids-examples/blob/branch-23.04/docs/get-started/xgboost-examples/dataset/mortgage.md) to download the dataset.\n", + "Dataset is derived from Fannie Mae’s [Single-Family Loan Performance Data](http://www.fanniemae.com/portal/funding-the-market/data/loan-performance-data.html) with all rights reserved by Fannie Mae. Refer to these [instructions](https://github.com/NVIDIA/spark-rapids-examples/blob/branch-23.06/docs/get-started/xgboost-examples/dataset/mortgage.md) to download the dataset.\n", "\n", "### 2. Download needed jars\n", - "* [rapids-4-spark_2.12-23.04.0.jar](https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.04.0/rapids-4-spark_2.12-23.04.0.jar)\n", + "* [rapids-4-spark_2.12-23.06.0.jar](https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.06.0/rapids-4-spark_2.12-23.06.0.jar)\n", "\n", "\n", "### 3. Start Spark Standalone\n", @@ -17,7 +17,7 @@ "\n", "### 4. Add ENV\n", "```\n", - "$ export SPARK_JARS=rapids-4-spark_2.12-23.04.0.jar\n", + "$ export SPARK_JARS=rapids-4-spark_2.12-23.06.0.jar\n", "$ export PYSPARK_DRIVER_PYTHON=jupyter \n", "$ export PYSPARK_DRIVER_PYTHON_OPTS=notebook\n", "```\n", diff --git a/examples/XGBoost-Examples/mortgage/notebooks/python/cv-mortgage-gpu.ipynb b/examples/XGBoost-Examples/mortgage/notebooks/python/cv-mortgage-gpu.ipynb index 6dd135f4e..181cd6e72 100644 --- a/examples/XGBoost-Examples/mortgage/notebooks/python/cv-mortgage-gpu.ipynb +++ b/examples/XGBoost-Examples/mortgage/notebooks/python/cv-mortgage-gpu.ipynb @@ -63,7 +63,7 @@ "Setting default log level to \"WARN\".\n", "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", "2022-11-25 09:34:43,952 WARN resource.ResourceUtils: The configuration of cores (exec = 4 task = 1, runnable tasks = 4) will result in wasted resources due to resource gpu limiting the number of runnable tasks per executor to: 1. Please adjust your configuration.\n", - "2022-11-25 09:34:58,155 WARN rapids.RapidsPluginUtils: RAPIDS Accelerator 23.04.0 using cudf 23.04.0.\n", + "2022-11-25 09:34:58,155 WARN rapids.RapidsPluginUtils: RAPIDS Accelerator 23.06.0 using cudf 23.06.0.\n", "2022-11-25 09:34:58,171 WARN rapids.RapidsPluginUtils: spark.rapids.sql.multiThreadedRead.numThreads is set to 20.\n", "2022-11-25 09:34:58,175 WARN rapids.RapidsPluginUtils: RAPIDS Accelerator is enabled, to disable GPU support set `spark.rapids.sql.enabled` to false.\n", "2022-11-25 09:34:58,175 WARN rapids.RapidsPluginUtils: spark.rapids.sql.explain is set to `NOT_ON_GPU`. Set it to 'NONE' to suppress the diagnostics logging about the query placement on the GPU.\n" diff --git a/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb b/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb index e684a7c7b..8aacef607 100644 --- a/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb +++ b/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb @@ -84,7 +84,7 @@ "22/11/24 06:14:06 INFO org.apache.spark.SparkEnv: Registering BlockManagerMaster\n", "22/11/24 06:14:06 INFO org.apache.spark.SparkEnv: Registering BlockManagerMasterHeartbeat\n", "22/11/24 06:14:06 INFO org.apache.spark.SparkEnv: Registering OutputCommitCoordinator\n", - "22/11/24 06:14:07 WARN com.nvidia.spark.rapids.RapidsPluginUtils: RAPIDS Accelerator 23.04.0 using cudf 23.04.0.\n", + "22/11/24 06:14:07 WARN com.nvidia.spark.rapids.RapidsPluginUtils: RAPIDS Accelerator 23.06.0 using cudf 23.06.0.\n", "22/11/24 06:14:07 WARN com.nvidia.spark.rapids.RapidsPluginUtils: spark.rapids.sql.multiThreadedRead.numThreads is set to 20.\n", "22/11/24 06:14:07 WARN com.nvidia.spark.rapids.RapidsPluginUtils: RAPIDS Accelerator is enabled, to disable GPU support set `spark.rapids.sql.enabled` to false.\n", "22/11/24 06:14:07 WARN com.nvidia.spark.rapids.RapidsPluginUtils: spark.rapids.sql.explain is set to `NOT_ON_GPU`. Set it to 'NONE' to suppress the diagnostics logging about the query placement on the GPU.\n" diff --git a/examples/XGBoost-Examples/mortgage/notebooks/scala/mortgage-ETL.ipynb b/examples/XGBoost-Examples/mortgage/notebooks/scala/mortgage-ETL.ipynb index 62a16c870..ac13a3ca0 100644 --- a/examples/XGBoost-Examples/mortgage/notebooks/scala/mortgage-ETL.ipynb +++ b/examples/XGBoost-Examples/mortgage/notebooks/scala/mortgage-ETL.ipynb @@ -16,18 +16,18 @@ "source": [ "## Prerequirement\n", "### 1. Download data\n", - "\n", - "Refer to these [instructions](https://github.com/NVIDIA/spark-rapids-examples/blob/branch-23.04/docs/get-started/xgboost-examples/dataset/mortgage.md) to download the dataset.\n", + "\n", + "Refer to these [instructions](https://github.com/NVIDIA/spark-rapids-examples/blob/branch-23.06/docs/get-started/xgboost-examples/dataset/mortgage.md) to download the dataset.\n", "\n", "### 2. Download needed jars\n", - "* [rapids-4-spark_2.12-23.04.0.jar](https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.04.0/rapids-4-spark_2.12-23.04.0.jar)\n", + "* [rapids-4-spark_2.12-23.06.0.jar](https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.06.0/rapids-4-spark_2.12-23.06.0.jar)\n", "\n", "### 3. Start Spark Standalone\n", "Before Running the script, please setup Spark standalone mode\n", "\n", "### 4. Add ENV\n", "```\n", - "$ export SPARK_JARS=rapids-4-spark_2.12-23.04.0-SNAPSHOT.jar\n", + "$ export SPARK_JARS=rapids-4-spark_2.12-23.06.0-SNAPSHOT.jar\n", "\n", "```\n", "\n", diff --git a/examples/XGBoost-Examples/taxi/notebooks/python/cv-taxi-gpu.ipynb b/examples/XGBoost-Examples/taxi/notebooks/python/cv-taxi-gpu.ipynb index 2846b00cc..cd9afb482 100644 --- a/examples/XGBoost-Examples/taxi/notebooks/python/cv-taxi-gpu.ipynb +++ b/examples/XGBoost-Examples/taxi/notebooks/python/cv-taxi-gpu.ipynb @@ -62,7 +62,7 @@ "Setting default log level to \"WARN\".\n", "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", "2022-11-30 08:02:10,103 WARN resource.ResourceUtils: The configuration of cores (exec = 2 task = 1, runnable tasks = 2) will result in wasted resources due to resource gpu limiting the number of runnable tasks per executor to: 1. Please adjust your configuration.\n", - "2022-11-30 08:02:23,737 WARN rapids.RapidsPluginUtils: RAPIDS Accelerator 23.04.0 using cudf 23.04.0.\n", + "2022-11-30 08:02:23,737 WARN rapids.RapidsPluginUtils: RAPIDS Accelerator 23.06.0 using cudf 23.06.0.\n", "2022-11-30 08:02:23,752 WARN rapids.RapidsPluginUtils: spark.rapids.sql.multiThreadedRead.numThreads is set to 20.\n", "2022-11-30 08:02:23,756 WARN rapids.RapidsPluginUtils: RAPIDS Accelerator is enabled, to disable GPU support set `spark.rapids.sql.enabled` to false.\n", "2022-11-30 08:02:23,757 WARN rapids.RapidsPluginUtils: spark.rapids.sql.explain is set to `NOT_ON_GPU`. Set it to 'NONE' to suppress the diagnostics logging about the query placement on the GPU.\n", diff --git a/examples/XGBoost-Examples/taxi/notebooks/python/taxi-ETL.ipynb b/examples/XGBoost-Examples/taxi/notebooks/python/taxi-ETL.ipynb index 03a7568c2..52db40fb1 100644 --- a/examples/XGBoost-Examples/taxi/notebooks/python/taxi-ETL.ipynb +++ b/examples/XGBoost-Examples/taxi/notebooks/python/taxi-ETL.ipynb @@ -19,14 +19,14 @@ "All data could be found at https://www1.nyc.gov/site/tlc/about/tlc-trip-record-data.page\n", "\n", "### 2. Download needed jars\n", - "* [rapids-4-spark_2.12-23.04.0.jar](https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.04.0/rapids-4-spark_2.12-23.04.0.jar)\n", + "* [rapids-4-spark_2.12-23.06.0.jar](https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.06.0/rapids-4-spark_2.12-23.06.0.jar)\n", "\n", "### 3. Start Spark Standalone\n", "Before running the script, please setup Spark standalone mode\n", "\n", "### 4. Add ENV\n", "```\n", - "$ export SPARK_JARS=rapids-4-spark_2.12-23.04.0.jar\n", + "$ export SPARK_JARS=rapids-4-spark_2.12-23.06.0.jar\n", "$ export PYSPARK_DRIVER_PYTHON=jupyter \n", "$ export PYSPARK_DRIVER_PYTHON_OPTS=notebook\n", "```\n", diff --git a/examples/XGBoost-Examples/taxi/notebooks/python/taxi-gpu.ipynb b/examples/XGBoost-Examples/taxi/notebooks/python/taxi-gpu.ipynb index 6a7acd668..6f74c75ca 100644 --- a/examples/XGBoost-Examples/taxi/notebooks/python/taxi-gpu.ipynb +++ b/examples/XGBoost-Examples/taxi/notebooks/python/taxi-gpu.ipynb @@ -73,7 +73,7 @@ "Setting default log level to \"WARN\".\n", "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", "2022-11-30 07:51:19,480 WARN resource.ResourceUtils: The configuration of cores (exec = 2 task = 1, runnable tasks = 2) will result in wasted resources due to resource gpu limiting the number of runnable tasks per executor to: 1. Please adjust your configuration.\n", - "2022-11-30 07:51:33,277 WARN rapids.RapidsPluginUtils: RAPIDS Accelerator 23.04.0 using cudf 23.04.0.\n", + "2022-11-30 07:51:33,277 WARN rapids.RapidsPluginUtils: RAPIDS Accelerator 23.06.0 using cudf 23.06.0.\n", "2022-11-30 07:51:33,292 WARN rapids.RapidsPluginUtils: spark.rapids.sql.multiThreadedRead.numThreads is set to 20.\n", "2022-11-30 07:51:33,295 WARN rapids.RapidsPluginUtils: RAPIDS Accelerator is enabled, to disable GPU support set `spark.rapids.sql.enabled` to false.\n", "2022-11-30 07:51:33,295 WARN rapids.RapidsPluginUtils: spark.rapids.sql.explain is set to `NOT_ON_GPU`. Set it to 'NONE' to suppress the diagnostics logging about the query placement on the GPU.\n", diff --git a/examples/XGBoost-Examples/taxi/notebooks/scala/taxi-ETL.ipynb b/examples/XGBoost-Examples/taxi/notebooks/scala/taxi-ETL.ipynb index 64d5a6508..3ee2f22c0 100644 --- a/examples/XGBoost-Examples/taxi/notebooks/scala/taxi-ETL.ipynb +++ b/examples/XGBoost-Examples/taxi/notebooks/scala/taxi-ETL.ipynb @@ -19,14 +19,14 @@ "All data could be found at https://www1.nyc.gov/site/tlc/about/tlc-trip-record-data.page\n", "\n", "### 2. Download needed jar\n", - "* [rapids-4-spark_2.12-23.04.0.jar](https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.04.0/rapids-4-spark_2.12-23.04.0.jar)\n", + "* [rapids-4-spark_2.12-23.06.0.jar](https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.12/23.06.0/rapids-4-spark_2.12-23.06.0.jar)\n", "\n", "### 3. Start Spark Standalone\n", "Before running the script, please setup Spark standalone mode\n", "\n", "### 4. Add ENV\n", "```\n", - "$ export SPARK_JARS=rapids-4-spark_2.12-23.04.0.jar\n", + "$ export SPARK_JARS=rapids-4-spark_2.12-23.06.0.jar\n", "\n", "```\n", "\n", diff --git a/tools/databricks/[RAPIDS Accelerator for Apache Spark] Profiling Tool Notebook Template.ipynb b/tools/databricks/[RAPIDS Accelerator for Apache Spark] Profiling Tool Notebook Template.ipynb index df3fb4bfc..e8992a2cd 100644 --- a/tools/databricks/[RAPIDS Accelerator for Apache Spark] Profiling Tool Notebook Template.ipynb +++ b/tools/databricks/[RAPIDS Accelerator for Apache Spark] Profiling Tool Notebook Template.ipynb @@ -1 +1 @@ -{"cells":[{"cell_type":"markdown","source":["# Welcome to the Profiling Tool for the RAPIDS Accelerator for Apache Spark\nTo run the tool, you need to enter a log path that represents the DBFS location for your Spark GPU event logs. Then you can select \"Run all\" to execute the notebook. After the notebook completes, you will see various output tables show up below. More options for running the profiling tool can be found here: https://nvidia.github.io/spark-rapids/docs/spark-profiling-tool.html#profiling-tool-options.\n\n## GPU Job Tuning Recommendations\nThis has general suggestions for tuning your applications to run optimally on GPUs.\n\n## Per-Job Profile\nThe profiler output includes information about the application, data sources, executors, SQL stages, Spark properties, and key application metrics at the job and stage levels."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"5156a76c-7af7-465d-aff4-41a2e54e3595","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["import json\nimport requests\nimport base64\nimport shlex\nimport subprocess\nimport pandas as pd\n\nTOOL_JAR_URL = 'https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark-tools_2.12/23.04.0/rapids-4-spark-tools_2.12-23.04.0.jar'\nTOOL_JAR_LOCAL_PATH = '/tmp/rapids-4-spark-tools.jar'\n\n# Profiling tool output directory.\nOUTPUT_DIR = '/tmp' \n\nresponse = requests.get(TOOL_JAR_URL)\nopen(TOOL_JAR_LOCAL_PATH, \"wb\").write(response.content)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"53b4d770-9db6-4bd7-9b93-d036d375eac5","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"datasetInfos":[],"data":"
Out[59]: 2011685
","removedWidgets":[],"addedWidgets":{},"metadata":{},"type":"html","arguments":{}}},"output_type":"display_data","data":{"text/html":["\n
Out[59]: 2011685
"]}}],"execution_count":0},{"cell_type":"code","source":["dbutils.widgets.text(\"log_path\", \"\")\neventlog_string=dbutils.widgets.get(\"log_path\") \n\ndbutils.widgets.text(\"output_path\", \"\")\noutputpath_string=dbutils.widgets.get(\"output_path\")"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"f0e4371a-d2d9-4449-81ed-8f6c61ae8f80","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"datasetInfos":[],"data":"
","removedWidgets":[],"addedWidgets":{},"metadata":{},"type":"html","arguments":{}}},"output_type":"display_data","data":{"text/html":["\n
"]}}],"execution_count":0},{"cell_type":"code","source":["worker_info_path = \"/tmp/worker_info.yaml\"\n\nworker_info = \"\"\"\n system:\n numCores: 32\n memory: 212992MiB\n numWorkers: 5\n gpu:\n memory: 15109MiB\n count: 4\n name: T4\n softwareProperties:\n spark.driver.maxResultSize: 7680m\n spark.driver.memory: 15360m\n spark.executor.cores: '8'\n spark.executor.instances: '2'\n spark.executor.memory: 47222m\n spark.executorEnv.OPENBLAS_NUM_THREADS: '1'\n spark.scheduler.mode: FAIR\n spark.sql.cbo.enabled: 'true'\n spark.ui.port: '0'\n spark.yarn.am.memory: 640m\n\"\"\"\n\nwith open(worker_info_path, 'w') as f:\n f.write(worker_info)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"6c35e478-abe6-49b7-97f9-a8aba71f11d3","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"datasetInfos":[],"data":"
","removedWidgets":[],"addedWidgets":{},"metadata":{},"type":"html","arguments":{}}},"output_type":"display_data","data":{"text/html":["\n
"]}}],"execution_count":0},{"cell_type":"code","source":["!java -Xmx10g -cp /tmp/rapids-4-spark-tools.jar:/databricks/jars/* com.nvidia.spark.rapids.tool.profiling.ProfileMain --csv --worker-info $worker_info_path --auto-tuner -o $outputpath_string $eventlog_string &> /tmp/prof_debug.log"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"e9e7cecf-c2dc-4a0f-aea1-61a323e4ccc4","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"datasetInfos":[],"data":"
","removedWidgets":[],"addedWidgets":{},"metadata":{},"type":"html","arguments":{}}},"output_type":"display_data","data":{"text/html":["\n
"]}}],"execution_count":0},{"cell_type":"code","source":["import os\n\napp_df = pd.DataFrame(columns = ['appId', 'appName'])\n\nfor x in os.scandir(outputpath_string + \"/rapids_4_spark_profile/\"):\n tmp_df = pd.read_csv(x.path + \"/application_information.csv\")\n app_df = app_df.append(tmp_df[['appId', 'appName']])"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"be0a2da7-1ee3-475e-96f9-303779edfd85","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"datasetInfos":[],"data":"
","removedWidgets":[],"addedWidgets":{},"metadata":{},"type":"html","arguments":{}}},"output_type":"display_data","data":{"text/html":["\n
"]}}],"execution_count":0},{"cell_type":"markdown","source":["## GPU Job Tuning Recommendations"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"a1e326ec-5701-4b08-ae0f-7df0c8440038","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["app_list = app_df[\"appId\"].tolist()\napp_recommendations = pd.DataFrame(columns=['app', 'recommendations'])\n\nfor app in app_list:\n app_file = open(outputpath_string + \"/rapids_4_spark_profile/\" + app + \"/profile.log\")\n recommendations_start = 0\n recommendations_str = \"\"\n for line in app_file:\n if recommendations_start == 1:\n recommendations_str = recommendations_str + line\n if \"### D. Recommended Configuration ###\" in line:\n recommendations_start = 1\n app_recommendations = app_recommendations.append({'app': app, 'recommendations': recommendations_str}, ignore_index=True)\n \ndisplay(app_recommendations)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"4979f78c-44a0-4e54-b803-e5e194b71104","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["app-20220210005817-0212","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=1197m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004538-0189","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210000414-0117","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2353m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005713-0210","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210000744-0123","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002521-0154","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004801-0193","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3158m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002620-0156","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210001501-0135","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=1365m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001417-0134","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=1365m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001930-0143","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005502-0206","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002316-0150","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004324-0185","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005039-0198","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210004834-0194","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2099m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004011-0180","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004656-0191","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210001324-0133","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2225m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210000856-0125","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210000241-0114","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002105-0146","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210000312-0115","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210003325-0169","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002654-0157","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005425-0205","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=1509m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210000700-0122","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001109-0129","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002138-0147","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001717-0139","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210000018-0110","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002725-0158","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210000933-0126","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210004617-0190","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005846-0213","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=1197m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210002757-0159","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001038-0128","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210000628-0121","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3404m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210001959-0144","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210000556-0120","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004727-0192","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3354m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005222-0201","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210000825-0124","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005536-0207","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001139-0130","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210000343-0116","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210003705-0176","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2337m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210003359-0170","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005611-0208","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2974m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210000119-0112","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3061m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005322-0203","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210003900-0179","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004355-0186","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001648-0138","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002938-0162","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005354-0204","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210001821-0141","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2530m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210005252-0202","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210002452-0153","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001617-0137","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210003254-0168","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004507-0188","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210001751-0140","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005642-0209","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210004905-0195","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210003751-0177","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002030-0145","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210001854-0142","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210002549-0155","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210001239-0132","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2225m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004428-0187","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3796m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002240-0149","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005147-0200","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2974m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220523230623-0000","\nSpark Properties:\n--conf spark.executor.instances=20\n--conf spark.executor.memory=16384m\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=6\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' should be increased since spilling occurred.\n"],["app-20220210000207-0113","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220209235945-0109","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210002349-0151","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002421-0152","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210000448-0118","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001005-0127","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210003149-0166","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210003635-0175","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210003223-0167","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004041-0181","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210003532-0173","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210003607-0174","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210003048-0164","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210004145-0183","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210003825-0178","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210003118-0165","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210000049-0111","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210000519-0119","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3061m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210003015-0163","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005744-0211","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210005111-0199","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004217-0184","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002904-0161","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3796m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001546-0136","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210003503-0172","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001209-0131","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004114-0182","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210002208-0148","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210002833-0160","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210003431-0171","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"app","type":"\"string\"","metadata":"{}"},{"name":"recommendations","type":"\"string\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
apprecommendations
app-20220210005817-0212\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=1197m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004538-0189\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210000414-0117\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2353m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005713-0210\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210000744-0123\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002521-0154\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004801-0193\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3158m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002620-0156\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210001501-0135\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=1365m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001417-0134\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=1365m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001930-0143\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005502-0206\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002316-0150\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004324-0185\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005039-0198\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210004834-0194\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2099m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004011-0180\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004656-0191\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210001324-0133\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2225m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210000856-0125\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210000241-0114\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002105-0146\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210000312-0115\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210003325-0169\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002654-0157\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005425-0205\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=1509m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210000700-0122\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001109-0129\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002138-0147\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001717-0139\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210000018-0110\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002725-0158\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210000933-0126\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210004617-0190\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005846-0213\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=1197m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210002757-0159\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001038-0128\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210000628-0121\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3404m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210001959-0144\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210000556-0120\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004727-0192\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3354m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005222-0201\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210000825-0124\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005536-0207\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001139-0130\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210000343-0116\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210003705-0176\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2337m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210003359-0170\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005611-0208\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2974m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210000119-0112\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3061m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005322-0203\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210003900-0179\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004355-0186\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001648-0138\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002938-0162\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005354-0204\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210001821-0141\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2530m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210005252-0202\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210002452-0153\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001617-0137\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210003254-0168\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004507-0188\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210001751-0140\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005642-0209\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210004905-0195\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210003751-0177\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002030-0145\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210001854-0142\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210002549-0155\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210001239-0132\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2225m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004428-0187\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3796m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002240-0149\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005147-0200\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2974m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220523230623-0000\nSpark Properties:\n--conf spark.executor.instances=20\n--conf spark.executor.memory=16384m\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=6\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' should be increased since spilling occurred.\n
app-20220210000207-0113\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220209235945-0109\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210002349-0151\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002421-0152\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210000448-0118\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001005-0127\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210003149-0166\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210003635-0175\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210003223-0167\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004041-0181\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210003532-0173\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210003607-0174\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210003048-0164\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210004145-0183\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210003825-0178\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210003118-0165\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210000049-0111\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210000519-0119\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3061m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210003015-0163\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005744-0211\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210005111-0199\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004217-0184\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002904-0161\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3796m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001546-0136\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210003503-0172\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001209-0131\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004114-0182\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210002208-0148\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210002833-0160\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210003431-0171\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
"]}}],"execution_count":0}],"metadata":{"application/vnd.databricks.v1+notebook":{"notebookName":"[RAPIDS Accelerator for Apache Spark] Profiling Tool Notebook Template","dashboards":[{"elements":[{"elementNUID":"be0a2da7-1ee3-475e-96f9-303779edfd85","dashboardResultIndex":0,"guid":"05eef9d3-7c55-4e26-8d1f-fa80338359e6","resultIndex":null,"options":null,"position":{"x":0,"y":0,"height":6,"width":24,"z":null},"elementType":"command"}],"guid":"a9ea7799-040a-484e-a59d-c3cdf5072953","layoutOption":{"stack":true,"grid":true},"version":"DashboardViewV1","nuid":"91c1bfb2-695a-4e5c-8a25-848a433108dc","origId":2690941040041430,"title":"Executive View","width":1600,"globalVars":{}},{"elements":[],"guid":"0896a45f-af1b-4849-b6c2-2b6abcb8b97b","layoutOption":{"stack":true,"grid":true},"version":"DashboardViewV1","nuid":"62243296-4562-4f06-90ac-d7a609f19c16","origId":2690941040041431,"title":"App View","width":1920,"globalVars":{}}],"notebookMetadata":{"pythonIndentUnit":2,"widgetLayout":[{"name":"log_path","width":562,"breakBefore":false},{"name":"output_path","width":511,"breakBefore":false}]},"language":"python","widgets":{"log_path":{"nuid":"c7ce3870-db19-4813-b1cb-cead3f4c36f1","currentValue":"/dbfs/user1/profiler_logs","widgetInfo":{"widgetType":"text","name":"log_path","defaultValue":"","label":null,"options":{"widgetType":"text","validationRegex":null}}},"output_path":{"nuid":"a7d1d293-d8c3-452b-9ffb-786ea7a28843","currentValue":"/tmp","widgetInfo":{"widgetType":"text","name":"output_path","defaultValue":"","label":null,"options":{"widgetType":"text","validationRegex":null}}}},"notebookOrigID":2690941040041407}},"nbformat":4,"nbformat_minor":0} +{"cells":[{"cell_type":"markdown","source":["# Welcome to the Profiling Tool for the RAPIDS Accelerator for Apache Spark\nTo run the tool, you need to enter a log path that represents the DBFS location for your Spark GPU event logs. Then you can select \"Run all\" to execute the notebook. After the notebook completes, you will see various output tables show up below. More options for running the profiling tool can be found here: https://nvidia.github.io/spark-rapids/docs/spark-profiling-tool.html#profiling-tool-options.\n\n## GPU Job Tuning Recommendations\nThis has general suggestions for tuning your applications to run optimally on GPUs.\n\n## Per-Job Profile\nThe profiler output includes information about the application, data sources, executors, SQL stages, Spark properties, and key application metrics at the job and stage levels."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"5156a76c-7af7-465d-aff4-41a2e54e3595","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["import json\nimport requests\nimport base64\nimport shlex\nimport subprocess\nimport pandas as pd\n\nTOOL_JAR_URL = 'https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark-tools_2.12/23.06.0/rapids-4-spark-tools_2.12-23.06.0.jar'\nTOOL_JAR_LOCAL_PATH = '/tmp/rapids-4-spark-tools.jar'\n\n# Profiling tool output directory.\nOUTPUT_DIR = '/tmp' \n\nresponse = requests.get(TOOL_JAR_URL)\nopen(TOOL_JAR_LOCAL_PATH, \"wb\").write(response.content)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"53b4d770-9db6-4bd7-9b93-d036d375eac5","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"datasetInfos":[],"data":"
Out[59]: 2011685
","removedWidgets":[],"addedWidgets":{},"metadata":{},"type":"html","arguments":{}}},"output_type":"display_data","data":{"text/html":["\n
Out[59]: 2011685
"]}}],"execution_count":0},{"cell_type":"code","source":["dbutils.widgets.text(\"log_path\", \"\")\neventlog_string=dbutils.widgets.get(\"log_path\") \n\ndbutils.widgets.text(\"output_path\", \"\")\noutputpath_string=dbutils.widgets.get(\"output_path\")"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"f0e4371a-d2d9-4449-81ed-8f6c61ae8f80","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"datasetInfos":[],"data":"
","removedWidgets":[],"addedWidgets":{},"metadata":{},"type":"html","arguments":{}}},"output_type":"display_data","data":{"text/html":["\n
"]}}],"execution_count":0},{"cell_type":"code","source":["worker_info_path = \"/tmp/worker_info.yaml\"\n\nworker_info = \"\"\"\n system:\n numCores: 32\n memory: 212992MiB\n numWorkers: 5\n gpu:\n memory: 15109MiB\n count: 4\n name: T4\n softwareProperties:\n spark.driver.maxResultSize: 7680m\n spark.driver.memory: 15360m\n spark.executor.cores: '8'\n spark.executor.instances: '2'\n spark.executor.memory: 47222m\n spark.executorEnv.OPENBLAS_NUM_THREADS: '1'\n spark.scheduler.mode: FAIR\n spark.sql.cbo.enabled: 'true'\n spark.ui.port: '0'\n spark.yarn.am.memory: 640m\n\"\"\"\n\nwith open(worker_info_path, 'w') as f:\n f.write(worker_info)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"6c35e478-abe6-49b7-97f9-a8aba71f11d3","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"datasetInfos":[],"data":"
","removedWidgets":[],"addedWidgets":{},"metadata":{},"type":"html","arguments":{}}},"output_type":"display_data","data":{"text/html":["\n
"]}}],"execution_count":0},{"cell_type":"code","source":["!java -Xmx10g -cp /tmp/rapids-4-spark-tools.jar:/databricks/jars/* com.nvidia.spark.rapids.tool.profiling.ProfileMain --csv --worker-info $worker_info_path --auto-tuner -o $outputpath_string $eventlog_string &> /tmp/prof_debug.log"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"e9e7cecf-c2dc-4a0f-aea1-61a323e4ccc4","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"datasetInfos":[],"data":"
","removedWidgets":[],"addedWidgets":{},"metadata":{},"type":"html","arguments":{}}},"output_type":"display_data","data":{"text/html":["\n
"]}}],"execution_count":0},{"cell_type":"code","source":["import os\n\napp_df = pd.DataFrame(columns = ['appId', 'appName'])\n\nfor x in os.scandir(outputpath_string + \"/rapids_4_spark_profile/\"):\n tmp_df = pd.read_csv(x.path + \"/application_information.csv\")\n app_df = app_df.append(tmp_df[['appId', 'appName']])"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"be0a2da7-1ee3-475e-96f9-303779edfd85","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"datasetInfos":[],"data":"
","removedWidgets":[],"addedWidgets":{},"metadata":{},"type":"html","arguments":{}}},"output_type":"display_data","data":{"text/html":["\n
"]}}],"execution_count":0},{"cell_type":"markdown","source":["## GPU Job Tuning Recommendations"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"a1e326ec-5701-4b08-ae0f-7df0c8440038","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["app_list = app_df[\"appId\"].tolist()\napp_recommendations = pd.DataFrame(columns=['app', 'recommendations'])\n\nfor app in app_list:\n app_file = open(outputpath_string + \"/rapids_4_spark_profile/\" + app + \"/profile.log\")\n recommendations_start = 0\n recommendations_str = \"\"\n for line in app_file:\n if recommendations_start == 1:\n recommendations_str = recommendations_str + line\n if \"### D. Recommended Configuration ###\" in line:\n recommendations_start = 1\n app_recommendations = app_recommendations.append({'app': app, 'recommendations': recommendations_str}, ignore_index=True)\n \ndisplay(app_recommendations)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"4979f78c-44a0-4e54-b803-e5e194b71104","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["app-20220210005817-0212","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=1197m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004538-0189","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210000414-0117","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2353m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005713-0210","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210000744-0123","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002521-0154","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004801-0193","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3158m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002620-0156","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210001501-0135","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=1365m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001417-0134","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=1365m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001930-0143","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005502-0206","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002316-0150","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004324-0185","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005039-0198","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210004834-0194","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2099m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004011-0180","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004656-0191","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210001324-0133","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2225m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210000856-0125","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210000241-0114","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002105-0146","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210000312-0115","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210003325-0169","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002654-0157","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005425-0205","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=1509m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210000700-0122","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001109-0129","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002138-0147","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001717-0139","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210000018-0110","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002725-0158","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210000933-0126","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210004617-0190","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005846-0213","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=1197m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210002757-0159","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001038-0128","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210000628-0121","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3404m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210001959-0144","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210000556-0120","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004727-0192","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3354m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005222-0201","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210000825-0124","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005536-0207","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001139-0130","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210000343-0116","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210003705-0176","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2337m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210003359-0170","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005611-0208","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2974m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210000119-0112","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3061m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005322-0203","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210003900-0179","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004355-0186","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001648-0138","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002938-0162","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005354-0204","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210001821-0141","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2530m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210005252-0202","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210002452-0153","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001617-0137","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210003254-0168","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004507-0188","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210001751-0140","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005642-0209","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210004905-0195","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210003751-0177","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002030-0145","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210001854-0142","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210002549-0155","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210001239-0132","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2225m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004428-0187","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3796m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002240-0149","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005147-0200","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2974m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220523230623-0000","\nSpark Properties:\n--conf spark.executor.instances=20\n--conf spark.executor.memory=16384m\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=6\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' should be increased since spilling occurred.\n"],["app-20220210000207-0113","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220209235945-0109","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210002349-0151","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002421-0152","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210000448-0118","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001005-0127","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210003149-0166","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210003635-0175","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210003223-0167","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004041-0181","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210003532-0173","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210003607-0174","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210003048-0164","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210004145-0183","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210003825-0178","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210003118-0165","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210000049-0111","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210000519-0119","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3061m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210003015-0163","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210005744-0211","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210005111-0199","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004217-0184","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210002904-0161","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3796m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001546-0136","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210003503-0172","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210001209-0131","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n"],["app-20220210004114-0182","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210002208-0148","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210002833-0160","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"],["app-20220210003431-0171","\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n"]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"app","type":"\"string\"","metadata":"{}"},{"name":"recommendations","type":"\"string\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
apprecommendations
app-20220210005817-0212\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=1197m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004538-0189\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210000414-0117\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2353m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005713-0210\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210000744-0123\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002521-0154\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004801-0193\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3158m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002620-0156\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210001501-0135\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=1365m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001417-0134\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=1365m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001930-0143\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005502-0206\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002316-0150\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004324-0185\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005039-0198\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210004834-0194\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2099m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004011-0180\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004656-0191\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210001324-0133\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2225m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210000856-0125\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210000241-0114\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002105-0146\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210000312-0115\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210003325-0169\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002654-0157\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005425-0205\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=1509m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210000700-0122\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001109-0129\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002138-0147\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001717-0139\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210000018-0110\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002725-0158\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210000933-0126\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210004617-0190\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005846-0213\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=1197m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210002757-0159\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001038-0128\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210000628-0121\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3404m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210001959-0144\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210000556-0120\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004727-0192\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3354m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005222-0201\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210000825-0124\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005536-0207\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001139-0130\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210000343-0116\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210003705-0176\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2337m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210003359-0170\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005611-0208\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2974m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210000119-0112\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3061m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005322-0203\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210003900-0179\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004355-0186\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001648-0138\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002938-0162\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005354-0204\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210001821-0141\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2530m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210005252-0202\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210002452-0153\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001617-0137\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210003254-0168\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004507-0188\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210001751-0140\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005642-0209\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210004905-0195\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210003751-0177\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002030-0145\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210001854-0142\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210002549-0155\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210001239-0132\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2225m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004428-0187\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3796m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002240-0149\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005147-0200\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=2974m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220523230623-0000\nSpark Properties:\n--conf spark.executor.instances=20\n--conf spark.executor.memory=16384m\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.shuffle.partitions=6\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' should be increased since spilling occurred.\n
app-20220210000207-0113\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220209235945-0109\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210002349-0151\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002421-0152\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210000448-0118\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001005-0127\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210003149-0166\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210003635-0175\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210003223-0167\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004041-0181\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210003532-0173\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210003607-0174\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210003048-0164\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210004145-0183\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210003825-0178\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210003118-0165\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210000049-0111\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210000519-0119\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3061m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210003015-0163\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210005744-0211\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210005111-0199\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004217-0184\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210002904-0161\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=3796m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001546-0136\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210003503-0172\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210001209-0131\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n
app-20220210004114-0182\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210002208-0148\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210002833-0160\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
app-20220210003431-0171\nSpark Properties:\n--conf spark.executor.cores=8\n--conf spark.executor.instances=20\n--conf spark.executor.memoryOverhead=5734m\n--conf spark.rapids.memory.pinnedPool.size=4096m\n--conf spark.rapids.sql.concurrentGpuTasks=2\n--conf spark.sql.files.maxPartitionBytes=4096m\n--conf spark.sql.shuffle.partitions=200\n--conf spark.task.resource.gpu.amount=0.125\n\nComments:\n- 'spark.executor.memoryOverhead' was not set.\n- 'spark.executor.memoryOverhead' must be set if using 'spark.rapids.memory.pinnedPool.size\n- 'spark.sql.shuffle.partitions' was not set.\n- Average JVM GC time is very high. Other Garbage Collectors can be used for better performance.\n
"]}}],"execution_count":0}],"metadata":{"application/vnd.databricks.v1+notebook":{"notebookName":"[RAPIDS Accelerator for Apache Spark] Profiling Tool Notebook Template","dashboards":[{"elements":[{"elementNUID":"be0a2da7-1ee3-475e-96f9-303779edfd85","dashboardResultIndex":0,"guid":"05eef9d3-7c55-4e26-8d1f-fa80338359e6","resultIndex":null,"options":null,"position":{"x":0,"y":0,"height":6,"width":24,"z":null},"elementType":"command"}],"guid":"a9ea7799-040a-484e-a59d-c3cdf5072953","layoutOption":{"stack":true,"grid":true},"version":"DashboardViewV1","nuid":"91c1bfb2-695a-4e5c-8a25-848a433108dc","origId":2690941040041430,"title":"Executive View","width":1600,"globalVars":{}},{"elements":[],"guid":"0896a45f-af1b-4849-b6c2-2b6abcb8b97b","layoutOption":{"stack":true,"grid":true},"version":"DashboardViewV1","nuid":"62243296-4562-4f06-90ac-d7a609f19c16","origId":2690941040041431,"title":"App View","width":1920,"globalVars":{}}],"notebookMetadata":{"pythonIndentUnit":2,"widgetLayout":[{"name":"log_path","width":562,"breakBefore":false},{"name":"output_path","width":511,"breakBefore":false}]},"language":"python","widgets":{"log_path":{"nuid":"c7ce3870-db19-4813-b1cb-cead3f4c36f1","currentValue":"/dbfs/user1/profiler_logs","widgetInfo":{"widgetType":"text","name":"log_path","defaultValue":"","label":null,"options":{"widgetType":"text","validationRegex":null}}},"output_path":{"nuid":"a7d1d293-d8c3-452b-9ffb-786ea7a28843","currentValue":"/tmp","widgetInfo":{"widgetType":"text","name":"output_path","defaultValue":"","label":null,"options":{"widgetType":"text","validationRegex":null}}}},"notebookOrigID":2690941040041407}},"nbformat":4,"nbformat_minor":0} diff --git a/tools/databricks/[RAPIDS Accelerator for Apache Spark] Qualification Tool Notebook Template.ipynb b/tools/databricks/[RAPIDS Accelerator for Apache Spark] Qualification Tool Notebook Template.ipynb index 2bf64e7b4..3de6eaa81 100644 --- a/tools/databricks/[RAPIDS Accelerator for Apache Spark] Qualification Tool Notebook Template.ipynb +++ b/tools/databricks/[RAPIDS Accelerator for Apache Spark] Qualification Tool Notebook Template.ipynb @@ -1 +1 @@ -{"cells":[{"cell_type":"markdown","source":["# Welcome to the Qualification Tool for the RAPIDS Accelerator for Apache Spark\nTo run the tool, you need to enter a log path that represents the DBFS location for your Spark CPU event logs. Then you can select \"Run all\" to execute the notebook. After the notebook completes, you will see various output tables show up below. More options for running the qualification tool can be found here: https://nvidia.github.io/spark-rapids/docs/spark-qualification-tool.html#qualification-tool-options.\n\n## Summary Output\nThe report represents the entire app execution, including unsupported operators and non-SQL operations. By default, the applications and queries are sorted in descending order by the following fields:\n- Recommendation;\n- Estimated GPU Speed-up;\n- Estimated GPU Time Saved; and\n- End Time.\n\n## Stages Output\nFor each stage used in SQL operations, the Qualification tool generates the following information:\n1. App ID\n1. Stage ID\n1. Average Speedup Factor: the average estimated speed-up of all the operators in the given stage.\n1. Stage Task Duration: amount of time spent in tasks of SQL Dataframe operations for the given stage.\n1. Unsupported Task Duration: sum of task durations for the unsupported operators. For more details, see Supported Operators.\n1. Stage Estimated: True or False indicates if we had to estimate the stage duration.\n\n## Execs Output\nThe Qualification tool generates a report of the “Exec” in the “SparkPlan” or “Executor Nodes” along with the estimated acceleration on the GPU. Please refer to the Supported Operators guide for more details on limitations on UDFs and unsupported operators.\n1. App ID\n1. SQL ID\n1. Exec Name: example Filter, HashAggregate\n1. Expression Name\n1. Task Speedup Factor: it is simply the average acceleration of the operators based on the original CPU duration of the operator divided by the GPU duration. The tool uses historical queries and benchmarks to estimate a speed-up at an individual operator level to calculate how much a specific operator would accelerate on GPU.\n1. Exec Duration: wall-Clock time measured since the operator starts till it is completed.\n1. SQL Node Id\n1. Exec Is Supported: whether the Exec is supported by RAPIDS or not. Please refer to the Supported Operators section.\n1. Exec Stages: an array of stage IDs\n1. Exec Children\n1. Exec Children Node Ids\n1. Exec Should Remove: whether the Op is removed from the migrated plan."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"df33c614-2ecc-47a0-8600-bc891681997f","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["import json\nimport requests\nimport base64\nimport shlex\nimport subprocess\nimport pandas as pd\n\n# Download Spark RAPIDS tool jar\nTOOL_JAR_URL = 'https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark-tools_2.12/23.04.0/rapids-4-spark-tools_2.12-23.04.0.jar'\nTOOL_JAR_LOCAL_PATH = '/tmp/rapids-4-spark-tools.jar'\nresponse = requests.get(TOOL_JAR_URL)\nopen(TOOL_JAR_LOCAL_PATH, \"wb\").write(response.content)\n\n# Download S3 jars\nHADOOP_AWS_URL = 'https://repo.maven.apache.org/maven2/org/apache/hadoop/hadoop-aws/2.7.4/hadoop-aws-2.7.4.jar'\nHADOOP_AWS_LOCAL_PATH = '/tmp/hadoop-aws-2.7.4.jar'\nresponse = requests.get(HADOOP_AWS_URL)\nopen(HADOOP_AWS_LOCAL_PATH, \"wb\").write(response.content)\n\nAWS_JAVA_URL = 'https://repo.maven.apache.org/maven2/com/amazonaws/aws-java-sdk/1.7.4/aws-java-sdk-1.7.4.jar'\nAWS_JAVA_LOCAL_PATH = '/tmp/aws-java-sdk-1.7.4.jar'\nresponse = requests.get(AWS_JAVA_URL)\nopen(AWS_JAVA_LOCAL_PATH, \"wb\").write(response.content)\n\n"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"53b4d770-9db6-4bd7-9b93-d036d375eac5","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"datasetInfos":[],"data":"
Out[38]: 11948376
","removedWidgets":[],"addedWidgets":{},"metadata":{},"type":"html","arguments":{}}},"output_type":"display_data","data":{"text/html":["\n
Out[38]: 11948376
"]}}],"execution_count":0},{"cell_type":"code","source":["dbutils.widgets.text(\"log_path\", \"\")\neventlog_string=dbutils.widgets.get(\"log_path\")\n\ndbutils.widgets.text(\"output_path\", \"\")\noutputpath_string=dbutils.widgets.get(\"output_path\")"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"acf401a3-12d3-4236-a6c5-8fe8990b153a","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"datasetInfos":[],"data":"
","removedWidgets":[],"addedWidgets":{},"metadata":{},"type":"html","arguments":{}}},"output_type":"display_data","data":{"text/html":["\n
"]}}],"execution_count":0},{"cell_type":"code","source":["!java -Xmx10g -cp /tmp/rapids-4-spark-tools.jar:/tmp/hadoop-aws-2.7.4.jar:/tmp/aws-java-sdk-1.7.4.jar:/databricks/jars/* com.nvidia.spark.rapids.tool.qualification.QualificationMain -o $outputpath_string $eventlog_string &> /tmp/qual_debug.log"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"65c4e778-5505-4334-ab89-424334803253","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"datasetInfos":[],"data":"
","removedWidgets":[],"addedWidgets":{},"metadata":{},"type":"html","arguments":{}}},"output_type":"display_data","data":{"text/html":["\n
"]}}],"execution_count":0},{"cell_type":"markdown","source":["## Summary Output"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"bbe50fde-0bd6-4281-95fd-6a1ec6f17ab2","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["summary_output=pd.read_csv(outputpath_string + \"/rapids_4_spark_qualification_output/rapids_4_spark_qualification_output.csv\")\ndisplay(summary_output)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"fb8edb26-e173-47ff-92a1-463baec7c06b","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["TPC-DS Like Bench q14b","app-20220209225233-0018","Strongly Recommended",2.7,48971.53,83400.46,112708,27066964,132372,109793,65.66,null,null,null,null,null,null,112701,2939275,700037,26366927,4.16,false,"HashAggregate;Subquery;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q14a","app-20220209225013-0017","Strongly Recommended",2.66,51728.96,86381.03,117178,28746000,138110,112636,64.69,null,null,null,null,null,null,117172,2978987,1114076,27631924,4.29,false,"HashAggregate;Subquery;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q4","app-20220209224316-0007","Strongly Recommended",2.66,41856.03,69720.96,90167,85324700,111577,90167,65.09,null,null,null,null,null,null,90163,3086516,0,85324700,4.41,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q24b","app-20220209230348-0030","Recommended",2.34,32581.07,43720.92,56748,27574691,76302,56694,60.89,null,null,null,null,null,null,56741,2950634,25998,27548693,4.37,false,"AdaptiveSparkPlan;Subquery;Execute CreateViewCommand;Filter;ColumnarToRow","decimal"],["TPC-DS Like Bench q67","app-20220209232913-0074","Recommended",2.27,144720.72,184416.27,308185,15437192,329137,265300,73.64,null,null,null,null,null,null,308174,3028469,2148108,13289084,3.28,false,"Execute CreateViewCommand;ReusedExchange;HashAggregate;ColumnarToRow","DecimalType"],["TPC-DS Like Bench q24a","app-20220209230232-0029","Recommended",2.25,33029.22,41483.77,53469,27911960,74513,53202,60.14,null,null,null,null,null,null,53455,3305140,139193,27772767,4.54,false,"AdaptiveSparkPlan;Subquery;Execute CreateViewCommand;Filter;ColumnarToRow","decimal"],["TPC-DS Like Bench q93","app-20220209235239-0100","Recommended",2.18,31203.42,36894.57,50166,29213056,68098,50166,64.73,null,null,null,null,null,null,50161,2973035,0,29213056,3.78,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench q23a","app-20220209225917-0027","Recommended",2.17,43196.97,50617.02,74068,45913641,93814,66840,64.81,null,null,null,null,null,null,74064,2975228,4480262,41433379,4.12,false,"HashAggregate;Subquery;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q23b","app-20220209230053-0028","Recommended",2.08,46588.14,50761.85,77422,59799857,97350,66526,66.43,null,null,null,null,null,null,77417,3011951,8415627,51384230,4.22,false,"HashAggregate;Subquery;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRow","DecimalType;decimal"],["TPC-DS Like Bench q72","app-20220209233659-0079","Recommended",1.97,30920.88,30054.11,41703,25434438,60975,41703,74.77,null,null,null,null,null,null,41694,2971887,0,25434438,3.58,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q64","app-20220209232701-0071","Recommended",1.95,30544.61,29103.38,38925,31852357,59648,37301,55.12,null,null,null,null,null,null,38919,2987987,1328490,30523867,4.55,false,"HashAggregate;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q78","app-20220209234412-0085","Recommended",1.94,24390.79,22946.2,29098,24753911,47337,29098,56.99,null,null,null,null,null,null,29090,2968697,0,24753911,4.73,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q95","app-20220209235427-0102","Recommended",1.9,29920.38,26967.61,37674,23337528,56888,35528,49.19,null,null,null,null,null,null,37667,2958216,1328886,22008642,4.15,false,"Execute CreateViewCommand;AdaptiveSparkPlan;HashAggregate;ColumnarToRow","merge_sum"],["TPC-DS Like Bench q87","app-20220209234925-0094","Recommended",1.81,25518.2,20871.79,26279,16348325,46390,26279,52.04,null,null,null,null,null,null,26272,2954066,0,16348325,4.86,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q50","app-20220209231919-0057","Recommended",1.76,26735.89,20549.1,28736,16444045,47285,28736,52.87,null,null,null,null,null,null,28732,3339217,0,16444045,3.51,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q97","app-20220209235552-0104","Recommended",1.76,24057.8,18398.19,23731,11475611,42456,23731,58.69,null,null,null,null,null,null,23727,3009477,0,11475611,4.45,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q75","app-20220209233914-0082","Recommended",1.74,25544.26,18972.73,24939,19831478,44517,24939,43.74,null,null,null,null,null,null,24933,2987306,0,19831478,4.18,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q38","app-20220209231214-0044","Recommended",1.73,23047.06,16910.93,21292,15248682,39958,21292,48.81,null,null,null,null,null,null,21288,3167687,0,15248682,4.86,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q31","app-20220209230826-0037","Recommended",1.68,23595.69,16242.3,20407,12617670,39838,20407,34.76,null,null,null,null,null,null,20399,2942830,0,12617670,4.9,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q74","app-20220209233831-0081","Recommended",1.68,24668.06,16781.93,21747,16692240,41450,21747,46.93,null,null,null,null,null,null,21741,3325282,0,16692240,4.38,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q11","app-20220209224833-0014","Recommended",1.62,26707.24,16820.75,24208,17615125,43528,22143,45.76,null,null,null,null,null,null,24205,2917642,1502045,16113080,4.16,false,"Execute CreateViewCommand;ReusedExchange;HashAggregate;ColumnarToRow","DecimalType"],["TPC-DS Like Bench q16","app-20220209225524-0020","Recommended",1.62,25717.33,16006.66,22726,18535920,41724,21306,44.67,null,null,null,null,null,null,22720,3028781,1157466,17378454,4.01,false,"Execute CreateViewCommand;AdaptiveSparkPlan;HashAggregate;ColumnarToRow","merge_sum"],["TPC-DS Like Bench q51","app-20220209232008-0058","Recommended",1.59,21942.35,13069.64,16925,12278939,35012,16925,47.26,null,null,null,null,null,null,16920,2979507,0,12278939,4.38,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q81","app-20220209234611-0088","Recommended",1.58,23125.59,13612.4,17437,10033526,36738,17393,36.22,null,null,null,null,null,null,17431,3083743,24955,10008571,4.59,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow;Filter","DECIMAL"],["TPC-DS Like Bench q65","app-20220209232803-0072","Recommended",1.57,23403.59,13469.4,18332,10164071,36873,18332,46.41,null,null,null,null,null,null,18324,2941892,0,10164071,3.77,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q30","app-20220209230750-0036","Recommended",1.56,21777.06,12322.93,16070,8447753,34100,16023,33.65,null,null,null,null,null,null,16063,2987480,24435,8423318,4.33,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow;Filter","DECIMAL"],["TPC-DS Like Bench q15","app-20220209225447-0019","Recommended",1.52,23166.12,12074.87,15970,6770100,35241,15970,34.25,null,null,null,null,null,null,15964,2923648,0,6770100,4.09,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q35","app-20220209231035-0041","Recommended",1.51,24552.13,12648.86,18298,10027023,37201,17010,37.15,null,null,null,null,null,null,18293,3059747,705510,9321513,3.9,false,"Execute CreateViewCommand;SortMergeJoin;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q8","app-20220209224648-0011","Recommended",1.51,23372.7,12016.29,15691,6693324,35389,15691,20.01,null,null,null,null,null,null,15686,3133963,0,6693324,4.26,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q69","app-20220209233517-0076","Recommended",1.5,24534.64,12431.35,16589,7246714,36966,16589,27.75,null,null,null,null,null,null,16583,2963952,0,7246714,3.99,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q94","app-20220209235349-0101","Recommended",1.5,24361.44,12284.55,17424,13168326,36646,16352,41.87,null,null,null,null,null,null,17416,3048502,809952,12358374,4.01,false,"Execute CreateViewCommand;AdaptiveSparkPlan;HashAggregate;ColumnarToRow","merge_sum"],["TPC-DS Like Bench q54","app-20220209232140-0061","Recommended",1.5,23475.06,11742.93,15568,5555140,35218,15568,28.65,null,null,null,null,null,null,15563,3021018,0,5555140,4.07,false,"Execute CreateViewCommand;ReusedExchange;Subquery;ColumnarToRow",null],["TPC-DS Like Bench q39a","app-20220209231256-0045","Recommended",1.49,22102.22,10863.77,14136,4794226,32966,14136,24.49,null,null,null,null,null,null,14131,2998677,0,4794226,4.32,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q29","app-20220209230713-0035","Recommended",1.49,23597.91,11588.08,15912,10021701,35186,15912,44.09,null,null,null,null,null,null,15905,3057910,0,10021701,3.68,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q47","app-20220209231740-0054","Recommended",1.48,23520.63,11417.36,15246,8996925,34938,15160,35.78,null,null,null,null,null,null,15241,3107687,50299,8946626,4.05,false,"Execute CreateViewCommand;ReusedExchange;Filter;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q59","app-20220209232422-0066","Recommended",1.48,24246.78,11658.21,16091,6749831,35905,16091,34.65,null,null,null,null,null,null,16084,3068245,0,6749831,3.63,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench q6","app-20220209224544-0009","Recommended",1.46,22488.01,10526.98,13758,6335474,33015,13756,30.04,null,null,null,null,null,null,13753,2943126,863,6334611,4.26,false,"Subquery;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q80","app-20220209234532-0087","Recommended",1.46,25298.12,11841.87,16742,12630126,37140,15856,40.02,null,null,null,null,null,null,16735,3360633,668346,11961780,3.95,false,"Execute CreateViewCommand;ReusedExchange;HashAggregate;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q39b","app-20220209231330-0046","Recommended",1.46,22094.04,10341.95,13457,3807675,32436,13457,30.24,null,null,null,null,null,null,13451,2941727,0,3807675,4.32,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q57","app-20220209232314-0064","Recommended",1.46,22995.99,10722.0,14351,8374423,33718,14237,31.73,null,null,null,null,null,null,14345,2948771,66283,8308140,4.05,false,"Execute CreateViewCommand;ReusedExchange;Filter;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q1","app-20220209224147-0004","Recommended",1.46,21599.35,10007.64,13417,7598550,31607,13321,37.09,null,null,null,null,null,null,13412,3012015,54119,7544431,4.01,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow;Filter","DECIMAL"],["TPC-DS Like Bench q18","app-20220209225644-0022","Recommended",1.44,22216.88,9865.11,13492,7586670,32082,13492,33.42,null,null,null,null,null,null,13484,2962080,0,7586670,3.72,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q45","app-20220209231631-0052","Recommended",1.44,23723.45,10458.54,14455,5768757,34182,14154,33.74,null,null,null,null,null,null,14447,2957022,120068,5648689,3.83,false,"Execute CreateViewCommand;ReusedExchange;BroadcastHashJoin;ColumnarToRow",null],["TPC-DS Like Bench q17","app-20220209225607-0021","Recommended",1.43,24334.61,10564.38,14420,7818278,34899,14420,37.4,null,null,null,null,null,null,14412,3106844,0,7818278,3.74,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q25","app-20220209230506-0031","Recommended",1.43,21671.78,9370.21,12790,7060196,31042,12790,34.97,null,null,null,null,null,null,12784,3060435,0,7060196,3.74,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q49","app-20220209231846-0056","Recommended",1.42,22231.44,9476.55,12466,8785195,31708,12466,26.92,null,null,null,null,null,null,12448,3080539,0,8785195,4.17,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q46","app-20220209231707-0053","Recommended",1.42,22047.85,9385.14,12318,6163042,31433,12318,26.39,null,null,null,null,null,null,12312,3017041,0,6163042,4.2,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q10","app-20220209224756-0013","Recommended",1.42,24919.87,10489.12,15574,7745798,35409,14432,30.14,null,null,null,null,null,null,15567,3236768,567780,7178018,3.66,false,"Execute CreateViewCommand;SortMergeJoin;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q68","app-20220209233444-0075","Recommended",1.41,21674.52,9006.47,11821,5109423,30681,11821,20.54,null,null,null,null,null,null,11814,3004334,0,5109423,4.2,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q5","app-20220209224509-0008","Recommended",1.41,23548.42,9749.57,13729,8967631,33298,13729,41.35,null,null,null,null,null,null,13722,3186659,0,8967631,3.45,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q34","app-20220209231004-0040","Recommended",1.4,20675.69,8427.3,10842,5053339,29103,10842,27.34,null,null,null,null,null,null,10836,2994320,0,5053339,4.49,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q82","app-20220209234649-0089","Recommended",1.4,22206.53,8955.46,12212,7344489,31162,12212,39.29,null,null,null,null,null,null,12199,2973553,0,7344489,3.75,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q85","app-20220209234821-0092","Recommended",1.4,24121.11,9726.88,13468,7684101,33848,13468,29.91,null,null,null,null,null,null,13462,2949755,0,7684101,3.6,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q28","app-20220209230637-0034","Recommended",1.39,24599.41,9839.58,15464,14309580,34439,13823,33.04,null,null,null,null,null,null,15458,3008413,1518296,12791284,3.47,false,"AdaptiveSparkPlan;CollectLimit;HashAggregate;Execute CreateViewCommand;ColumnarToRow","merge_avg;merge_count"],["TPC-DS Like Bench q58","app-20220209232349-0065","Recommended",1.39,22489.0,8770.99,12322,5717106,31260,12322,34.17,null,null,null,null,null,null,12313,3102820,0,5717106,3.47,false,"Execute CreateViewCommand;Subquery;ColumnarToRow",null],["TPC-DS Like Bench q19","app-20220209225718-0023","Recommended",1.38,21689.15,8456.84,11373,5749051,30146,11373,23.22,null,null,null,null,null,null,11364,3161292,0,5749051,3.9,false,"Execute CreateViewCommand;ColumnarToRow",null],["TPC-DS Like Bench q61","app-20220209232531-0068","Recommended",1.38,23308.72,9017.27,12357,4376440,32326,12357,36.63,null,null,null,null,null,null,12349,3022176,0,4376440,3.7,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q71","app-20220209233627-0078","Recommended",1.38,21967.67,8440.32,11371,4987537,30408,11371,21.81,null,null,null,null,null,null,11363,3052139,0,4987537,3.88,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q22","app-20220209225845-0026","Recommended",1.38,22397.03,8535.96,12381,1736064,30933,12381,50.01,null,null,null,null,null,null,12376,2929875,0,1736064,3.22,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q70","app-20220209233555-0077","Recommended",1.37,21798.79,8233.2,10751,4816235,30032,10751,33.51,null,null,null,null,null,null,10746,3034688,0,4816235,4.26,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q83","app-20220209234722-0090","Recommended",1.36,21949.16,8010.83,10956,5253931,29960,10956,26.62,null,null,null,null,null,null,10949,2993826,0,5253931,3.72,false,"Execute CreateViewCommand;ColumnarToRow",null],["TPC-DS Like Bench q98","app-20220209235636-0105","Recommended",1.36,20487.86,7376.13,9674,3164505,27864,9674,21.36,null,null,null,null,null,null,9669,2953354,0,3164505,4.21,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q79","app-20220209234502-0086","Recommended",1.35,21073.77,7578.22,10344,5584295,28652,10344,29.69,null,null,null,null,null,null,10340,3007559,0,5584295,3.74,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q73","app-20220209233802-0080","Recommended",1.35,20143.11,7154.88,9205,3086301,27298,9205,27.46,null,null,null,null,null,null,9201,2929775,0,3086301,4.49,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q91","app-20220209235141-0098","Recommended",1.34,22090.61,7648.38,10351,3106198,29739,10351,23.11,null,null,null,null,null,null,10347,2997584,0,3106198,3.83,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q37","app-20220209231143-0043","Recommended",1.34,22130.6,7605.4,10371,5754398,29736,10371,38.21,null,null,null,null,null,null,10366,3003155,0,5754398,3.75,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q44","app-20220209231559-0051","Recommended",1.34,22359.33,7652.66,10956,7175937,30012,10347,29.11,null,null,null,null,null,null,10950,3029969,398712,6777225,3.84,false,"AdaptiveSparkPlan;Subquery;Execute CreateViewCommand;Filter;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q9","app-20220209224725-0012","Recommended",1.33,21873.81,7315.18,9829,8064543,29189,9829,35.84,null,null,null,null,null,null,9823,3021491,0,8064543,3.91,false,"Execute CreateViewCommand;AdaptiveSparkPlan;Subquery;ColumnarToRow",null],["TPC-DS Like Bench q40","app-20220209231405-0047","Recommended",1.33,24561.7,8167.29,12119,8004983,32729,11272,36.85,null,null,null,null,null,null,12110,3142013,558989,7445994,3.63,false,"Execute CreateViewCommand;ReusedExchange;HashAggregate;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q2","app-20220209224220-0005","Recommended",1.32,21301.46,6890.53,8966,4724046,28192,8966,38.76,null,null,null,null,null,null,8960,3025086,0,4724046,4.32,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench ss_max","app-20220209235735-0107","Recommended",1.31,20784.37,6539.62,9176,5331368,27324,8883,40.82,null,null,null,null,null,null,9171,3049122,169902,5161466,3.79,false,"Execute CreateViewCommand;AdaptiveSparkPlan;HashAggregate;ColumnarToRow","merge_count;merge_max"],["TPC-DS Like Bench q60","app-20220209232500-0067","Recommended",1.31,22250.37,6983.62,9811,3834676,29234,9811,19.92,null,null,null,null,null,null,9806,2939560,0,3834676,3.47,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q13","app-20220209224945-0016","Recommended",1.31,20407.71,6360.28,8816,4265966,26768,8816,34.5,null,null,null,null,null,null,8808,2951094,0,4265966,3.59,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q56","app-20220209232242-0063","Recommended",1.3,22798.87,7044.12,9896,3729466,29843,9896,14.44,null,null,null,null,null,null,9890,2971656,0,3729466,3.47,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q76","app-20220209234000-0083","Recommended",1.3,22630.64,6827.35,9835,6264831,29458,9835,33.9,null,null,null,null,null,null,9830,3037202,0,6264831,3.27,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench q33","app-20220209230935-0039","Recommended",1.3,21561.95,6491.04,9119,3032680,28053,9119,18.14,null,null,null,null,null,null,9111,2983234,0,3032680,3.47,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q88","app-20220209235013-0095","Recommended",1.3,23989.56,7197.43,9998,6687038,31187,9998,43.92,null,null,null,null,null,null,9987,3212440,0,6687038,3.57,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench q7","app-20220209224619-0010","Not Recommended",1.29,20663.5,6143.5,8936,4022166,26807,8936,35.88,null,null,null,null,null,null,8929,2959904,0,4022166,3.2,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q48","app-20220209231816-0055","Not Recommended",1.29,21310.47,6237.52,8514,3969649,27548,8514,33.42,null,null,null,null,null,null,8507,2990347,0,3969649,3.74,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q26","app-20220209230539-0032","Not Recommended",1.28,21556.18,6109.81,8887,4002441,27666,8887,36.79,null,null,null,null,null,null,8876,3012952,0,4002441,3.2,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q12","app-20220209224918-0015","Not Recommended",1.27,19624.36,5459.63,7584,1865587,25084,7584,23.82,null,null,null,null,null,null,7577,3102250,0,1865587,3.57,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q62","app-20220209232605-0069","Not Recommended",1.27,21448.22,5877.77,8574,4218821,27326,8574,36.47,null,null,null,null,null,null,8565,3017055,0,4218821,3.18,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench q20","app-20220209225749-0024","Not Recommended",1.26,21250.95,5641.04,7836,2040974,26892,7836,22.51,null,null,null,null,null,null,7829,3039094,0,2040974,3.57,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q99","app-20220209235705-0106","Not Recommended",1.25,22355.32,5801.67,8463,4558275,28157,8463,33.1,null,null,null,null,null,null,8455,2973149,0,4558275,3.18,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench q36","app-20220209231114-0042","Not Recommended",1.25,21356.73,5527.26,7756,3642750,26884,7756,30.08,null,null,null,null,null,null,7752,2905924,0,3642750,3.48,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q89","app-20220209235046-0096","Not Recommended",1.25,20969.23,5401.76,7869,4029740,26371,7615,24.99,null,null,null,null,null,null,7858,3012145,129765,3899975,3.44,false,"Execute CreateViewCommand;ReusedExchange;Filter;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q86","app-20220209234857-0093","Not Recommended",1.25,21140.77,5388.22,7493,3505441,26529,7493,29.09,null,null,null,null,null,null,7489,3240380,0,3505441,3.56,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q27","app-20220209230608-0033","Not Recommended",1.25,22114.89,5587.1,8150,3737103,27702,8150,29.62,null,null,null,null,null,null,8143,3067371,0,3737103,3.18,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q66","app-20220209232841-0073","Not Recommended",1.24,24291.91,5938.08,9771,5287383,30230,8612,35.68,null,null,null,null,null,null,9765,2922061,626680,4660703,3.22,false,"Execute CreateViewCommand;ReusedExchange;HashAggregate;ColumnarToRow","DecimalType"],["TPC-DS Like Bench q53","app-20220209232111-0060","Not Recommended",1.23,22160.97,5233.02,7622,3879496,27394,7368,25.54,null,null,null,null,null,null,7617,2905347,128795,3750701,3.45,false,"Execute CreateViewCommand;ReusedExchange;Filter;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q84","app-20220209234754-0091","Not Recommended",1.23,21195.3,4968.69,7129,3814060,26164,7129,40.65,null,null,null,null,null,null,7123,3029105,0,3814060,3.3,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench q63","app-20220209232634-0070","Not Recommended",1.23,21192.66,4957.33,7215,3490147,26150,6980,26.58,null,null,null,null,null,null,7207,2976838,113318,3376829,3.45,false,"Execute CreateViewCommand;ReusedExchange;Filter;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q43","app-20220209231533-0050","Not Recommended",1.23,19958.18,4641.81,6660,3257940,24600,6660,29.65,null,null,null,null,null,null,6651,2961446,0,3257940,3.3,false,"Execute CreateViewCommand;ColumnarToRow",null],["TPC-DS Like Bench ss_maxb","app-20220209235804-0108","Not Recommended",1.23,19063.41,4414.58,5825,3798491,23478,5825,48.17,null,null,null,null,null,null,5819,3155711,0,3798491,4.13,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench q3","app-20220209224250-0006","Not Recommended",1.22,20089.36,4522.63,6489,2898373,24612,6489,26.88,null,null,null,null,null,null,6483,3094853,0,2898373,3.3,false,"Execute CreateViewCommand;ColumnarToRow",null],["TPC-DS Like Bench q21","app-20220209225818-0025","Not Recommended",1.22,20413.61,4531.38,6610,1072926,24945,6610,40.94,null,null,null,null,null,null,6605,3079474,0,1072926,3.18,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q55","app-20220209232217-0062","Not Recommended",1.22,19494.18,4296.81,6165,2612787,23791,6165,24.78,null,null,null,null,null,null,6158,2995446,0,2612787,3.3,false,"Execute CreateViewCommand;ColumnarToRow",null],["TPC-DS Like Bench q92","app-20220209235212-0099","Not Recommended",1.21,20741.45,4549.54,6384,2095601,25291,6123,25.07,null,null,null,null,null,null,6380,2967129,85419,2010182,3.89,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow;Filter","DECIMAL"],["TPC-DS Like Bench q90","app-20220209235114-0097","Not Recommended",1.21,20450.98,4350.01,6209,2604676,24801,6209,44.95,null,null,null,null,null,null,6204,2976499,0,2604676,3.34,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench q32","app-20220209230908-0038","Not Recommended",1.2,20973.26,4366.73,6107,2712962,25340,5909,25.21,null,null,null,null,null,null,6098,3048254,87623,2625339,3.83,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow;Filter","DECIMAL"],["TPC-DS Like Bench q42","app-20220209231505-0049","Not Recommended",1.2,21414.78,4436.21,6365,2726759,25851,6365,23.15,null,null,null,null,null,null,6358,3047836,0,2726759,3.3,false,"Execute CreateViewCommand;ColumnarToRow",null],["TPC-DS Like Bench q52","app-20220209232045-0059","Not Recommended",1.19,20523.3,4071.69,5842,2683090,24595,5842,25.46,null,null,null,null,null,null,5827,3074975,0,2683090,3.3,false,"Execute CreateViewCommand;ColumnarToRow",null],["TPC-DS Like Bench q41","app-20220209231439-0048","Not Recommended",1.19,20533.93,4071.06,5649,161564,24605,5649,55.4,null,null,null,null,null,null,5642,2970757,0,161564,3.58,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench q96","app-20220209235526-0103","Not Recommended",1.18,20189.67,3776.32,5324,2304428,23966,5324,44.32,null,null,null,null,null,null,5317,2947875,0,2304428,3.44,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["DART-ALGO","application_1665146417445_0002","Not Recommended",1.04,375798.12,16253.87,44531,75900172,392052,23675,14.55,null,null,null,null,null,null,16579,58017590,35546441,40353731,3.19,false,"Scan hive ecomm_ops_tables.zzz_dart_browse_ads_prod_mod;Scan hive ecomm_ops_tables.s0s0jzb_browse_shelf_cat_map;CollectLimit",null],["DART-ALGO","application_1665146417445_0003","Not Recommended",1.0,690682.0,0.0,0,0,690682,0,0.0,null,null,null,null,null,null,0,0,0,0,1.0,false,null,null]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"App Name","type":"\"string\"","metadata":"{}"},{"name":"App ID","type":"\"string\"","metadata":"{}"},{"name":"Recommendation","type":"\"string\"","metadata":"{}"},{"name":"Estimated GPU Speedup","type":"\"double\"","metadata":"{}"},{"name":"Estimated GPU Duration","type":"\"double\"","metadata":"{}"},{"name":"Estimated GPU Time Saved","type":"\"double\"","metadata":"{}"},{"name":"SQL DF Duration","type":"\"long\"","metadata":"{}"},{"name":"SQL Dataframe Task Duration","type":"\"long\"","metadata":"{}"},{"name":"App Duration","type":"\"long\"","metadata":"{}"},{"name":"GPU Opportunity","type":"\"long\"","metadata":"{}"},{"name":"Executor CPU Time Percent","type":"\"double\"","metadata":"{}"},{"name":"SQL Ids with Failures","type":"\"double\"","metadata":"{}"},{"name":"Unsupported Read File Formats and Types","type":"\"double\"","metadata":"{}"},{"name":"Unsupported Write Data Format","type":"\"double\"","metadata":"{}"},{"name":"Complex Types","type":"\"double\"","metadata":"{}"},{"name":"Nested Complex Types","type":"\"double\"","metadata":"{}"},{"name":"Potential Problems","type":"\"double\"","metadata":"{}"},{"name":"Longest SQL Duration","type":"\"long\"","metadata":"{}"},{"name":"NONSQL Task Duration Plus Overhead","type":"\"long\"","metadata":"{}"},{"name":"Unsupported Task Duration","type":"\"long\"","metadata":"{}"},{"name":"Supported SQL DF Task Duration","type":"\"long\"","metadata":"{}"},{"name":"Task Speedup Factor","type":"\"double\"","metadata":"{}"},{"name":"App Duration Estimated","type":"\"boolean\"","metadata":"{}"},{"name":"Unsupported Execs","type":"\"string\"","metadata":"{}"},{"name":"Unsupported Expressions","type":"\"string\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
App NameApp IDRecommendationEstimated GPU SpeedupEstimated GPU DurationEstimated GPU Time SavedSQL DF DurationSQL Dataframe Task DurationApp DurationGPU OpportunityExecutor CPU Time PercentSQL Ids with FailuresUnsupported Read File Formats and TypesUnsupported Write Data FormatComplex TypesNested Complex TypesPotential ProblemsLongest SQL DurationNONSQL Task Duration Plus OverheadUnsupported Task DurationSupported SQL DF Task DurationTask Speedup FactorApp Duration EstimatedUnsupported ExecsUnsupported Expressions
TPC-DS Like Bench q14bapp-20220209225233-0018Strongly Recommended2.748971.5383400.461127082706696413237210979365.66nullnullnullnullnullnull1127012939275700037263669274.16falseHashAggregate;Subquery;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q14aapp-20220209225013-0017Strongly Recommended2.6651728.9686381.031171782874600013811011263664.69nullnullnullnullnullnull11717229789871114076276319244.29falseHashAggregate;Subquery;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q4app-20220209224316-0007Strongly Recommended2.6641856.0369720.9690167853247001115779016765.09nullnullnullnullnullnull9016330865160853247004.41falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q24bapp-20220209230348-0030Recommended2.3432581.0743720.925674827574691763025669460.89nullnullnullnullnullnull56741295063425998275486934.37falseAdaptiveSparkPlan;Subquery;Execute CreateViewCommand;Filter;ColumnarToRowdecimal
TPC-DS Like Bench q67app-20220209232913-0074Recommended2.27144720.72184416.273081851543719232913726530073.64nullnullnullnullnullnull30817430284692148108132890843.28falseExecute CreateViewCommand;ReusedExchange;HashAggregate;ColumnarToRowDecimalType
TPC-DS Like Bench q24aapp-20220209230232-0029Recommended2.2533029.2241483.775346927911960745135320260.14nullnullnullnullnullnull534553305140139193277727674.54falseAdaptiveSparkPlan;Subquery;Execute CreateViewCommand;Filter;ColumnarToRowdecimal
TPC-DS Like Bench q93app-20220209235239-0100Recommended2.1831203.4236894.575016629213056680985016664.73nullnullnullnullnullnull5016129730350292130563.78falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench q23aapp-20220209225917-0027Recommended2.1743196.9750617.027406845913641938146684064.81nullnullnullnullnullnull7406429752284480262414333794.12falseHashAggregate;Subquery;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q23bapp-20220209230053-0028Recommended2.0846588.1450761.857742259799857973506652666.43nullnullnullnullnullnull7741730119518415627513842304.22falseHashAggregate;Subquery;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRowDecimalType;decimal
TPC-DS Like Bench q72app-20220209233659-0079Recommended1.9730920.8830054.114170325434438609754170374.77nullnullnullnullnullnull4169429718870254344383.58falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q64app-20220209232701-0071Recommended1.9530544.6129103.383892531852357596483730155.12nullnullnullnullnullnull3891929879871328490305238674.55falseHashAggregate;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q78app-20220209234412-0085Recommended1.9424390.7922946.22909824753911473372909856.99nullnullnullnullnullnull2909029686970247539114.73falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q95app-20220209235427-0102Recommended1.929920.3826967.613767423337528568883552849.19nullnullnullnullnullnull3766729582161328886220086424.15falseExecute CreateViewCommand;AdaptiveSparkPlan;HashAggregate;ColumnarToRowmerge_sum
TPC-DS Like Bench q87app-20220209234925-0094Recommended1.8125518.220871.792627916348325463902627952.04nullnullnullnullnullnull2627229540660163483254.86falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q50app-20220209231919-0057Recommended1.7626735.8920549.12873616444045472852873652.87nullnullnullnullnullnull2873233392170164440453.51falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q97app-20220209235552-0104Recommended1.7624057.818398.192373111475611424562373158.69nullnullnullnullnullnull2372730094770114756114.45falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q75app-20220209233914-0082Recommended1.7425544.2618972.732493919831478445172493943.74nullnullnullnullnullnull2493329873060198314784.18falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q38app-20220209231214-0044Recommended1.7323047.0616910.932129215248682399582129248.81nullnullnullnullnullnull2128831676870152486824.86falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q31app-20220209230826-0037Recommended1.6823595.6916242.32040712617670398382040734.76nullnullnullnullnullnull2039929428300126176704.9falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q74app-20220209233831-0081Recommended1.6824668.0616781.932174716692240414502174746.93nullnullnullnullnullnull2174133252820166922404.38falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q11app-20220209224833-0014Recommended1.6226707.2416820.752420817615125435282214345.76nullnullnullnullnullnull2420529176421502045161130804.16falseExecute CreateViewCommand;ReusedExchange;HashAggregate;ColumnarToRowDecimalType
TPC-DS Like Bench q16app-20220209225524-0020Recommended1.6225717.3316006.662272618535920417242130644.67nullnullnullnullnullnull2272030287811157466173784544.01falseExecute CreateViewCommand;AdaptiveSparkPlan;HashAggregate;ColumnarToRowmerge_sum
TPC-DS Like Bench q51app-20220209232008-0058Recommended1.5921942.3513069.641692512278939350121692547.26nullnullnullnullnullnull1692029795070122789394.38falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q81app-20220209234611-0088Recommended1.5823125.5913612.41743710033526367381739336.22nullnullnullnullnullnull17431308374324955100085714.59falseExecute CreateViewCommand;ReusedExchange;ColumnarToRow;FilterDECIMAL
TPC-DS Like Bench q65app-20220209232803-0072Recommended1.5723403.5913469.41833210164071368731833246.41nullnullnullnullnullnull1832429418920101640713.77falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q30app-20220209230750-0036Recommended1.5621777.0612322.93160708447753341001602333.65nullnullnullnullnullnull1606329874802443584233184.33falseExecute CreateViewCommand;ReusedExchange;ColumnarToRow;FilterDECIMAL
TPC-DS Like Bench q15app-20220209225447-0019Recommended1.5223166.1212074.87159706770100352411597034.25nullnullnullnullnullnull159642923648067701004.09falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q35app-20220209231035-0041Recommended1.5124552.1312648.861829810027023372011701037.15nullnullnullnullnullnull18293305974770551093215133.9falseExecute CreateViewCommand;SortMergeJoin;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q8app-20220209224648-0011Recommended1.5123372.712016.29156916693324353891569120.01nullnullnullnullnullnull156863133963066933244.26falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q69app-20220209233517-0076Recommended1.524534.6412431.35165897246714369661658927.75nullnullnullnullnullnull165832963952072467143.99falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q94app-20220209235349-0101Recommended1.524361.4412284.551742413168326366461635241.87nullnullnullnullnullnull174163048502809952123583744.01falseExecute CreateViewCommand;AdaptiveSparkPlan;HashAggregate;ColumnarToRowmerge_sum
TPC-DS Like Bench q54app-20220209232140-0061Recommended1.523475.0611742.93155685555140352181556828.65nullnullnullnullnullnull155633021018055551404.07falseExecute CreateViewCommand;ReusedExchange;Subquery;ColumnarToRownull
TPC-DS Like Bench q39aapp-20220209231256-0045Recommended1.4922102.2210863.77141364794226329661413624.49nullnullnullnullnullnull141312998677047942264.32falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q29app-20220209230713-0035Recommended1.4923597.9111588.081591210021701351861591244.09nullnullnullnullnullnull1590530579100100217013.68falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q47app-20220209231740-0054Recommended1.4823520.6311417.36152468996925349381516035.78nullnullnullnullnullnull1524131076875029989466264.05falseExecute CreateViewCommand;ReusedExchange;Filter;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q59app-20220209232422-0066Recommended1.4824246.7811658.21160916749831359051609134.65nullnullnullnullnullnull160843068245067498313.63falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench q6app-20220209224544-0009Recommended1.4622488.0110526.98137586335474330151375630.04nullnullnullnullnullnull13753294312686363346114.26falseSubquery;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q80app-20220209234532-0087Recommended1.4625298.1211841.871674212630126371401585640.02nullnullnullnullnullnull167353360633668346119617803.95falseExecute CreateViewCommand;ReusedExchange;HashAggregate;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q39bapp-20220209231330-0046Recommended1.4622094.0410341.95134573807675324361345730.24nullnullnullnullnullnull134512941727038076754.32falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q57app-20220209232314-0064Recommended1.4622995.9910722.0143518374423337181423731.73nullnullnullnullnullnull1434529487716628383081404.05falseExecute CreateViewCommand;ReusedExchange;Filter;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q1app-20220209224147-0004Recommended1.4621599.3510007.64134177598550316071332137.09nullnullnullnullnullnull1341230120155411975444314.01falseExecute CreateViewCommand;ReusedExchange;ColumnarToRow;FilterDECIMAL
TPC-DS Like Bench q18app-20220209225644-0022Recommended1.4422216.889865.11134927586670320821349233.42nullnullnullnullnullnull134842962080075866703.72falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q45app-20220209231631-0052Recommended1.4423723.4510458.54144555768757341821415433.74nullnullnullnullnullnull14447295702212006856486893.83falseExecute CreateViewCommand;ReusedExchange;BroadcastHashJoin;ColumnarToRownull
TPC-DS Like Bench q17app-20220209225607-0021Recommended1.4324334.6110564.38144207818278348991442037.4nullnullnullnullnullnull144123106844078182783.74falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q25app-20220209230506-0031Recommended1.4321671.789370.21127907060196310421279034.97nullnullnullnullnullnull127843060435070601963.74falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q49app-20220209231846-0056Recommended1.4222231.449476.55124668785195317081246626.92nullnullnullnullnullnull124483080539087851954.17falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q46app-20220209231707-0053Recommended1.4222047.859385.14123186163042314331231826.39nullnullnullnullnullnull123123017041061630424.2falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q10app-20220209224756-0013Recommended1.4224919.8710489.12155747745798354091443230.14nullnullnullnullnullnull15567323676856778071780183.66falseExecute CreateViewCommand;SortMergeJoin;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q68app-20220209233444-0075Recommended1.4121674.529006.47118215109423306811182120.54nullnullnullnullnullnull118143004334051094234.2falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q5app-20220209224509-0008Recommended1.4123548.429749.57137298967631332981372941.35nullnullnullnullnullnull137223186659089676313.45falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q34app-20220209231004-0040Recommended1.420675.698427.3108425053339291031084227.34nullnullnullnullnullnull108362994320050533394.49falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q82app-20220209234649-0089Recommended1.422206.538955.46122127344489311621221239.29nullnullnullnullnullnull121992973553073444893.75falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q85app-20220209234821-0092Recommended1.424121.119726.88134687684101338481346829.91nullnullnullnullnullnull134622949755076841013.6falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q28app-20220209230637-0034Recommended1.3924599.419839.581546414309580344391382333.04nullnullnullnullnullnull1545830084131518296127912843.47falseAdaptiveSparkPlan;CollectLimit;HashAggregate;Execute CreateViewCommand;ColumnarToRowmerge_avg;merge_count
TPC-DS Like Bench q58app-20220209232349-0065Recommended1.3922489.08770.99123225717106312601232234.17nullnullnullnullnullnull123133102820057171063.47falseExecute CreateViewCommand;Subquery;ColumnarToRownull
TPC-DS Like Bench q19app-20220209225718-0023Recommended1.3821689.158456.84113735749051301461137323.22nullnullnullnullnullnull113643161292057490513.9falseExecute CreateViewCommand;ColumnarToRownull
TPC-DS Like Bench q61app-20220209232531-0068Recommended1.3823308.729017.27123574376440323261235736.63nullnullnullnullnullnull123493022176043764403.7falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q71app-20220209233627-0078Recommended1.3821967.678440.32113714987537304081137121.81nullnullnullnullnullnull113633052139049875373.88falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q22app-20220209225845-0026Recommended1.3822397.038535.96123811736064309331238150.01nullnullnullnullnullnull123762929875017360643.22falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q70app-20220209233555-0077Recommended1.3721798.798233.2107514816235300321075133.51nullnullnullnullnullnull107463034688048162354.26falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q83app-20220209234722-0090Recommended1.3621949.168010.83109565253931299601095626.62nullnullnullnullnullnull109492993826052539313.72falseExecute CreateViewCommand;ColumnarToRownull
TPC-DS Like Bench q98app-20220209235636-0105Recommended1.3620487.867376.139674316450527864967421.36nullnullnullnullnullnull96692953354031645054.21falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q79app-20220209234502-0086Recommended1.3521073.777578.22103445584295286521034429.69nullnullnullnullnullnull103403007559055842953.74falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q73app-20220209233802-0080Recommended1.3520143.117154.889205308630127298920527.46nullnullnullnullnullnull92012929775030863014.49falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q91app-20220209235141-0098Recommended1.3422090.617648.38103513106198297391035123.11nullnullnullnullnullnull103472997584031061983.83falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q37app-20220209231143-0043Recommended1.3422130.67605.4103715754398297361037138.21nullnullnullnullnullnull103663003155057543983.75falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q44app-20220209231559-0051Recommended1.3422359.337652.66109567175937300121034729.11nullnullnullnullnullnull10950302996939871267772253.84falseAdaptiveSparkPlan;Subquery;Execute CreateViewCommand;Filter;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q9app-20220209224725-0012Recommended1.3321873.817315.189829806454329189982935.84nullnullnullnullnullnull98233021491080645433.91falseExecute CreateViewCommand;AdaptiveSparkPlan;Subquery;ColumnarToRownull
TPC-DS Like Bench q40app-20220209231405-0047Recommended1.3324561.78167.29121198004983327291127236.85nullnullnullnullnullnull12110314201355898974459943.63falseExecute CreateViewCommand;ReusedExchange;HashAggregate;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q2app-20220209224220-0005Recommended1.3221301.466890.538966472404628192896638.76nullnullnullnullnullnull89603025086047240464.32falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench ss_maxapp-20220209235735-0107Recommended1.3120784.376539.629176533136827324888340.82nullnullnullnullnullnull9171304912216990251614663.79falseExecute CreateViewCommand;AdaptiveSparkPlan;HashAggregate;ColumnarToRowmerge_count;merge_max
TPC-DS Like Bench q60app-20220209232500-0067Recommended1.3122250.376983.629811383467629234981119.92nullnullnullnullnullnull98062939560038346763.47falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q13app-20220209224945-0016Recommended1.3120407.716360.288816426596626768881634.5nullnullnullnullnullnull88082951094042659663.59falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q56app-20220209232242-0063Recommended1.322798.877044.129896372946629843989614.44nullnullnullnullnullnull98902971656037294663.47falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q76app-20220209234000-0083Recommended1.322630.646827.359835626483129458983533.9nullnullnullnullnullnull98303037202062648313.27falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench q33app-20220209230935-0039Recommended1.321561.956491.049119303268028053911918.14nullnullnullnullnullnull91112983234030326803.47falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q88app-20220209235013-0095Recommended1.323989.567197.439998668703831187999843.92nullnullnullnullnullnull99873212440066870383.57falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench q7app-20220209224619-0010Not Recommended1.2920663.56143.58936402216626807893635.88nullnullnullnullnullnull89292959904040221663.2falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q48app-20220209231816-0055Not Recommended1.2921310.476237.528514396964927548851433.42nullnullnullnullnullnull85072990347039696493.74falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q26app-20220209230539-0032Not Recommended1.2821556.186109.818887400244127666888736.79nullnullnullnullnullnull88763012952040024413.2falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q12app-20220209224918-0015Not Recommended1.2719624.365459.637584186558725084758423.82nullnullnullnullnullnull75773102250018655873.57falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q62app-20220209232605-0069Not Recommended1.2721448.225877.778574421882127326857436.47nullnullnullnullnullnull85653017055042188213.18falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench q20app-20220209225749-0024Not Recommended1.2621250.955641.047836204097426892783622.51nullnullnullnullnullnull78293039094020409743.57falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q99app-20220209235705-0106Not Recommended1.2522355.325801.678463455827528157846333.1nullnullnullnullnullnull84552973149045582753.18falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench q36app-20220209231114-0042Not Recommended1.2521356.735527.267756364275026884775630.08nullnullnullnullnullnull77522905924036427503.48falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q89app-20220209235046-0096Not Recommended1.2520969.235401.767869402974026371761524.99nullnullnullnullnullnull7858301214512976538999753.44falseExecute CreateViewCommand;ReusedExchange;Filter;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q86app-20220209234857-0093Not Recommended1.2521140.775388.227493350544126529749329.09nullnullnullnullnullnull74893240380035054413.56falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q27app-20220209230608-0033Not Recommended1.2522114.895587.18150373710327702815029.62nullnullnullnullnullnull81433067371037371033.18falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q66app-20220209232841-0073Not Recommended1.2424291.915938.089771528738330230861235.68nullnullnullnullnullnull9765292206162668046607033.22falseExecute CreateViewCommand;ReusedExchange;HashAggregate;ColumnarToRowDecimalType
TPC-DS Like Bench q53app-20220209232111-0060Not Recommended1.2322160.975233.027622387949627394736825.54nullnullnullnullnullnull7617290534712879537507013.45falseExecute CreateViewCommand;ReusedExchange;Filter;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q84app-20220209234754-0091Not Recommended1.2321195.34968.697129381406026164712940.65nullnullnullnullnullnull71233029105038140603.3falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench q63app-20220209232634-0070Not Recommended1.2321192.664957.337215349014726150698026.58nullnullnullnullnullnull7207297683811331833768293.45falseExecute CreateViewCommand;ReusedExchange;Filter;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q43app-20220209231533-0050Not Recommended1.2319958.184641.816660325794024600666029.65nullnullnullnullnullnull66512961446032579403.3falseExecute CreateViewCommand;ColumnarToRownull
TPC-DS Like Bench ss_maxbapp-20220209235804-0108Not Recommended1.2319063.414414.585825379849123478582548.17nullnullnullnullnullnull58193155711037984914.13falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench q3app-20220209224250-0006Not Recommended1.2220089.364522.636489289837324612648926.88nullnullnullnullnullnull64833094853028983733.3falseExecute CreateViewCommand;ColumnarToRownull
TPC-DS Like Bench q21app-20220209225818-0025Not Recommended1.2220413.614531.386610107292624945661040.94nullnullnullnullnullnull66053079474010729263.18falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q55app-20220209232217-0062Not Recommended1.2219494.184296.816165261278723791616524.78nullnullnullnullnullnull61582995446026127873.3falseExecute CreateViewCommand;ColumnarToRownull
TPC-DS Like Bench q92app-20220209235212-0099Not Recommended1.2120741.454549.546384209560125291612325.07nullnullnullnullnullnull638029671298541920101823.89falseExecute CreateViewCommand;ReusedExchange;ColumnarToRow;FilterDECIMAL
TPC-DS Like Bench q90app-20220209235114-0097Not Recommended1.2120450.984350.016209260467624801620944.95nullnullnullnullnullnull62042976499026046763.34falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench q32app-20220209230908-0038Not Recommended1.220973.264366.736107271296225340590925.21nullnullnullnullnullnull609830482548762326253393.83falseExecute CreateViewCommand;ReusedExchange;ColumnarToRow;FilterDECIMAL
TPC-DS Like Bench q42app-20220209231505-0049Not Recommended1.221414.784436.216365272675925851636523.15nullnullnullnullnullnull63583047836027267593.3falseExecute CreateViewCommand;ColumnarToRownull
TPC-DS Like Bench q52app-20220209232045-0059Not Recommended1.1920523.34071.695842268309024595584225.46nullnullnullnullnullnull58273074975026830903.3falseExecute CreateViewCommand;ColumnarToRownull
TPC-DS Like Bench q41app-20220209231439-0048Not Recommended1.1920533.934071.06564916156424605564955.4nullnullnullnullnullnull5642297075701615643.58falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench q96app-20220209235526-0103Not Recommended1.1820189.673776.325324230442823966532444.32nullnullnullnullnullnull53172947875023044283.44falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
DART-ALGOapplication_1665146417445_0002Not Recommended1.04375798.1216253.8744531759001723920522367514.55nullnullnullnullnullnull165795801759035546441403537313.19falseScan hive ecomm_ops_tables.zzz_dart_browse_ads_prod_mod;Scan hive ecomm_ops_tables.s0s0jzb_browse_shelf_cat_map;CollectLimitnull
DART-ALGOapplication_1665146417445_0003Not Recommended1.0690682.00.00069068200.0nullnullnullnullnullnull00001.0falsenullnull
"]}}],"execution_count":0},{"cell_type":"markdown","source":["## Stages Output"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"6756159b-30ca-407a-ab6b-9c29ced01ea6","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["stages_output=pd.read_csv(outputpath_string + \"/rapids_4_spark_qualification_output/rapids_4_spark_qualification_output_stages.csv\")\ndisplay(stages_output)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"cdde6177-db5f-434a-995b-776678a64a3a","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":true,"datasetInfos":[],"data":[["app-20220209224509-0008",31,2.95,1184,0,false],["app-20220209224509-0008",33,2.9,1086,0,false],["app-20220209224509-0008",35,3.37,2321523,0,false],["app-20220209224509-0008",41,3.9,172648,0,false],["app-20220209224509-0008",39,5.72,4586824,0,false],["app-20220209224509-0008",38,3.36,694337,0,false],["app-20220209224509-0008",40,4.26,656835,0,false],["app-20220209224509-0008",37,3.36,524190,0,false],["app-20220209224509-0008",32,2.9,641,0,false],["app-20220209224509-0008",36,2.73,7065,0,false],["app-20220209224509-0008",42,3.0,218,0,false],["app-20220209224509-0008",34,2.9,1080,0,false],["app-20220209235114-0097",39,2.71,0,0,true],["app-20220209235114-0097",40,3.54,413,0,false],["app-20220209235114-0097",34,2.95,964,0,false],["app-20220209235114-0097",37,2.71,0,0,true],["app-20220209235114-0097",41,3.0,365,0,false],["app-20220209235114-0097",31,2.95,1058,0,false],["app-20220209235114-0097",32,2.95,694,0,false],["app-20220209235114-0097",35,3.68,2142147,0,false],["app-20220209235114-0097",38,4.34,271,0,false],["app-20220209235114-0097",36,3.68,457864,0,false],["app-20220209235114-0097",33,2.95,900,0,false],["app-20220209230506-0031",35,3.33,93394,0,false],["app-20220209230506-0031",36,3.33,239863,0,false],["app-20220209230506-0031",38,6.91,2696172,0,false],["app-20220209230506-0031",37,3.33,1684494,0,false],["app-20220209230506-0031",40,3.9,205018,0,false],["app-20220209230506-0031",32,2.9,7530,0,false],["app-20220209230506-0031",41,3.0,210,0,false],["app-20220209230506-0031",39,5.67,2129775,0,false],["app-20220209230506-0031",34,2.95,1198,0,false],["app-20220209230506-0031",31,2.95,1284,0,false],["app-20220209230506-0031",33,2.9,1258,0,false],["app-20220209232634-0070",32,2.9,1046,0,false],["app-20220209232634-0070",34,3.72,2226056,0,false],["app-20220209232634-0070",31,2.95,6677,0,false],["app-20220209232634-0070",33,2.95,672,0,false],["app-20220209232634-0070",37,3.0,210,0,false],["app-20220209232634-0070",35,4.3,688894,0,false],["app-20220209232634-0070",36,4.3,566592,113318,false],["app-20220209225845-0026",36,3.0,303,0,false],["app-20220209225845-0026",32,2.9,5690,0,false],["app-20220209225845-0026",31,2.95,1181,0,false],["app-20220209225845-0026",34,3.68,621736,0,false],["app-20220209225845-0026",33,2.9,894,0,false],["app-20220209225845-0026",35,3.9,1106260,0,false],["app-20220209235526-0103",34,3.68,2301205,0,false],["app-20220209235526-0103",31,2.95,1051,0,false],["app-20220209235526-0103",33,2.95,875,0,false],["app-20220209235526-0103",32,2.95,676,0,false],["app-20220209235526-0103",36,4.69,621,0,false],["app-20220209235526-0103",35,2.6,0,0,true],["app-20220209231919-0057",35,3.33,6655624,0,false],["app-20220209231919-0057",36,5.78,9297072,0,false],["app-20220209231919-0057",38,3.0,228,0,false],["app-20220209231919-0057",31,2.9,711,0,false],["app-20220209231919-0057",37,3.9,354848,0,false],["app-20220209231919-0057",34,3.33,134143,0,false],["app-20220209231919-0057",32,2.95,724,0,false],["app-20220209231919-0057",33,2.9,695,0,false],["app-20220209231533-0050",33,3.71,2489960,0,false],["app-20220209231533-0050",34,3.9,765614,0,false],["app-20220209231533-0050",35,3.0,246,0,false],["app-20220209231533-0050",32,2.95,1024,0,false],["app-20220209231533-0050",31,2.95,1096,0,false],["application_1665146417445_0002",4,4.5,233,0,false],["application_1665146417445_0002",3,4.34,2893207,0,false],["application_1665146417445_0002",2,2.6,14571021,7285510,false],["application_1665146417445_0002",1,2.0,51972027,25986013,false],["application_1665146417445_0002",7,4.5,244,0,false],["application_1665146417445_0002",6,3.98,1918109,0,false],["application_1665146417445_0002",5,2.6,4540826,2270413,false],["application_1665146417445_0002",0,1.0,4505,4505,false],["app-20220209230053-0028",40,3.71,4979300,0,false],["app-20220209230053-0028",42,3.94,517898,0,false],["app-20220209230053-0028",38,4.34,53,0,false],["app-20220209230053-0028",44,7.76,730644,0,false],["app-20220209230053-0028",54,3.0,221,0,false],["app-20220209230053-0028",35,3.33,4618718,0,false],["app-20220209230053-0028",36,3.33,59206,0,false],["app-20220209230053-0028",50,7.76,661105,0,false],["app-20220209230053-0028",43,3.33,25052,0,false],["app-20220209230053-0028",37,5.73,8697022,1449502,false],["app-20220209230053-0028",39,2.95,77,0,false],["app-20220209230053-0028",53,2.68,456328,182530,false],["app-20220209230053-0028",45,3.33,34900,0,false],["app-20220209230053-0028",51,8.28,13701110,2997113,false],["app-20220209230053-0028",31,2.95,701,0,false],["app-20220209230053-0028",46,3.37,2366404,0,false],["app-20220209230053-0028",52,8.28,17309649,3786482,false],["app-20220209230053-0028",32,2.9,5351,0,false],["app-20220209230053-0028",34,2.95,764,0,false],["app-20220209230053-0028",33,2.95,1153,0,false],["app-20220209230053-0028",48,3.33,28729,0,false],["app-20220209230053-0028",49,3.94,509837,0,false],["app-20220209230053-0028",41,3.33,23824,0,false],["app-20220209230053-0028",47,3.71,5071811,0,false],["app-20220209230750-0036",42,5.98,600422,0,false],["app-20220209230750-0036",34,3.61,743462,0,false],["app-20220209230750-0036",41,6.33,219915,24435,false],["app-20220209230750-0036",32,2.95,1026,0,false],["app-20220209230750-0036",40,3.33,216977,0,false],["app-20220209230750-0036",33,3.33,31565,0,false],["app-20220209230750-0036",31,2.95,22333,0,false],["app-20220209230750-0036",38,4.01,796870,0,false],["app-20220209230750-0036",39,4.3,579941,0,false],["app-20220209230750-0036",35,6.45,1095379,0,false],["app-20220209230750-0036",37,6.45,3390912,0,false],["app-20220209230750-0036",43,3.0,317,0,false],["app-20220209230750-0036",36,3.61,748634,0,false],["app-20220209224725-0012",60,1.06,0,0,true],["app-20220209224725-0012",48,1.06,0,0,true],["app-20220209224725-0012",67,4.34,116,0,false],["app-20220209224725-0012",39,3.54,321010,0,false],["app-20220209224725-0012",57,4.34,355,0,false],["app-20220209224725-0012",47,4.34,403,0,false],["app-20220209224725-0012",70,1.06,0,0,true],["app-20220209224725-0012",53,4.34,319,0,false],["app-20220209224725-0012",38,3.54,417745,0,false],["app-20220209224725-0012",52,1.06,0,0,true],["app-20220209224725-0012",32,3.54,459002,0,false],["app-20220209224725-0012",74,1.06,0,0,true],["app-20220209224725-0012",61,4.34,351,0,false],["app-20220209224725-0012",76,2.95,345,0,false],["app-20220209224725-0012",44,3.54,715730,0,false],["app-20220209224725-0012",45,3.54,301672,0,false],["app-20220209224725-0012",33,3.54,270046,0,false],["app-20220209224725-0012",58,1.06,0,0,true],["app-20220209224725-0012",63,4.34,493,0,false],["app-20220209224725-0012",66,1.06,0,0,true],["app-20220209224725-0012",69,4.34,60,0,false],["app-20220209224725-0012",75,4.34,238,0,false],["app-20220209224725-0012",62,1.06,0,0,true],["app-20220209224725-0012",73,4.34,229,0,false],["app-20220209224725-0012",64,1.06,0,0,true],["app-20220209224725-0012",46,1.06,0,0,true],["app-20220209224725-0012",71,4.34,230,0,false],["app-20220209224725-0012",65,4.34,391,0,false],["app-20220209224725-0012",31,3.54,2284766,0,false],["app-20220209224725-0012",55,4.34,359,0,false],["app-20220209224725-0012",40,3.54,444891,0,false],["app-20220209224725-0012",50,1.06,0,0,true],["app-20220209224725-0012",54,1.06,0,0,true],["app-20220209224725-0012",36,3.54,591557,0,false],["app-20220209224725-0012",34,3.54,312789,0,false],["app-20220209224725-0012",49,4.34,392,0,false],["app-20220209224725-0012",42,3.54,493357,0,false],["app-20220209224725-0012",72,1.06,0,0,true],["app-20220209224725-0012",37,3.54,435568,0,false],["app-20220209224725-0012",51,4.34,407,0,false],["app-20220209224725-0012",68,1.06,0,0,true],["app-20220209224725-0012",59,4.34,408,0,false],["app-20220209224725-0012",56,1.06,0,0,true],["app-20220209224725-0012",41,3.54,318752,0,false],["app-20220209224725-0012",35,3.54,415493,0,false],["app-20220209224725-0012",43,3.54,277069,0,false],["app-20220209233831-0081",44,3.94,417661,0,false],["app-20220209233831-0081",43,4.3,441931,0,false],["app-20220209233831-0081",47,3.0,315,0,false],["app-20220209233831-0081",40,3.33,2196010,0,false],["app-20220209233831-0081",33,3.33,254652,0,false],["app-20220209233831-0081",45,4.3,487701,0,false],["app-20220209233831-0081",32,2.9,734,0,false],["app-20220209233831-0081",34,3.33,580229,0,false],["app-20220209233831-0081",31,2.9,720,0,false],["app-20220209233831-0081",39,6.04,2047617,0,false],["app-20220209233831-0081",38,3.33,608034,0,false],["app-20220209233831-0081",42,4.01,439284,0,false],["app-20220209233831-0081",46,8.35,1560260,0,false],["app-20220209233831-0081",41,6.04,1630341,0,false],["app-20220209233831-0081",35,6.04,1807228,0,false],["app-20220209233831-0081",37,6.04,3659231,0,false],["app-20220209233831-0081",36,3.33,560292,0,false],["app-20220209231114-0042",31,2.95,922,0,false],["app-20220209231114-0042",36,4.55,511528,0,false],["app-20220209231114-0042",37,3.0,210,0,false],["app-20220209231114-0042",35,4.3,609916,0,false],["app-20220209231114-0042",33,2.9,5804,0,false],["app-20220209231114-0042",34,3.68,2513313,0,false],["app-20220209231114-0042",32,2.95,1057,0,false],["app-20220209235046-0096",37,3.0,259,0,false],["app-20220209235046-0096",35,4.3,965075,0,false],["app-20220209235046-0096",32,2.9,6405,0,false],["app-20220209235046-0096",33,2.95,1182,0,false],["app-20220209235046-0096",34,3.72,2407080,0,false],["app-20220209235046-0096",36,4.3,648825,129765,false],["app-20220209235046-0096",31,2.9,914,0,false],["app-20220209231505-0049",32,2.95,5516,0,false],["app-20220209231505-0049",34,3.9,641427,0,false],["app-20220209231505-0049",35,3.0,248,0,false],["app-20220209231505-0049",31,2.95,976,0,false],["app-20220209231505-0049",33,3.71,2078592,0,false],["app-20220209225818-0025",33,2.95,6013,0,false],["app-20220209225818-0025",36,3.0,544,0,false],["app-20220209225818-0025",31,2.9,1361,0,false],["app-20220209225818-0025",32,2.9,1240,0,false],["app-20220209225818-0025",35,3.62,1015964,0,false],["app-20220209225818-0025",34,3.72,47804,0,false],["app-20220209225607-0021",38,3.33,387672,0,false],["app-20220209225607-0021",34,2.9,6157,0,false],["app-20220209225607-0021",35,3.33,1378114,0,false],["app-20220209225607-0021",37,6.91,3272073,0,false],["app-20220209225607-0021",31,2.95,714,0,false],["app-20220209225607-0021",40,3.9,201893,0,false],["app-20220209225607-0021",39,5.67,1946956,0,false],["app-20220209225607-0021",33,2.9,1214,0,false],["app-20220209225607-0021",36,3.33,622516,0,false],["app-20220209225607-0021",32,2.95,700,0,false],["app-20220209225607-0021",41,3.0,269,0,false],["app-20220209225749-0024",32,2.9,6036,0,false],["app-20220209225749-0024",33,3.71,359383,0,false],["app-20220209225749-0024",31,2.95,1315,0,false],["app-20220209225749-0024",35,4.55,715482,0,false],["app-20220209225749-0024",34,4.3,958227,0,false],["app-20220209225749-0024",36,3.0,531,0,false],["app-20220209231439-0048",31,3.54,8109,0,false],["app-20220209231439-0048",36,3.9,65909,0,false],["app-20220209231439-0048",37,3.0,683,0,false],["app-20220209231439-0048",32,2.6,0,0,true],["app-20220209231439-0048",33,3.82,83422,0,false],["app-20220209231439-0048",35,2.6,0,0,true],["app-20220209231439-0048",34,3.63,3441,0,false],["app-20220209232045-0059",31,2.95,1017,0,false],["app-20220209232045-0059",32,2.95,5391,0,false],["app-20220209232045-0059",35,3.0,269,0,false],["app-20220209232045-0059",33,3.71,1986094,0,false],["app-20220209232045-0059",34,3.9,690319,0,false],["app-20220209224648-0011",32,2.9,1241,0,false],["app-20220209224648-0011",40,3.67,1155731,0,false],["app-20220209224648-0011",31,2.95,1005,0,false],["app-20220209224648-0011",37,3.94,1180107,0,false],["app-20220209224648-0011",41,6.45,356915,0,false],["app-20220209224648-0011",33,3.37,217326,0,false],["app-20220209224648-0011",43,3.0,199,0,false],["app-20220209224648-0011",42,3.9,139846,0,false],["app-20220209224648-0011",36,3.33,37191,0,false],["app-20220209224648-0011",38,7.86,449220,0,false],["app-20220209224648-0011",39,4.3,110154,0,false],["app-20220209224648-0011",34,3.33,39348,0,false],["app-20220209224648-0011",35,6.45,3005041,0,false],["app-20220209224756-0013",38,6.27,5393922,567780,false],["app-20220209224756-0013",40,3.0,247,0,false],["app-20220209224756-0013",36,3.75,154489,0,false],["app-20220209224756-0013",34,3.75,1406700,0,false],["app-20220209224756-0013",31,2.9,2548,0,false],["app-20220209224756-0013",32,2.95,852,0,false],["app-20220209224756-0013",35,3.33,65257,0,false],["app-20220209224756-0013",33,2.95,22123,0,false],["app-20220209224756-0013",39,3.9,549588,0,false],["app-20220209224756-0013",37,3.75,150072,0,false],["app-20220209235141-0098",39,4.34,314408,0,false],["app-20220209235141-0098",42,2.78,0,0,true],["app-20220209235141-0098",34,2.9,1104,0,false],["app-20220209235141-0098",37,3.33,123845,0,false],["app-20220209235141-0098",38,5.78,2429250,0,false],["app-20220209235141-0098",31,2.95,1242,0,false],["app-20220209235141-0098",43,4.3,145210,0,false],["app-20220209235141-0098",36,3.67,54739,0,false],["app-20220209235141-0098",40,2.78,0,0,true],["app-20220209235141-0098",32,2.95,20611,0,false],["app-20220209235141-0098",33,2.95,957,0,false],["app-20220209235141-0098",41,2.78,0,0,true],["app-20220209235141-0098",44,6.1,12646,0,false],["app-20220209235141-0098",35,2.9,2186,0,false],["app-20220209231256-0045",32,2.9,838,0,false],["app-20220209231256-0045",33,2.9,6217,0,false],["app-20220209231256-0045",41,2.64,0,0,true],["app-20220209231256-0045",35,3.72,33955,0,false],["app-20220209231256-0045",42,2.64,0,0,true],["app-20220209231256-0045",37,3.72,33154,0,false],["app-20220209231256-0045",31,2.95,700,0,false],["app-20220209231256-0045",44,6.91,506140,0,false],["app-20220209231256-0045",36,3.94,393170,0,false],["app-20220209231256-0045",34,2.95,945,0,false],["app-20220209231256-0045",40,2.64,0,0,true],["app-20220209231256-0045",43,2.64,0,0,true],["app-20220209231256-0045",38,3.94,1744813,0,false],["app-20220209231256-0045",45,6.1,1050573,0,false],["app-20220209231256-0045",39,7.45,1023721,0,false],["app-20220209224316-0007",48,4.3,487756,0,false],["app-20220209224316-0007",34,3.33,279385,0,false],["app-20220209224316-0007",36,3.33,805680,0,false],["app-20220209224316-0007",38,3.33,1127786,0,false],["app-20220209224316-0007",47,3.94,431055,0,false],["app-20220209224316-0007",45,6.04,13349286,0,false],["app-20220209224316-0007",35,6.04,19573046,0,false],["app-20220209224316-0007",31,2.9,1186,0,false],["app-20220209224316-0007",41,6.04,9850301,0,false],["app-20220209224316-0007",53,3.0,241,0,false],["app-20220209224316-0007",39,6.04,18402446,0,false],["app-20220209224316-0007",42,3.33,393456,0,false],["app-20220209224316-0007",50,4.3,512640,0,false],["app-20220209224316-0007",44,3.33,2478797,0,false],["app-20220209224316-0007",43,6.04,5018114,0,false],["app-20220209224316-0007",40,3.33,733210,0,false],["app-20220209224316-0007",51,4.3,515369,0,false],["app-20220209224316-0007",46,3.94,770947,0,false],["app-20220209224316-0007",32,2.9,707,0,false],["app-20220209224316-0007",52,8.35,2747585,0,false],["app-20220209224316-0007",33,3.33,1830306,0,false],["app-20220209224316-0007",37,6.04,5448378,0,false],["app-20220209224316-0007",49,4.01,567023,0,false],["app-20220209234754-0091",31,3.37,2792403,0,false],["app-20220209234754-0091",36,3.7,55108,0,false],["app-20220209234754-0091",38,4.2,217327,0,false],["app-20220209234754-0091",34,2.95,520,0,false],["app-20220209234754-0091",35,2.95,12240,0,false],["app-20220209234754-0091",39,2.78,0,0,true],["app-20220209234754-0091",37,2.78,0,0,true],["app-20220209234754-0091",33,2.9,860,0,false],["app-20220209234754-0091",40,3.75,734901,0,false],["app-20220209234754-0091",41,3.0,346,0,false],["app-20220209234754-0091",32,2.9,355,0,false],["app-20220209232242-0063",32,2.95,22511,0,false],["app-20220209232242-0063",35,3.72,474053,0,false],["app-20220209232242-0063",37,3.72,178166,0,false],["app-20220209232242-0063",39,3.9,277181,0,false],["app-20220209232242-0063",38,4.34,2418570,0,false],["app-20220209232242-0063",40,3.0,279,0,false],["app-20220209232242-0063",31,2.95,760,0,false],["app-20220209232242-0063",36,3.72,348149,0,false],["app-20220209232242-0063",34,3.48,4301,0,false],["app-20220209232242-0063",33,2.95,5496,0,false],["app-20220209232500-0067",36,3.72,850479,0,false],["app-20220209232500-0067",35,3.72,934763,0,false],["app-20220209232500-0067",37,3.72,63271,0,false],["app-20220209232500-0067",40,3.0,243,0,false],["app-20220209232500-0067",31,2.95,1000,0,false],["app-20220209232500-0067",34,3.48,3841,0,false],["app-20220209232500-0067",33,2.95,5817,0,false],["app-20220209232500-0067",32,2.95,23002,0,false],["app-20220209232500-0067",38,4.34,1706437,0,false],["app-20220209232500-0067",39,3.9,245823,0,false],["app-20220209234532-0087",31,2.95,1378,0,false],["app-20220209234532-0087",44,7.85,2042645,127665,false],["app-20220209234532-0087",41,3.33,1154273,0,false],["app-20220209234532-0087",42,3.37,761369,0,false],["app-20220209234532-0087",47,3.9,167144,0,false],["app-20220209234532-0087",34,2.9,730,0,false],["app-20220209234532-0087",40,3.37,853020,0,false],["app-20220209234532-0087",33,2.9,914,0,false],["app-20220209234532-0087",38,3.33,89863,0,false],["app-20220209234532-0087",43,7.85,1710173,106885,false],["app-20220209234532-0087",48,3.0,220,0,false],["app-20220209234532-0087",45,7.85,3459742,216233,false],["app-20220209234532-0087",39,3.33,494266,0,false],["app-20220209234532-0087",46,2.94,652694,217563,false],["app-20220209234532-0087",35,2.9,1036,0,false],["app-20220209234532-0087",32,2.95,1383,0,false],["app-20220209234532-0087",36,2.95,5670,0,false],["app-20220209234532-0087",37,3.37,1233606,0,false],["app-20220209232841-0073",35,3.61,3266643,272220,false],["app-20220209232841-0073",34,2.9,1104,0,false],["app-20220209232841-0073",37,3.18,831509,277168,false],["app-20220209232841-0073",36,3.61,927511,77292,false],["app-20220209232841-0073",31,2.95,984,0,false],["app-20220209232841-0073",32,2.95,882,0,false],["app-20220209232841-0073",33,2.9,709,0,false],["app-20220209232841-0073",39,3.0,264,0,false],["app-20220209232841-0073",38,3.9,257777,0,false],["app-20220209234412-0085",38,7.85,4660460,0,false],["app-20220209234412-0085",37,3.37,500540,0,false],["app-20220209234412-0085",42,3.0,273,0,false],["app-20220209234412-0085",39,7.85,1163782,0,false],["app-20220209234412-0085",41,7.79,6766750,0,false],["app-20220209234412-0085",36,2.73,3065804,0,false],["app-20220209234412-0085",40,7.85,5326278,0,false],["app-20220209234412-0085",32,3.33,1206608,0,false],["app-20220209234412-0085",31,2.9,1128,0,false],["app-20220209234412-0085",35,3.37,480342,0,false],["app-20220209234412-0085",33,3.37,1044334,0,false],["app-20220209234412-0085",34,3.33,537612,0,false],["app-20220209224220-0005",36,4.2,89436,0,false],["app-20220209224220-0005",31,2.9,736,0,false],["app-20220209224220-0005",44,2.8,0,0,true],["app-20220209224220-0005",41,2.8,0,0,true],["app-20220209224220-0005",38,2.8,0,0,true],["app-20220209224220-0005",37,2.8,0,0,true],["app-20220209224220-0005",43,2.8,0,0,true],["app-20220209224220-0005",34,3.4,4520914,0,false],["app-20220209224220-0005",32,2.95,692,0,false],["app-20220209224220-0005",33,2.95,898,0,false],["app-20220209224220-0005",45,2.8,0,0,true],["app-20220209224220-0005",46,4.84,12730,0,false],["app-20220209224220-0005",39,6.88,73927,0,false],["app-20220209224220-0005",35,2.8,0,0,true],["app-20220209224220-0005",42,6.43,24713,0,false],["app-20220209224220-0005",40,2.8,0,0,true],["app-20220209232531-0068",44,3.0,353,0,false],["app-20220209232531-0068",37,3.33,32522,0,false],["app-20220209232531-0068",42,5.87,716505,0,false],["app-20220209232531-0068",31,2.95,817,0,false],["app-20220209232531-0068",35,2.95,985,0,false],["app-20220209232531-0068",38,5.87,2346453,0,false],["app-20220209232531-0068",32,2.95,1101,0,false],["app-20220209232531-0068",36,3.67,988849,0,false],["app-20220209232531-0068",43,3.54,125,0,false],["app-20220209232531-0068",39,4.34,77,0,false],["app-20220209232531-0068",34,2.95,22737,0,false],["app-20220209232531-0068",33,2.95,5981,0,false],["app-20220209232531-0068",41,2.82,0,0,true],["app-20220209232531-0068",40,3.69,259935,0,false],["app-20220209234611-0088",41,3.33,42782,0,false],["app-20220209234611-0088",40,3.33,49031,0,false],["app-20220209234611-0088",44,3.0,289,0,false],["app-20220209234611-0088",32,3.33,45314,0,false],["app-20220209234611-0088",35,3.61,1416368,0,false],["app-20220209234611-0088",36,6.45,1079908,0,false],["app-20220209234611-0088",38,4.3,959653,0,false],["app-20220209234611-0088",34,6.45,3784569,0,false],["app-20220209234611-0088",37,4.01,552872,0,false],["app-20220209234611-0088",33,3.61,813372,0,false],["app-20220209234611-0088",43,6.71,479127,0,false],["app-20220209234611-0088",42,6.91,584929,0,false],["app-20220209234611-0088",39,6.33,224600,24955,false],["app-20220209234611-0088",31,2.95,712,0,false],["app-20220209233802-0080",33,2.95,907,0,false],["app-20220209233802-0080",39,2.71,0,0,true],["app-20220209233802-0080",36,4.01,709516,0,false],["app-20220209233802-0080",38,2.71,0,0,true],["app-20220209233802-0080",32,2.95,1154,0,false],["app-20220209233802-0080",41,6.91,176406,0,false],["app-20220209233802-0080",34,3.33,265848,0,false],["app-20220209233802-0080",42,6.1,86051,0,false],["app-20220209233802-0080",40,2.71,0,0,true],["app-20220209233802-0080",35,3.72,1422775,0,false],["app-20220209233802-0080",31,2.95,712,0,false],["app-20220209233802-0080",37,7.45,422932,0,false],["app-20220209232701-0071",67,2.75,0,0,true],["app-20220209232701-0071",39,2.9,969,0,false],["app-20220209232701-0071",81,6.91,165236,0,false],["app-20220209232701-0071",79,2.75,0,0,true],["app-20220209232701-0071",80,2.75,0,0,true],["app-20220209232701-0071",73,2.75,0,0,true],["app-20220209232701-0071",41,3.37,807694,0,false],["app-20220209232701-0071",74,2.75,0,0,true],["app-20220209232701-0071",32,2.9,721,0,false],["app-20220209232701-0071",50,6.91,1940780,0,false],["app-20220209232701-0071",36,2.9,2302,0,false],["app-20220209232701-0071",35,2.9,753,0,false],["app-20220209232701-0071",68,2.75,0,0,true],["app-20220209232701-0071",42,3.37,4629150,0,false],["app-20220209232701-0071",64,2.75,0,0,true],["app-20220209232701-0071",60,7.45,206857,0,false],["app-20220209232701-0071",66,2.75,0,0,true],["app-20220209232701-0071",61,2.75,0,0,true],["app-20220209232701-0071",40,3.33,1520003,0,false],["app-20220209232701-0071",49,5.63,1258640,0,false],["app-20220209232701-0071",70,2.75,0,0,true],["app-20220209232701-0071",63,2.75,0,0,true],["app-20220209232701-0071",34,2.9,1135,0,false],["app-20220209232701-0071",54,6.91,2001958,0,false],["app-20220209232701-0071",76,2.75,0,0,true],["app-20220209232701-0071",58,5.78,592364,0,false],["app-20220209232701-0071",37,2.9,945,0,false],["app-20220209232701-0071",38,2.9,903,0,false],["app-20220209232701-0071",45,6.91,2252840,0,false],["app-20220209232701-0071",55,5.14,1223245,174748,false],["app-20220209232701-0071",47,3.33,49419,0,false],["app-20220209232701-0071",33,2.9,1148,0,false],["app-20220209232701-0071",44,6.25,7791216,973902,false],["app-20220209232701-0071",78,2.75,0,0,true],["app-20220209232701-0071",69,2.75,0,0,true],["app-20220209232701-0071",57,6.91,1172228,0,false],["app-20220209232701-0071",53,3.33,1303138,0,false],["app-20220209232701-0071",71,2.75,0,0,true],["app-20220209232701-0071",52,4.3,137115,0,false],["app-20220209232701-0071",65,2.75,0,0,true],["app-20220209232701-0071",77,2.75,0,0,true],["app-20220209232701-0071",48,3.33,50653,0,false],["app-20220209232701-0071",31,2.95,5912,0,false],["app-20220209232701-0071",59,4.3,175767,0,false],["app-20220209232701-0071",62,2.75,0,0,true],["app-20220209232701-0071",75,2.75,0,0,true],["app-20220209232701-0071",46,5.14,1258887,179840,false],["app-20220209232701-0071",82,6.1,436097,0,false],["app-20220209232701-0071",51,5.78,1058976,0,false],["app-20220209232701-0071",56,5.63,1080510,0,false],["app-20220209232701-0071",43,3.37,724796,0,false],["app-20220209232701-0071",72,2.75,0,0,true],["app-20220209225233-0018",41,2.95,1507,0,false],["app-20220209225233-0018",53,2.6,0,0,true],["app-20220209225233-0018",46,3.67,897723,0,false],["app-20220209225233-0018",47,3.67,1164829,0,false],["app-20220209225233-0018",52,2.6,0,0,true],["app-20220209225233-0018",61,9.07,3262143,0,false],["app-20220209225233-0018",43,2.6,1358,679,false],["app-20220209225233-0018",33,2.9,5319,0,false],["app-20220209225233-0018",50,3.33,1111,0,false],["app-20220209225233-0018",34,2.95,859,0,false],["app-20220209225233-0018",57,2.6,0,0,true],["app-20220209225233-0018",58,3.67,822295,0,false],["app-20220209225233-0018",37,2.9,5205,0,false],["app-20220209225233-0018",48,9.07,6261819,0,false],["app-20220209225233-0018",49,4.24,357876,0,false],["app-20220209225233-0018",56,3.33,51156,0,false],["app-20220209225233-0018",31,2.95,1313,0,false],["app-20220209225233-0018",65,7.82,757647,68877,false],["app-20220209225233-0018",38,2.95,1355,0,false],["app-20220209225233-0018",40,2.95,926,0,false],["app-20220209225233-0018",44,2.95,225,0,false],["app-20220209225233-0018",35,2.95,732,0,false],["app-20220209225233-0018",39,2.95,1071,0,false],["app-20220209225233-0018",42,3.29,5083750,462159,false],["app-20220209225233-0018",55,2.6,0,0,true],["app-20220209225233-0018",60,3.67,1168706,0,false],["app-20220209225233-0018",54,2.6,0,0,true],["app-20220209225233-0018",62,4.24,90128,0,false],["app-20220209225233-0018",51,9.42,396848,0,false],["app-20220209225233-0018",66,5.13,378755,116540,false],["app-20220209225233-0018",63,3.33,31336,0,false],["app-20220209225233-0018",67,3.0,223,0,false],["app-20220209225233-0018",45,3.67,3608365,0,false],["app-20220209225233-0018",64,7.82,569607,51782,false],["app-20220209225233-0018",36,2.9,5406,0,false],["app-20220209225233-0018",59,3.67,2136646,0,false],["app-20220209225233-0018",32,2.95,725,0,false],["app-20220209235705-0106",35,3.72,3491837,0,false],["app-20220209235705-0106",34,2.95,944,0,false],["app-20220209235705-0106",37,3.9,1062626,0,false],["app-20220209235705-0106",33,2.9,1051,0,false],["app-20220209235705-0106",38,3.0,265,0,false],["app-20220209235705-0106",32,2.9,727,0,false],["app-20220209235705-0106",36,2.71,0,0,true],["app-20220209235705-0106",31,2.9,825,0,false],["app-20220209231707-0053",31,2.95,1123,0,false],["app-20220209231707-0053",32,2.95,849,0,false],["app-20220209231707-0053",40,3.0,244,0,false],["app-20220209231707-0053",36,3.33,258698,0,false],["app-20220209231707-0053",37,6.21,2443897,0,false],["app-20220209231707-0053",33,2.95,1117,0,false],["app-20220209231707-0053",39,6.71,465297,0,false],["app-20220209231707-0053",34,3.69,1769010,0,false],["app-20220209231707-0053",35,3.33,49296,0,false],["app-20220209231707-0053",38,6.91,1173511,0,false],["app-20220209232803-0072",37,4.11,1581051,0,false],["app-20220209232803-0072",38,6.42,803615,0,false],["app-20220209232803-0072",34,3.68,2008936,0,false],["app-20220209232803-0072",32,2.9,6598,0,false],["app-20220209232803-0072",33,2.95,1110,0,false],["app-20220209232803-0072",39,3.0,222,0,false],["app-20220209232803-0072",36,4.3,2025555,0,false],["app-20220209232803-0072",31,2.9,970,0,false],["app-20220209232803-0072",35,3.68,3736014,0,false],["app-20220209234649-0089",36,3.9,203231,0,false],["app-20220209234649-0089",37,3.0,204,0,false],["app-20220209234649-0089",32,2.95,1305,0,false],["app-20220209234649-0089",35,6.45,1635641,0,false],["app-20220209234649-0089",33,3.37,5482868,0,false],["app-20220209234649-0089",34,3.62,15909,0,false],["app-20220209234649-0089",31,2.95,5331,0,false],["app-20220209224147-0004",38,3.33,57615,0,false],["app-20220209224147-0004",37,5.59,595309,54119,false],["app-20220209224147-0004",33,3.68,1141311,0,false],["app-20220209224147-0004",36,4.01,1631076,0,false],["app-20220209224147-0004",39,6.71,379029,0,false],["app-20220209224147-0004",34,3.68,2625437,0,false],["app-20220209224147-0004",35,4.3,1166672,0,false],["app-20220209224147-0004",32,2.95,969,0,false],["app-20220209224147-0004",40,3.0,218,0,false],["app-20220209224147-0004",31,2.95,914,0,false],["app-20220209234000-0083",33,3.64,5995673,0,false],["app-20220209234000-0083",32,2.9,5985,0,false],["app-20220209234000-0083",36,3.0,229,0,false],["app-20220209234000-0083",35,3.9,261784,0,false],["app-20220209234000-0083",34,2.67,0,0,true],["app-20220209234000-0083",31,2.9,1160,0,false],["app-20220209231143-0043",33,3.37,3844378,0,false],["app-20220209231143-0043",35,6.45,1701305,0,false],["app-20220209231143-0043",37,3.0,200,0,false],["app-20220209231143-0043",32,2.95,1182,0,false],["app-20220209231143-0043",36,3.9,178586,0,false],["app-20220209231143-0043",34,3.62,23363,0,false],["app-20220209231143-0043",31,2.95,5384,0,false],["app-20220209232314-0064",44,3.0,318,0,false],["app-20220209232314-0064",42,4.83,274987,0,false],["app-20220209232314-0064",35,3.72,1150328,0,false],["app-20220209232314-0064",43,7.26,710785,0,false],["app-20220209232314-0064",31,2.9,951,0,false],["app-20220209232314-0064",38,4.3,1178782,0,false],["app-20220209232314-0064",39,4.84,756671,0,false],["app-20220209232314-0064",33,2.9,685,0,false],["app-20220209232314-0064",37,3.72,3211086,0,false],["app-20220209232314-0064",34,2.9,1110,0,false],["app-20220209232314-0064",32,2.9,5699,0,false],["app-20220209232314-0064",36,4.3,482152,0,false],["app-20220209232314-0064",41,4.83,335737,0,false],["app-20220209232314-0064",40,4.34,265132,66283,false],["app-20220209224544-0009",52,6.45,825131,0,false],["app-20220209224544-0009",39,2.43,0,0,true],["app-20220209224544-0009",49,6.91,2192839,0,false],["app-20220209224544-0009",32,4.5,62,0,false],["app-20220209224544-0009",36,4.5,312,0,false],["app-20220209224544-0009",54,3.0,192,0,false],["app-20220209224544-0009",37,2.43,0,0,true],["app-20220209224544-0009",53,3.62,156665,0,false],["app-20220209224544-0009",44,4.34,6842,0,false],["app-20220209224544-0009",46,3.33,22104,0,false],["app-20220209224544-0009",40,4.5,4586,0,false],["app-20220209224544-0009",50,6.18,1690487,0,false],["app-20220209224544-0009",43,2.43,0,0,true],["app-20220209224544-0009",41,2.43,0,0,true],["app-20220209224544-0009",45,2.95,317,0,false],["app-20220209224544-0009",33,3.62,7744,0,false],["app-20220209224544-0009",38,4.5,1073,0,false],["app-20220209224544-0009",42,4.5,7935,0,false],["app-20220209224544-0009",51,3.39,5183,863,false],["app-20220209224544-0009",48,3.33,268230,0,false],["app-20220209224544-0009",35,2.43,0,0,true],["app-20220209224544-0009",47,3.33,112881,0,false],["app-20220209224544-0009",34,4.34,1031446,0,false],["app-20220209224544-0009",31,3.54,1445,0,false],["app-20220209233444-0075",33,2.95,1074,0,false],["app-20220209233444-0075",38,6.91,778002,0,false],["app-20220209233444-0075",37,6.21,2271961,0,false],["app-20220209233444-0075",31,2.95,1107,0,false],["app-20220209233444-0075",40,3.0,273,0,false],["app-20220209233444-0075",36,3.33,231471,0,false],["app-20220209233444-0075",39,6.71,578351,0,false],["app-20220209233444-0075",32,2.95,1262,0,false],["app-20220209233444-0075",34,3.69,1204546,0,false],["app-20220209233444-0075",35,3.33,41376,0,false],["app-20220209225013-0017",46,9.07,6144499,0,false],["app-20220209225013-0017",56,3.67,1387190,0,false],["app-20220209225013-0017",49,2.73,0,0,true],["app-20220209225013-0017",66,3.9,216038,0,false],["app-20220209225013-0017",48,9.42,256002,0,false],["app-20220209225013-0017",44,3.67,1550800,0,false],["app-20220209225013-0017",34,2.95,1081,0,false],["app-20220209225013-0017",55,3.33,64300,0,false],["app-20220209225013-0017",36,2.9,5343,0,false],["app-20220209225013-0017",61,3.33,137543,0,false],["app-20220209225013-0017",40,3.29,5068417,460765,false],["app-20220209225013-0017",45,3.67,729989,0,false],["app-20220209225013-0017",42,3.33,3513,0,false],["app-20220209225013-0017",64,7.82,627397,57036,false],["app-20220209225013-0017",39,2.95,941,0,false],["app-20220209225013-0017",59,9.07,3088447,0,false],["app-20220209225013-0017",57,3.67,680022,0,false],["app-20220209225013-0017",54,3.33,122388,0,false],["app-20220209225013-0017",51,2.73,0,0,true],["app-20220209225013-0017",50,2.73,0,0,true],["app-20220209225013-0017",53,2.73,0,0,true],["app-20220209225013-0017",31,2.9,6193,0,false],["app-20220209225013-0017",41,2.6,1933,966,false],["app-20220209225013-0017",47,4.24,292333,0,false],["app-20220209225013-0017",32,2.95,1213,0,false],["app-20220209225013-0017",60,4.24,113495,0,false],["app-20220209225013-0017",38,2.95,723,0,false],["app-20220209225013-0017",67,3.0,260,0,false],["app-20220209225013-0017",52,2.73,0,0,true],["app-20220209225013-0017",58,3.67,2098697,0,false],["app-20220209225013-0017",43,3.67,3569769,0,false],["app-20220209225013-0017",35,2.9,5770,0,false],["app-20220209225013-0017",33,2.95,1280,0,false],["app-20220209225013-0017",63,7.82,600289,54571,false],["app-20220209225013-0017",65,3.2,1170316,468126,false],["app-20220209225013-0017",37,2.95,1085,0,false],["app-20220209225013-0017",62,7.82,798734,72612,false],["app-20220209231631-0052",38,5.65,1801029,120068,false],["app-20220209231631-0052",35,3.33,189778,0,false],["app-20220209231631-0052",31,2.9,5980,0,false],["app-20220209231631-0052",34,3.33,446819,0,false],["app-20220209231631-0052",37,3.33,36237,0,false],["app-20220209231631-0052",40,3.0,252,0,false],["app-20220209231631-0052",36,6.91,3115193,0,false],["app-20220209231631-0052",39,3.9,166321,0,false],["app-20220209231631-0052",33,2.95,6007,0,false],["app-20220209231631-0052",32,2.95,1141,0,false],["app-20220209231405-0047",36,7.83,4572473,326605,false],["app-20220209231405-0047",33,2.95,6243,0,false],["app-20220209231405-0047",32,2.9,1228,0,false],["app-20220209231405-0047",37,2.73,697153,232384,false],["app-20220209231405-0047",35,3.33,104650,0,false],["app-20220209231405-0047",34,3.37,2621751,0,false],["app-20220209231405-0047",31,2.9,1222,0,false],["app-20220209231405-0047",38,3.0,263,0,false],["app-20220209230713-0035",37,3.33,612498,0,false],["app-20220209230713-0035",39,3.33,2094653,0,false],["app-20220209230713-0035",36,3.33,1183721,0,false],["app-20220209230713-0035",38,6.91,2438428,0,false],["app-20220209230713-0035",40,5.67,3484873,0,false],["app-20220209230713-0035",42,3.0,208,0,false],["app-20220209230713-0035",31,2.9,985,0,false],["app-20220209230713-0035",32,2.95,712,0,false],["app-20220209230713-0035",33,2.95,751,0,false],["app-20220209230713-0035",41,3.9,198374,0,false],["app-20220209230713-0035",35,2.9,5558,0,false],["app-20220209230713-0035",34,2.95,940,0,false],["app-20220209233914-0082",36,3.67,554466,0,false],["app-20220209233914-0082",35,3.37,639443,0,false],["app-20220209233914-0082",49,6.71,221029,0,false],["app-20220209233914-0082",32,2.9,984,0,false],["app-20220209233914-0082",33,2.95,5355,0,false],["app-20220209233914-0082",42,3.67,259529,0,false],["app-20220209233914-0082",47,4.3,338737,0,false],["app-20220209233914-0082",31,2.9,877,0,false],["app-20220209233914-0082",44,3.67,260596,0,false],["app-20220209233914-0082",38,3.67,304094,0,false],["app-20220209233914-0082",50,3.0,209,0,false],["app-20220209233914-0082",46,4.3,1144032,0,false],["app-20220209233914-0082",34,3.37,2719037,0,false],["app-20220209233914-0082",40,7.95,4305956,0,false],["app-20220209233914-0082",43,3.67,361819,0,false],["app-20220209233914-0082",45,7.95,6272814,0,false],["app-20220209233914-0082",37,3.37,794815,0,false],["app-20220209233914-0082",48,4.3,239942,0,false],["app-20220209233914-0082",41,4.3,1121560,0,false],["app-20220209233914-0082",39,3.67,286184,0,false],["app-20220209231846-0056",37,6.04,1027303,0,false],["app-20220209231846-0056",36,3.37,597405,0,false],["app-20220209231846-0056",32,3.37,66392,0,false],["app-20220209231846-0056",42,4.3,145711,0,false],["app-20220209231846-0056",39,3.37,741366,0,false],["app-20220209231846-0056",40,6.04,837113,0,false],["app-20220209231846-0056",35,3.37,225251,0,false],["app-20220209231846-0056",45,3.9,230593,0,false],["app-20220209231846-0056",34,6.04,2211184,0,false],["app-20220209231846-0056",31,2.95,1231,0,false],["app-20220209231846-0056",41,4.3,265559,0,false],["app-20220209231846-0056",38,3.37,1386627,0,false],["app-20220209231846-0056",46,3.0,207,0,false],["app-20220209231846-0056",33,3.37,791067,0,false],["app-20220209231846-0056",44,5.57,1142,0,false],["app-20220209231846-0056",43,4.3,257044,0,false],["app-20220209235552-0104",33,3.8,1144512,0,false],["app-20220209235552-0104",31,2.95,827,0,false],["app-20220209235552-0104",34,7.36,7191850,0,false],["app-20220209235552-0104",35,4.34,222,0,false],["app-20220209235552-0104",32,3.8,3138200,0,false],["app-20220209234857-0093",35,4.55,559900,0,false],["app-20220209234857-0093",31,2.95,688,0,false],["app-20220209234857-0093",33,3.66,2351347,0,false],["app-20220209234857-0093",34,4.3,587982,0,false],["app-20220209234857-0093",36,3.0,211,0,false],["app-20220209234857-0093",32,2.9,5313,0,false],["app-20220209230539-0032",32,2.95,1662,0,false],["app-20220209230539-0032",37,3.0,261,0,false],["app-20220209230539-0032",33,2.95,925,0,false],["app-20220209230539-0032",31,2.9,6484,0,false],["app-20220209230539-0032",34,2.95,827,0,false],["app-20220209230539-0032",36,3.9,1274279,0,false],["app-20220209230539-0032",35,3.72,2718003,0,false],["app-20220209233627-0078",36,2.8,0,0,true],["app-20220209233627-0078",35,4.34,894667,0,false],["app-20220209233627-0078",31,2.95,993,0,false],["app-20220209233627-0078",38,6.1,949455,0,false],["app-20220209233627-0078",34,3.53,2309865,0,false],["app-20220209233627-0078",37,4.3,825504,0,false],["app-20220209233627-0078",32,2.95,6073,0,false],["app-20220209233627-0078",33,2.95,980,0,false],["app-20220209224945-0016",36,3.37,7129,0,false],["app-20220209224945-0016",31,2.9,1090,0,false],["app-20220209224945-0016",33,2.9,881,0,false],["app-20220209224945-0016",32,2.95,1136,0,false],["app-20220209224945-0016",38,4.34,232,0,false],["app-20220209224945-0016",37,5.78,2074068,0,false],["app-20220209224945-0016",34,2.9,2314,0,false],["app-20220209224945-0016",35,3.61,2179116,0,false],["app-20220209231004-0040",33,2.95,1120,0,false],["app-20220209231004-0040",37,7.45,966664,0,false],["app-20220209231004-0040",39,2.71,0,0,true],["app-20220209231004-0040",32,2.95,816,0,false],["app-20220209231004-0040",31,2.95,1074,0,false],["app-20220209231004-0040",38,2.71,0,0,true],["app-20220209231004-0040",34,3.72,2379595,0,false],["app-20220209231004-0040",41,6.91,328149,0,false],["app-20220209231004-0040",36,3.33,32048,0,false],["app-20220209231004-0040",40,2.71,0,0,true],["app-20220209231004-0040",42,6.1,561089,0,false],["app-20220209231004-0040",35,4.01,782784,0,false],["app-20220209235239-0100",37,2.67,0,0,true],["app-20220209235239-0100",38,2.67,0,0,true],["app-20220209235239-0100",31,3.4,7753940,0,false],["app-20220209235239-0100",35,2.67,0,0,true],["app-20220209235239-0100",39,2.67,0,0,true],["app-20220209235239-0100",36,6.04,19985645,0,false],["app-20220209235239-0100",41,3.0,213,0,false],["app-20220209235239-0100",32,3.37,758001,0,false],["app-20220209235239-0100",34,2.67,0,0,true],["app-20220209235239-0100",40,3.9,715052,0,false],["app-20220209235239-0100",33,2.95,205,0,false],["app-20220209233659-0079",31,2.95,2253,0,false],["app-20220209233659-0079",35,2.9,718,0,false],["app-20220209233659-0079",45,3.0,279,0,false],["app-20220209233659-0079",40,3.33,1120562,0,false],["app-20220209233659-0079",43,7.86,2378952,0,false],["app-20220209233659-0079",34,2.95,852,0,false],["app-20220209233659-0079",44,3.9,590585,0,false],["app-20220209233659-0079",37,2.9,676,0,false],["app-20220209233659-0079",38,2.9,6062,0,false],["app-20220209233659-0079",39,3.33,2480746,0,false],["app-20220209233659-0079",32,2.95,754,0,false],["app-20220209233659-0079",41,5.61,17736664,0,false],["app-20220209233659-0079",33,2.9,723,0,false],["app-20220209233659-0079",42,3.37,1113495,0,false],["app-20220209233659-0079",36,2.9,1117,0,false],["app-20220209225644-0022",34,2.95,1232,0,false],["app-20220209225644-0022",41,3.0,279,0,false],["app-20220209225644-0022",33,2.9,2111,0,false],["app-20220209225644-0022",40,3.9,1087230,0,false],["app-20220209225644-0022",39,5.8,1847474,0,false],["app-20220209225644-0022",38,3.33,4900,0,false],["app-20220209225644-0022",31,2.95,1787,0,false],["app-20220209225644-0022",36,3.61,1480774,0,false],["app-20220209225644-0022",32,2.9,4927,0,false],["app-20220209225644-0022",37,6.18,2940295,0,false],["app-20220209225644-0022",35,3.37,215661,0,false],["app-20220209231740-0054",35,3.72,3840225,0,false],["app-20220209231740-0054",38,4.3,1026295,0,false],["app-20220209231740-0054",42,4.83,182464,0,false],["app-20220209231740-0054",43,7.26,549033,0,false],["app-20220209231740-0054",34,2.9,1083,0,false],["app-20220209231740-0054",36,4.3,545739,0,false],["app-20220209231740-0054",40,4.83,291281,0,false],["app-20220209231740-0054",31,2.9,780,0,false],["app-20220209231740-0054",44,3.0,298,0,false],["app-20220209231740-0054",32,2.9,998,0,false],["app-20220209231740-0054",37,3.72,1619438,0,false],["app-20220209231740-0054",41,4.34,201197,50299,false],["app-20220209231740-0054",33,2.9,6255,0,false],["app-20220209231740-0054",39,4.84,731839,0,false],["app-20220209224833-0014",33,3.33,255030,0,false],["app-20220209224833-0014",46,8.35,1530098,0,false],["app-20220209224833-0014",39,5.93,2135067,213506,false],["app-20220209224833-0014",44,3.56,426937,85387,false],["app-20220209224833-0014",36,3.33,635557,0,false],["app-20220209224833-0014",47,3.0,230,0,false],["app-20220209224833-0014",34,3.33,655896,0,false],["app-20220209224833-0014",35,5.93,1809231,180923,false],["app-20220209224833-0014",31,2.9,1222,0,false],["app-20220209224833-0014",41,5.93,1717389,171738,false],["app-20220209224833-0014",43,3.43,556978,139244,false],["app-20220209224833-0014",38,3.33,691175,0,false],["app-20220209224833-0014",32,2.9,1130,0,false],["app-20220209224833-0014",40,3.33,2320461,0,false],["app-20220209224833-0014",42,3.13,505475,168491,false],["app-20220209224833-0014",45,3.13,451848,150616,false],["app-20220209224833-0014",37,5.93,3921401,392140,false],["app-20220209234821-0092",35,2.9,1979,0,false],["app-20220209234821-0092",36,3.33,1926531,0,false],["app-20220209234821-0092",40,5.87,588764,0,false],["app-20220209234821-0092",41,3.9,197338,0,false],["app-20220209234821-0092",38,3.37,40706,0,false],["app-20220209234821-0092",39,5.81,3747933,0,false],["app-20220209234821-0092",31,2.95,1001,0,false],["app-20220209234821-0092",32,2.9,2434,0,false],["app-20220209234821-0092",37,3.37,1175209,0,false],["app-20220209234821-0092",34,2.9,1070,0,false],["app-20220209234821-0092",42,3.0,223,0,false],["app-20220209234821-0092",33,2.9,913,0,false],["app-20220209230826-0037",72,2.63,0,0,true],["app-20220209230826-0037",53,9.24,362626,0,false],["app-20220209230826-0037",69,2.63,0,0,true],["app-20220209230826-0037",40,4.3,203101,0,false],["app-20220209230826-0037",66,2.63,0,0,true],["app-20220209230826-0037",43,4.3,197091,0,false],["app-20220209230826-0037",60,2.63,0,0,true],["app-20220209230826-0037",74,6.1,80534,0,false],["app-20220209230826-0037",52,4.3,198469,0,false],["app-20220209230826-0037",45,6.45,643496,0,false],["app-20220209230826-0037",65,2.63,0,0,true],["app-20220209230826-0037",46,4.3,223109,0,false],["app-20220209230826-0037",41,3.61,116589,0,false],["app-20220209230826-0037",37,4.3,840541,0,false],["app-20220209230826-0037",51,6.45,3493278,0,false],["app-20220209230826-0037",62,2.63,0,0,true],["app-20220209230826-0037",68,2.63,0,0,true],["app-20220209230826-0037",71,2.63,0,0,true],["app-20220209230826-0037",47,3.61,272711,0,false],["app-20220209230826-0037",63,2.63,0,0,true],["app-20220209230826-0037",34,3.61,687256,0,false],["app-20220209230826-0037",31,2.9,1119,0,false],["app-20220209230826-0037",39,6.45,675946,0,false],["app-20220209230826-0037",36,6.45,1436474,0,false],["app-20220209230826-0037",73,8.96,125170,0,false],["app-20220209230826-0037",56,2.63,0,0,true],["app-20220209230826-0037",48,6.45,683716,0,false],["app-20220209230826-0037",57,2.63,0,0,true],["app-20220209230826-0037",67,2.63,0,0,true],["app-20220209230826-0037",61,2.63,0,0,true],["app-20220209230826-0037",35,3.33,46570,0,false],["app-20220209230826-0037",64,2.63,0,0,true],["app-20220209230826-0037",54,2.63,0,0,true],["app-20220209230826-0037",49,4.3,125628,0,false],["app-20220209230826-0037",33,2.9,1088,0,false],["app-20220209230826-0037",55,2.63,0,0,true],["app-20220209230826-0037",44,3.61,180299,0,false],["app-20220209230826-0037",38,3.61,1070835,0,false],["app-20220209230826-0037",58,2.63,0,0,true],["app-20220209230826-0037",59,2.63,0,0,true],["app-20220209230826-0037",32,2.9,1171,0,false],["app-20220209230826-0037",42,6.45,624473,0,false],["app-20220209230826-0037",70,2.63,0,0,true],["app-20220209230826-0037",50,3.61,326380,0,false],["app-20220209232008-0058",34,3.68,2867068,0,false],["app-20220209232008-0058",33,4.3,865584,0,false],["app-20220209232008-0058",32,3.68,1035427,0,false],["app-20220209232008-0058",40,3.0,437,0,false],["app-20220209232008-0058",36,4.84,2160465,0,false],["app-20220209232008-0058",39,4.5,1161360,0,false],["app-20220209232008-0058",38,7.76,1816580,0,false],["app-20220209232008-0058",35,4.3,1588280,0,false],["app-20220209232008-0058",37,4.84,782649,0,false],["app-20220209232008-0058",31,2.95,1089,0,false],["app-20220209235212-0099",33,3.61,522036,0,false],["app-20220209235212-0099",34,3.68,540303,0,false],["app-20220209235212-0099",31,2.95,6529,0,false],["app-20220209235212-0099",32,2.95,1404,0,false],["app-20220209235212-0099",35,5.46,1025034,85419,false],["app-20220209235212-0099",36,4.69,295,0,false],["app-20220209232605-0069",32,2.9,1119,0,false],["app-20220209232605-0069",33,2.95,1170,0,false],["app-20220209232605-0069",31,2.9,1161,0,false],["app-20220209232605-0069",38,3.0,458,0,false],["app-20220209232605-0069",37,3.9,644589,0,false],["app-20220209232605-0069",34,2.9,641,0,false],["app-20220209232605-0069",36,2.71,0,0,true],["app-20220209232605-0069",35,3.72,3569683,0,false],["app-20220209232111-0060",33,2.95,6016,0,false],["app-20220209232111-0060",31,2.95,734,0,false],["app-20220209232111-0060",37,3.0,236,0,false],["app-20220209232111-0060",34,3.72,2227526,0,false],["app-20220209232111-0060",36,4.3,643976,128795,false],["app-20220209232111-0060",35,4.3,999877,0,false],["app-20220209232111-0060",32,2.9,1131,0,false],["app-20220209224619-0010",35,3.72,2770017,0,false],["app-20220209224619-0010",37,3.0,274,0,false],["app-20220209224619-0010",32,2.9,5308,0,false],["app-20220209224619-0010",33,2.95,1088,0,false],["app-20220209224619-0010",36,3.9,1242297,0,false],["app-20220209224619-0010",31,2.95,1088,0,false],["app-20220209224619-0010",34,2.95,2094,0,false],["app-20220209231559-0051",34,2.45,0,0,true],["app-20220209231559-0051",33,3.54,999547,0,false],["app-20220209231559-0051",42,2.45,0,0,true],["app-20220209231559-0051",40,2.45,0,0,true],["app-20220209231559-0051",38,3.74,458556,91711,false],["app-20220209231559-0051",36,2.45,0,0,true],["app-20220209231559-0051",37,3.74,1535005,307001,false],["app-20220209231559-0051",44,4.74,485,0,false],["app-20220209231559-0051",31,3.54,4179191,0,false],["app-20220209231559-0051",45,3.0,258,0,false],["app-20220209231559-0051",43,2.45,0,0,true],["app-20220209231559-0051",39,2.45,0,0,true],["app-20220209231559-0051",41,5.03,342,0,false],["app-20220209231559-0051",32,2.9,2247,0,false],["app-20220209231559-0051",35,4.34,306,0,false],["app-20220209230348-0030",65,2.74,0,0,true],["app-20220209230348-0030",69,2.74,0,0,true],["app-20220209230348-0030",75,2.74,0,0,true],["app-20220209230348-0030",80,2.74,0,0,true],["app-20220209230348-0030",66,2.74,0,0,true],["app-20220209230348-0030",34,2.95,160,0,false],["app-20220209230348-0030",81,2.74,0,0,true],["app-20220209230348-0030",59,2.74,0,0,true],["app-20220209230348-0030",39,5.93,9488711,0,false],["app-20220209230348-0030",83,2.74,0,0,true],["app-20220209230348-0030",32,3.37,679259,0,false],["app-20220209230348-0030",70,6.45,965311,0,false],["app-20220209230348-0030",74,2.74,0,0,true],["app-20220209230348-0030",89,2.74,0,0,true],["app-20220209230348-0030",53,2.74,0,0,true],["app-20220209230348-0030",45,4.15,136445,0,false],["app-20220209230348-0030",52,2.74,0,0,true],["app-20220209230348-0030",78,4.3,171200,0,false],["app-20220209230348-0030",86,2.74,0,0,true],["app-20220209230348-0030",93,3.52,103993,25998,false],["app-20220209230348-0030",82,2.74,0,0,true],["app-20220209230348-0030",57,2.74,0,0,true],["app-20220209230348-0030",43,4.2,74861,0,false],["app-20220209230348-0030",54,4.3,178583,0,false],["app-20220209230348-0030",64,2.74,0,0,true],["app-20220209230348-0030",72,2.74,0,0,true],["app-20220209230348-0030",41,2.74,0,0,true],["app-20220209230348-0030",37,2.74,0,0,true],["app-20220209230348-0030",40,2.74,0,0,true],["app-20220209230348-0030",77,2.74,0,0,true],["app-20220209230348-0030",79,2.74,0,0,true],["app-20220209230348-0030",47,2.74,0,0,true],["app-20220209230348-0030",44,2.74,0,0,true],["app-20220209230348-0030",55,2.9,522,0,false],["app-20220209230348-0030",63,6.91,1233672,0,false],["app-20220209230348-0030",56,2.74,0,0,true],["app-20220209230348-0030",33,3.33,38096,0,false],["app-20220209230348-0030",73,2.74,0,0,true],["app-20220209230348-0030",88,2.74,0,0,true],["app-20220209230348-0030",42,2.74,0,0,true],["app-20220209230348-0030",71,2.74,0,0,true],["app-20220209230348-0030",84,2.74,0,0,true],["app-20220209230348-0030",76,2.74,0,0,true],["app-20220209230348-0030",35,2.9,1077,0,false],["app-20220209230348-0030",68,2.74,0,0,true],["app-20220209230348-0030",36,3.33,10660,0,false],["app-20220209230348-0030",92,2.74,0,0,true],["app-20220209230348-0030",48,2.74,0,0,true],["app-20220209230348-0030",49,6.45,518124,0,false],["app-20220209230348-0030",91,2.74,0,0,true],["app-20220209230348-0030",67,2.74,0,0,true]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"App ID","type":"\"string\"","metadata":"{}"},{"name":"Stage ID","type":"\"long\"","metadata":"{}"},{"name":"Average Speedup Factor","type":"\"double\"","metadata":"{}"},{"name":"Stage Task Duration","type":"\"long\"","metadata":"{}"},{"name":"Unsupported Task Duration","type":"\"long\"","metadata":"{}"},{"name":"Stage Estimated","type":"\"boolean\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
App IDStage IDAverage Speedup FactorStage Task DurationUnsupported Task DurationStage Estimated
app-20220209224509-0008312.9511840false
app-20220209224509-0008332.910860false
app-20220209224509-0008353.3723215230false
app-20220209224509-0008413.91726480false
app-20220209224509-0008395.7245868240false
app-20220209224509-0008383.366943370false
app-20220209224509-0008404.266568350false
app-20220209224509-0008373.365241900false
app-20220209224509-0008322.96410false
app-20220209224509-0008362.7370650false
app-20220209224509-0008423.02180false
app-20220209224509-0008342.910800false
app-20220209235114-0097392.7100true
app-20220209235114-0097403.544130false
app-20220209235114-0097342.959640false
app-20220209235114-0097372.7100true
app-20220209235114-0097413.03650false
app-20220209235114-0097312.9510580false
app-20220209235114-0097322.956940false
app-20220209235114-0097353.6821421470false
app-20220209235114-0097384.342710false
app-20220209235114-0097363.684578640false
app-20220209235114-0097332.959000false
app-20220209230506-0031353.33933940false
app-20220209230506-0031363.332398630false
app-20220209230506-0031386.9126961720false
app-20220209230506-0031373.3316844940false
app-20220209230506-0031403.92050180false
app-20220209230506-0031322.975300false
app-20220209230506-0031413.02100false
app-20220209230506-0031395.6721297750false
app-20220209230506-0031342.9511980false
app-20220209230506-0031312.9512840false
app-20220209230506-0031332.912580false
app-20220209232634-0070322.910460false
app-20220209232634-0070343.7222260560false
app-20220209232634-0070312.9566770false
app-20220209232634-0070332.956720false
app-20220209232634-0070373.02100false
app-20220209232634-0070354.36888940false
app-20220209232634-0070364.3566592113318false
app-20220209225845-0026363.03030false
app-20220209225845-0026322.956900false
app-20220209225845-0026312.9511810false
app-20220209225845-0026343.686217360false
app-20220209225845-0026332.98940false
app-20220209225845-0026353.911062600false
app-20220209235526-0103343.6823012050false
app-20220209235526-0103312.9510510false
app-20220209235526-0103332.958750false
app-20220209235526-0103322.956760false
app-20220209235526-0103364.696210false
app-20220209235526-0103352.600true
app-20220209231919-0057353.3366556240false
app-20220209231919-0057365.7892970720false
app-20220209231919-0057383.02280false
app-20220209231919-0057312.97110false
app-20220209231919-0057373.93548480false
app-20220209231919-0057343.331341430false
app-20220209231919-0057322.957240false
app-20220209231919-0057332.96950false
app-20220209231533-0050333.7124899600false
app-20220209231533-0050343.97656140false
app-20220209231533-0050353.02460false
app-20220209231533-0050322.9510240false
app-20220209231533-0050312.9510960false
application_1665146417445_000244.52330false
application_1665146417445_000234.3428932070false
application_1665146417445_000222.6145710217285510false
application_1665146417445_000212.05197202725986013false
application_1665146417445_000274.52440false
application_1665146417445_000263.9819181090false
application_1665146417445_000252.645408262270413false
application_1665146417445_000201.045054505false
app-20220209230053-0028403.7149793000false
app-20220209230053-0028423.945178980false
app-20220209230053-0028384.34530false
app-20220209230053-0028447.767306440false
app-20220209230053-0028543.02210false
app-20220209230053-0028353.3346187180false
app-20220209230053-0028363.33592060false
app-20220209230053-0028507.766611050false
app-20220209230053-0028433.33250520false
app-20220209230053-0028375.7386970221449502false
app-20220209230053-0028392.95770false
app-20220209230053-0028532.68456328182530false
app-20220209230053-0028453.33349000false
app-20220209230053-0028518.28137011102997113false
app-20220209230053-0028312.957010false
app-20220209230053-0028463.3723664040false
app-20220209230053-0028528.28173096493786482false
app-20220209230053-0028322.953510false
app-20220209230053-0028342.957640false
app-20220209230053-0028332.9511530false
app-20220209230053-0028483.33287290false
app-20220209230053-0028493.945098370false
app-20220209230053-0028413.33238240false
app-20220209230053-0028473.7150718110false
app-20220209230750-0036425.986004220false
app-20220209230750-0036343.617434620false
app-20220209230750-0036416.3321991524435false
app-20220209230750-0036322.9510260false
app-20220209230750-0036403.332169770false
app-20220209230750-0036333.33315650false
app-20220209230750-0036312.95223330false
app-20220209230750-0036384.017968700false
app-20220209230750-0036394.35799410false
app-20220209230750-0036356.4510953790false
app-20220209230750-0036376.4533909120false
app-20220209230750-0036433.03170false
app-20220209230750-0036363.617486340false
app-20220209224725-0012601.0600true
app-20220209224725-0012481.0600true
app-20220209224725-0012674.341160false
app-20220209224725-0012393.543210100false
app-20220209224725-0012574.343550false
app-20220209224725-0012474.344030false
app-20220209224725-0012701.0600true
app-20220209224725-0012534.343190false
app-20220209224725-0012383.544177450false
app-20220209224725-0012521.0600true
app-20220209224725-0012323.544590020false
app-20220209224725-0012741.0600true
app-20220209224725-0012614.343510false
app-20220209224725-0012762.953450false
app-20220209224725-0012443.547157300false
app-20220209224725-0012453.543016720false
app-20220209224725-0012333.542700460false
app-20220209224725-0012581.0600true
app-20220209224725-0012634.344930false
app-20220209224725-0012661.0600true
app-20220209224725-0012694.34600false
app-20220209224725-0012754.342380false
app-20220209224725-0012621.0600true
app-20220209224725-0012734.342290false
app-20220209224725-0012641.0600true
app-20220209224725-0012461.0600true
app-20220209224725-0012714.342300false
app-20220209224725-0012654.343910false
app-20220209224725-0012313.5422847660false
app-20220209224725-0012554.343590false
app-20220209224725-0012403.544448910false
app-20220209224725-0012501.0600true
app-20220209224725-0012541.0600true
app-20220209224725-0012363.545915570false
app-20220209224725-0012343.543127890false
app-20220209224725-0012494.343920false
app-20220209224725-0012423.544933570false
app-20220209224725-0012721.0600true
app-20220209224725-0012373.544355680false
app-20220209224725-0012514.344070false
app-20220209224725-0012681.0600true
app-20220209224725-0012594.344080false
app-20220209224725-0012561.0600true
app-20220209224725-0012413.543187520false
app-20220209224725-0012353.544154930false
app-20220209224725-0012433.542770690false
app-20220209233831-0081443.944176610false
app-20220209233831-0081434.34419310false
app-20220209233831-0081473.03150false
app-20220209233831-0081403.3321960100false
app-20220209233831-0081333.332546520false
app-20220209233831-0081454.34877010false
app-20220209233831-0081322.97340false
app-20220209233831-0081343.335802290false
app-20220209233831-0081312.97200false
app-20220209233831-0081396.0420476170false
app-20220209233831-0081383.336080340false
app-20220209233831-0081424.014392840false
app-20220209233831-0081468.3515602600false
app-20220209233831-0081416.0416303410false
app-20220209233831-0081356.0418072280false
app-20220209233831-0081376.0436592310false
app-20220209233831-0081363.335602920false
app-20220209231114-0042312.959220false
app-20220209231114-0042364.555115280false
app-20220209231114-0042373.02100false
app-20220209231114-0042354.36099160false
app-20220209231114-0042332.958040false
app-20220209231114-0042343.6825133130false
app-20220209231114-0042322.9510570false
app-20220209235046-0096373.02590false
app-20220209235046-0096354.39650750false
app-20220209235046-0096322.964050false
app-20220209235046-0096332.9511820false
app-20220209235046-0096343.7224070800false
app-20220209235046-0096364.3648825129765false
app-20220209235046-0096312.99140false
app-20220209231505-0049322.9555160false
app-20220209231505-0049343.96414270false
app-20220209231505-0049353.02480false
app-20220209231505-0049312.959760false
app-20220209231505-0049333.7120785920false
app-20220209225818-0025332.9560130false
app-20220209225818-0025363.05440false
app-20220209225818-0025312.913610false
app-20220209225818-0025322.912400false
app-20220209225818-0025353.6210159640false
app-20220209225818-0025343.72478040false
app-20220209225607-0021383.333876720false
app-20220209225607-0021342.961570false
app-20220209225607-0021353.3313781140false
app-20220209225607-0021376.9132720730false
app-20220209225607-0021312.957140false
app-20220209225607-0021403.92018930false
app-20220209225607-0021395.6719469560false
app-20220209225607-0021332.912140false
app-20220209225607-0021363.336225160false
app-20220209225607-0021322.957000false
app-20220209225607-0021413.02690false
app-20220209225749-0024322.960360false
app-20220209225749-0024333.713593830false
app-20220209225749-0024312.9513150false
app-20220209225749-0024354.557154820false
app-20220209225749-0024344.39582270false
app-20220209225749-0024363.05310false
app-20220209231439-0048313.5481090false
app-20220209231439-0048363.9659090false
app-20220209231439-0048373.06830false
app-20220209231439-0048322.600true
app-20220209231439-0048333.82834220false
app-20220209231439-0048352.600true
app-20220209231439-0048343.6334410false
app-20220209232045-0059312.9510170false
app-20220209232045-0059322.9553910false
app-20220209232045-0059353.02690false
app-20220209232045-0059333.7119860940false
app-20220209232045-0059343.96903190false
app-20220209224648-0011322.912410false
app-20220209224648-0011403.6711557310false
app-20220209224648-0011312.9510050false
app-20220209224648-0011373.9411801070false
app-20220209224648-0011416.453569150false
app-20220209224648-0011333.372173260false
app-20220209224648-0011433.01990false
app-20220209224648-0011423.91398460false
app-20220209224648-0011363.33371910false
app-20220209224648-0011387.864492200false
app-20220209224648-0011394.31101540false
app-20220209224648-0011343.33393480false
app-20220209224648-0011356.4530050410false
app-20220209224756-0013386.275393922567780false
app-20220209224756-0013403.02470false
app-20220209224756-0013363.751544890false
app-20220209224756-0013343.7514067000false
app-20220209224756-0013312.925480false
app-20220209224756-0013322.958520false
app-20220209224756-0013353.33652570false
app-20220209224756-0013332.95221230false
app-20220209224756-0013393.95495880false
app-20220209224756-0013373.751500720false
app-20220209235141-0098394.343144080false
app-20220209235141-0098422.7800true
app-20220209235141-0098342.911040false
app-20220209235141-0098373.331238450false
app-20220209235141-0098385.7824292500false
app-20220209235141-0098312.9512420false
app-20220209235141-0098434.31452100false
app-20220209235141-0098363.67547390false
app-20220209235141-0098402.7800true
app-20220209235141-0098322.95206110false
app-20220209235141-0098332.959570false
app-20220209235141-0098412.7800true
app-20220209235141-0098446.1126460false
app-20220209235141-0098352.921860false
app-20220209231256-0045322.98380false
app-20220209231256-0045332.962170false
app-20220209231256-0045412.6400true
app-20220209231256-0045353.72339550false
app-20220209231256-0045422.6400true
app-20220209231256-0045373.72331540false
app-20220209231256-0045312.957000false
app-20220209231256-0045446.915061400false
app-20220209231256-0045363.943931700false
app-20220209231256-0045342.959450false
app-20220209231256-0045402.6400true
app-20220209231256-0045432.6400true
app-20220209231256-0045383.9417448130false
app-20220209231256-0045456.110505730false
app-20220209231256-0045397.4510237210false
app-20220209224316-0007484.34877560false
app-20220209224316-0007343.332793850false
app-20220209224316-0007363.338056800false
app-20220209224316-0007383.3311277860false
app-20220209224316-0007473.944310550false
app-20220209224316-0007456.04133492860false
app-20220209224316-0007356.04195730460false
app-20220209224316-0007312.911860false
app-20220209224316-0007416.0498503010false
app-20220209224316-0007533.02410false
app-20220209224316-0007396.04184024460false
app-20220209224316-0007423.333934560false
app-20220209224316-0007504.35126400false
app-20220209224316-0007443.3324787970false
app-20220209224316-0007436.0450181140false
app-20220209224316-0007403.337332100false
app-20220209224316-0007514.35153690false
app-20220209224316-0007463.947709470false
app-20220209224316-0007322.97070false
app-20220209224316-0007528.3527475850false
app-20220209224316-0007333.3318303060false
app-20220209224316-0007376.0454483780false
app-20220209224316-0007494.015670230false
app-20220209234754-0091313.3727924030false
app-20220209234754-0091363.7551080false
app-20220209234754-0091384.22173270false
app-20220209234754-0091342.955200false
app-20220209234754-0091352.95122400false
app-20220209234754-0091392.7800true
app-20220209234754-0091372.7800true
app-20220209234754-0091332.98600false
app-20220209234754-0091403.757349010false
app-20220209234754-0091413.03460false
app-20220209234754-0091322.93550false
app-20220209232242-0063322.95225110false
app-20220209232242-0063353.724740530false
app-20220209232242-0063373.721781660false
app-20220209232242-0063393.92771810false
app-20220209232242-0063384.3424185700false
app-20220209232242-0063403.02790false
app-20220209232242-0063312.957600false
app-20220209232242-0063363.723481490false
app-20220209232242-0063343.4843010false
app-20220209232242-0063332.9554960false
app-20220209232500-0067363.728504790false
app-20220209232500-0067353.729347630false
app-20220209232500-0067373.72632710false
app-20220209232500-0067403.02430false
app-20220209232500-0067312.9510000false
app-20220209232500-0067343.4838410false
app-20220209232500-0067332.9558170false
app-20220209232500-0067322.95230020false
app-20220209232500-0067384.3417064370false
app-20220209232500-0067393.92458230false
app-20220209234532-0087312.9513780false
app-20220209234532-0087447.852042645127665false
app-20220209234532-0087413.3311542730false
app-20220209234532-0087423.377613690false
app-20220209234532-0087473.91671440false
app-20220209234532-0087342.97300false
app-20220209234532-0087403.378530200false
app-20220209234532-0087332.99140false
app-20220209234532-0087383.33898630false
app-20220209234532-0087437.851710173106885false
app-20220209234532-0087483.02200false
app-20220209234532-0087457.853459742216233false
app-20220209234532-0087393.334942660false
app-20220209234532-0087462.94652694217563false
app-20220209234532-0087352.910360false
app-20220209234532-0087322.9513830false
app-20220209234532-0087362.9556700false
app-20220209234532-0087373.3712336060false
app-20220209232841-0073353.613266643272220false
app-20220209232841-0073342.911040false
app-20220209232841-0073373.18831509277168false
app-20220209232841-0073363.6192751177292false
app-20220209232841-0073312.959840false
app-20220209232841-0073322.958820false
app-20220209232841-0073332.97090false
app-20220209232841-0073393.02640false
app-20220209232841-0073383.92577770false
app-20220209234412-0085387.8546604600false
app-20220209234412-0085373.375005400false
app-20220209234412-0085423.02730false
app-20220209234412-0085397.8511637820false
app-20220209234412-0085417.7967667500false
app-20220209234412-0085362.7330658040false
app-20220209234412-0085407.8553262780false
app-20220209234412-0085323.3312066080false
app-20220209234412-0085312.911280false
app-20220209234412-0085353.374803420false
app-20220209234412-0085333.3710443340false
app-20220209234412-0085343.335376120false
app-20220209224220-0005364.2894360false
app-20220209224220-0005312.97360false
app-20220209224220-0005442.800true
app-20220209224220-0005412.800true
app-20220209224220-0005382.800true
app-20220209224220-0005372.800true
app-20220209224220-0005432.800true
app-20220209224220-0005343.445209140false
app-20220209224220-0005322.956920false
app-20220209224220-0005332.958980false
app-20220209224220-0005452.800true
app-20220209224220-0005464.84127300false
app-20220209224220-0005396.88739270false
app-20220209224220-0005352.800true
app-20220209224220-0005426.43247130false
app-20220209224220-0005402.800true
app-20220209232531-0068443.03530false
app-20220209232531-0068373.33325220false
app-20220209232531-0068425.877165050false
app-20220209232531-0068312.958170false
app-20220209232531-0068352.959850false
app-20220209232531-0068385.8723464530false
app-20220209232531-0068322.9511010false
app-20220209232531-0068363.679888490false
app-20220209232531-0068433.541250false
app-20220209232531-0068394.34770false
app-20220209232531-0068342.95227370false
app-20220209232531-0068332.9559810false
app-20220209232531-0068412.8200true
app-20220209232531-0068403.692599350false
app-20220209234611-0088413.33427820false
app-20220209234611-0088403.33490310false
app-20220209234611-0088443.02890false
app-20220209234611-0088323.33453140false
app-20220209234611-0088353.6114163680false
app-20220209234611-0088366.4510799080false
app-20220209234611-0088384.39596530false
app-20220209234611-0088346.4537845690false
app-20220209234611-0088374.015528720false
app-20220209234611-0088333.618133720false
app-20220209234611-0088436.714791270false
app-20220209234611-0088426.915849290false
app-20220209234611-0088396.3322460024955false
app-20220209234611-0088312.957120false
app-20220209233802-0080332.959070false
app-20220209233802-0080392.7100true
app-20220209233802-0080364.017095160false
app-20220209233802-0080382.7100true
app-20220209233802-0080322.9511540false
app-20220209233802-0080416.911764060false
app-20220209233802-0080343.332658480false
app-20220209233802-0080426.1860510false
app-20220209233802-0080402.7100true
app-20220209233802-0080353.7214227750false
app-20220209233802-0080312.957120false
app-20220209233802-0080377.454229320false
app-20220209232701-0071672.7500true
app-20220209232701-0071392.99690false
app-20220209232701-0071816.911652360false
app-20220209232701-0071792.7500true
app-20220209232701-0071802.7500true
app-20220209232701-0071732.7500true
app-20220209232701-0071413.378076940false
app-20220209232701-0071742.7500true
app-20220209232701-0071322.97210false
app-20220209232701-0071506.9119407800false
app-20220209232701-0071362.923020false
app-20220209232701-0071352.97530false
app-20220209232701-0071682.7500true
app-20220209232701-0071423.3746291500false
app-20220209232701-0071642.7500true
app-20220209232701-0071607.452068570false
app-20220209232701-0071662.7500true
app-20220209232701-0071612.7500true
app-20220209232701-0071403.3315200030false
app-20220209232701-0071495.6312586400false
app-20220209232701-0071702.7500true
app-20220209232701-0071632.7500true
app-20220209232701-0071342.911350false
app-20220209232701-0071546.9120019580false
app-20220209232701-0071762.7500true
app-20220209232701-0071585.785923640false
app-20220209232701-0071372.99450false
app-20220209232701-0071382.99030false
app-20220209232701-0071456.9122528400false
app-20220209232701-0071555.141223245174748false
app-20220209232701-0071473.33494190false
app-20220209232701-0071332.911480false
app-20220209232701-0071446.257791216973902false
app-20220209232701-0071782.7500true
app-20220209232701-0071692.7500true
app-20220209232701-0071576.9111722280false
app-20220209232701-0071533.3313031380false
app-20220209232701-0071712.7500true
app-20220209232701-0071524.31371150false
app-20220209232701-0071652.7500true
app-20220209232701-0071772.7500true
app-20220209232701-0071483.33506530false
app-20220209232701-0071312.9559120false
app-20220209232701-0071594.31757670false
app-20220209232701-0071622.7500true
app-20220209232701-0071752.7500true
app-20220209232701-0071465.141258887179840false
app-20220209232701-0071826.14360970false
app-20220209232701-0071515.7810589760false
app-20220209232701-0071565.6310805100false
app-20220209232701-0071433.377247960false
app-20220209232701-0071722.7500true
app-20220209225233-0018412.9515070false
app-20220209225233-0018532.600true
app-20220209225233-0018463.678977230false
app-20220209225233-0018473.6711648290false
app-20220209225233-0018522.600true
app-20220209225233-0018619.0732621430false
app-20220209225233-0018432.61358679false
app-20220209225233-0018332.953190false
app-20220209225233-0018503.3311110false
app-20220209225233-0018342.958590false
app-20220209225233-0018572.600true
app-20220209225233-0018583.678222950false
app-20220209225233-0018372.952050false
app-20220209225233-0018489.0762618190false
app-20220209225233-0018494.243578760false
app-20220209225233-0018563.33511560false
app-20220209225233-0018312.9513130false
app-20220209225233-0018657.8275764768877false
app-20220209225233-0018382.9513550false
app-20220209225233-0018402.959260false
app-20220209225233-0018442.952250false
app-20220209225233-0018352.957320false
app-20220209225233-0018392.9510710false
app-20220209225233-0018423.295083750462159false
app-20220209225233-0018552.600true
app-20220209225233-0018603.6711687060false
app-20220209225233-0018542.600true
app-20220209225233-0018624.24901280false
app-20220209225233-0018519.423968480false
app-20220209225233-0018665.13378755116540false
app-20220209225233-0018633.33313360false
app-20220209225233-0018673.02230false
app-20220209225233-0018453.6736083650false
app-20220209225233-0018647.8256960751782false
app-20220209225233-0018362.954060false
app-20220209225233-0018593.6721366460false
app-20220209225233-0018322.957250false
app-20220209235705-0106353.7234918370false
app-20220209235705-0106342.959440false
app-20220209235705-0106373.910626260false
app-20220209235705-0106332.910510false
app-20220209235705-0106383.02650false
app-20220209235705-0106322.97270false
app-20220209235705-0106362.7100true
app-20220209235705-0106312.98250false
app-20220209231707-0053312.9511230false
app-20220209231707-0053322.958490false
app-20220209231707-0053403.02440false
app-20220209231707-0053363.332586980false
app-20220209231707-0053376.2124438970false
app-20220209231707-0053332.9511170false
app-20220209231707-0053396.714652970false
app-20220209231707-0053343.6917690100false
app-20220209231707-0053353.33492960false
app-20220209231707-0053386.9111735110false
app-20220209232803-0072374.1115810510false
app-20220209232803-0072386.428036150false
app-20220209232803-0072343.6820089360false
app-20220209232803-0072322.965980false
app-20220209232803-0072332.9511100false
app-20220209232803-0072393.02220false
app-20220209232803-0072364.320255550false
app-20220209232803-0072312.99700false
app-20220209232803-0072353.6837360140false
app-20220209234649-0089363.92032310false
app-20220209234649-0089373.02040false
app-20220209234649-0089322.9513050false
app-20220209234649-0089356.4516356410false
app-20220209234649-0089333.3754828680false
app-20220209234649-0089343.62159090false
app-20220209234649-0089312.9553310false
app-20220209224147-0004383.33576150false
app-20220209224147-0004375.5959530954119false
app-20220209224147-0004333.6811413110false
app-20220209224147-0004364.0116310760false
app-20220209224147-0004396.713790290false
app-20220209224147-0004343.6826254370false
app-20220209224147-0004354.311666720false
app-20220209224147-0004322.959690false
app-20220209224147-0004403.02180false
app-20220209224147-0004312.959140false
app-20220209234000-0083333.6459956730false
app-20220209234000-0083322.959850false
app-20220209234000-0083363.02290false
app-20220209234000-0083353.92617840false
app-20220209234000-0083342.6700true
app-20220209234000-0083312.911600false
app-20220209231143-0043333.3738443780false
app-20220209231143-0043356.4517013050false
app-20220209231143-0043373.02000false
app-20220209231143-0043322.9511820false
app-20220209231143-0043363.91785860false
app-20220209231143-0043343.62233630false
app-20220209231143-0043312.9553840false
app-20220209232314-0064443.03180false
app-20220209232314-0064424.832749870false
app-20220209232314-0064353.7211503280false
app-20220209232314-0064437.267107850false
app-20220209232314-0064312.99510false
app-20220209232314-0064384.311787820false
app-20220209232314-0064394.847566710false
app-20220209232314-0064332.96850false
app-20220209232314-0064373.7232110860false
app-20220209232314-0064342.911100false
app-20220209232314-0064322.956990false
app-20220209232314-0064364.34821520false
app-20220209232314-0064414.833357370false
app-20220209232314-0064404.3426513266283false
app-20220209224544-0009526.458251310false
app-20220209224544-0009392.4300true
app-20220209224544-0009496.9121928390false
app-20220209224544-0009324.5620false
app-20220209224544-0009364.53120false
app-20220209224544-0009543.01920false
app-20220209224544-0009372.4300true
app-20220209224544-0009533.621566650false
app-20220209224544-0009444.3468420false
app-20220209224544-0009463.33221040false
app-20220209224544-0009404.545860false
app-20220209224544-0009506.1816904870false
app-20220209224544-0009432.4300true
app-20220209224544-0009412.4300true
app-20220209224544-0009452.953170false
app-20220209224544-0009333.6277440false
app-20220209224544-0009384.510730false
app-20220209224544-0009424.579350false
app-20220209224544-0009513.395183863false
app-20220209224544-0009483.332682300false
app-20220209224544-0009352.4300true
app-20220209224544-0009473.331128810false
app-20220209224544-0009344.3410314460false
app-20220209224544-0009313.5414450false
app-20220209233444-0075332.9510740false
app-20220209233444-0075386.917780020false
app-20220209233444-0075376.2122719610false
app-20220209233444-0075312.9511070false
app-20220209233444-0075403.02730false
app-20220209233444-0075363.332314710false
app-20220209233444-0075396.715783510false
app-20220209233444-0075322.9512620false
app-20220209233444-0075343.6912045460false
app-20220209233444-0075353.33413760false
app-20220209225013-0017469.0761444990false
app-20220209225013-0017563.6713871900false
app-20220209225013-0017492.7300true
app-20220209225013-0017663.92160380false
app-20220209225013-0017489.422560020false
app-20220209225013-0017443.6715508000false
app-20220209225013-0017342.9510810false
app-20220209225013-0017553.33643000false
app-20220209225013-0017362.953430false
app-20220209225013-0017613.331375430false
app-20220209225013-0017403.295068417460765false
app-20220209225013-0017453.677299890false
app-20220209225013-0017423.3335130false
app-20220209225013-0017647.8262739757036false
app-20220209225013-0017392.959410false
app-20220209225013-0017599.0730884470false
app-20220209225013-0017573.676800220false
app-20220209225013-0017543.331223880false
app-20220209225013-0017512.7300true
app-20220209225013-0017502.7300true
app-20220209225013-0017532.7300true
app-20220209225013-0017312.961930false
app-20220209225013-0017412.61933966false
app-20220209225013-0017474.242923330false
app-20220209225013-0017322.9512130false
app-20220209225013-0017604.241134950false
app-20220209225013-0017382.957230false
app-20220209225013-0017673.02600false
app-20220209225013-0017522.7300true
app-20220209225013-0017583.6720986970false
app-20220209225013-0017433.6735697690false
app-20220209225013-0017352.957700false
app-20220209225013-0017332.9512800false
app-20220209225013-0017637.8260028954571false
app-20220209225013-0017653.21170316468126false
app-20220209225013-0017372.9510850false
app-20220209225013-0017627.8279873472612false
app-20220209231631-0052385.651801029120068false
app-20220209231631-0052353.331897780false
app-20220209231631-0052312.959800false
app-20220209231631-0052343.334468190false
app-20220209231631-0052373.33362370false
app-20220209231631-0052403.02520false
app-20220209231631-0052366.9131151930false
app-20220209231631-0052393.91663210false
app-20220209231631-0052332.9560070false
app-20220209231631-0052322.9511410false
app-20220209231405-0047367.834572473326605false
app-20220209231405-0047332.9562430false
app-20220209231405-0047322.912280false
app-20220209231405-0047372.73697153232384false
app-20220209231405-0047353.331046500false
app-20220209231405-0047343.3726217510false
app-20220209231405-0047312.912220false
app-20220209231405-0047383.02630false
app-20220209230713-0035373.336124980false
app-20220209230713-0035393.3320946530false
app-20220209230713-0035363.3311837210false
app-20220209230713-0035386.9124384280false
app-20220209230713-0035405.6734848730false
app-20220209230713-0035423.02080false
app-20220209230713-0035312.99850false
app-20220209230713-0035322.957120false
app-20220209230713-0035332.957510false
app-20220209230713-0035413.91983740false
app-20220209230713-0035352.955580false
app-20220209230713-0035342.959400false
app-20220209233914-0082363.675544660false
app-20220209233914-0082353.376394430false
app-20220209233914-0082496.712210290false
app-20220209233914-0082322.99840false
app-20220209233914-0082332.9553550false
app-20220209233914-0082423.672595290false
app-20220209233914-0082474.33387370false
app-20220209233914-0082312.98770false
app-20220209233914-0082443.672605960false
app-20220209233914-0082383.673040940false
app-20220209233914-0082503.02090false
app-20220209233914-0082464.311440320false
app-20220209233914-0082343.3727190370false
app-20220209233914-0082407.9543059560false
app-20220209233914-0082433.673618190false
app-20220209233914-0082457.9562728140false
app-20220209233914-0082373.377948150false
app-20220209233914-0082484.32399420false
app-20220209233914-0082414.311215600false
app-20220209233914-0082393.672861840false
app-20220209231846-0056376.0410273030false
app-20220209231846-0056363.375974050false
app-20220209231846-0056323.37663920false
app-20220209231846-0056424.31457110false
app-20220209231846-0056393.377413660false
app-20220209231846-0056406.048371130false
app-20220209231846-0056353.372252510false
app-20220209231846-0056453.92305930false
app-20220209231846-0056346.0422111840false
app-20220209231846-0056312.9512310false
app-20220209231846-0056414.32655590false
app-20220209231846-0056383.3713866270false
app-20220209231846-0056463.02070false
app-20220209231846-0056333.377910670false
app-20220209231846-0056445.5711420false
app-20220209231846-0056434.32570440false
app-20220209235552-0104333.811445120false
app-20220209235552-0104312.958270false
app-20220209235552-0104347.3671918500false
app-20220209235552-0104354.342220false
app-20220209235552-0104323.831382000false
app-20220209234857-0093354.555599000false
app-20220209234857-0093312.956880false
app-20220209234857-0093333.6623513470false
app-20220209234857-0093344.35879820false
app-20220209234857-0093363.02110false
app-20220209234857-0093322.953130false
app-20220209230539-0032322.9516620false
app-20220209230539-0032373.02610false
app-20220209230539-0032332.959250false
app-20220209230539-0032312.964840false
app-20220209230539-0032342.958270false
app-20220209230539-0032363.912742790false
app-20220209230539-0032353.7227180030false
app-20220209233627-0078362.800true
app-20220209233627-0078354.348946670false
app-20220209233627-0078312.959930false
app-20220209233627-0078386.19494550false
app-20220209233627-0078343.5323098650false
app-20220209233627-0078374.38255040false
app-20220209233627-0078322.9560730false
app-20220209233627-0078332.959800false
app-20220209224945-0016363.3771290false
app-20220209224945-0016312.910900false
app-20220209224945-0016332.98810false
app-20220209224945-0016322.9511360false
app-20220209224945-0016384.342320false
app-20220209224945-0016375.7820740680false
app-20220209224945-0016342.923140false
app-20220209224945-0016353.6121791160false
app-20220209231004-0040332.9511200false
app-20220209231004-0040377.459666640false
app-20220209231004-0040392.7100true
app-20220209231004-0040322.958160false
app-20220209231004-0040312.9510740false
app-20220209231004-0040382.7100true
app-20220209231004-0040343.7223795950false
app-20220209231004-0040416.913281490false
app-20220209231004-0040363.33320480false
app-20220209231004-0040402.7100true
app-20220209231004-0040426.15610890false
app-20220209231004-0040354.017827840false
app-20220209235239-0100372.6700true
app-20220209235239-0100382.6700true
app-20220209235239-0100313.477539400false
app-20220209235239-0100352.6700true
app-20220209235239-0100392.6700true
app-20220209235239-0100366.04199856450false
app-20220209235239-0100413.02130false
app-20220209235239-0100323.377580010false
app-20220209235239-0100342.6700true
app-20220209235239-0100403.97150520false
app-20220209235239-0100332.952050false
app-20220209233659-0079312.9522530false
app-20220209233659-0079352.97180false
app-20220209233659-0079453.02790false
app-20220209233659-0079403.3311205620false
app-20220209233659-0079437.8623789520false
app-20220209233659-0079342.958520false
app-20220209233659-0079443.95905850false
app-20220209233659-0079372.96760false
app-20220209233659-0079382.960620false
app-20220209233659-0079393.3324807460false
app-20220209233659-0079322.957540false
app-20220209233659-0079415.61177366640false
app-20220209233659-0079332.97230false
app-20220209233659-0079423.3711134950false
app-20220209233659-0079362.911170false
app-20220209225644-0022342.9512320false
app-20220209225644-0022413.02790false
app-20220209225644-0022332.921110false
app-20220209225644-0022403.910872300false
app-20220209225644-0022395.818474740false
app-20220209225644-0022383.3349000false
app-20220209225644-0022312.9517870false
app-20220209225644-0022363.6114807740false
app-20220209225644-0022322.949270false
app-20220209225644-0022376.1829402950false
app-20220209225644-0022353.372156610false
app-20220209231740-0054353.7238402250false
app-20220209231740-0054384.310262950false
app-20220209231740-0054424.831824640false
app-20220209231740-0054437.265490330false
app-20220209231740-0054342.910830false
app-20220209231740-0054364.35457390false
app-20220209231740-0054404.832912810false
app-20220209231740-0054312.97800false
app-20220209231740-0054443.02980false
app-20220209231740-0054322.99980false
app-20220209231740-0054373.7216194380false
app-20220209231740-0054414.3420119750299false
app-20220209231740-0054332.962550false
app-20220209231740-0054394.847318390false
app-20220209224833-0014333.332550300false
app-20220209224833-0014468.3515300980false
app-20220209224833-0014395.932135067213506false
app-20220209224833-0014443.5642693785387false
app-20220209224833-0014363.336355570false
app-20220209224833-0014473.02300false
app-20220209224833-0014343.336558960false
app-20220209224833-0014355.931809231180923false
app-20220209224833-0014312.912220false
app-20220209224833-0014415.931717389171738false
app-20220209224833-0014433.43556978139244false
app-20220209224833-0014383.336911750false
app-20220209224833-0014322.911300false
app-20220209224833-0014403.3323204610false
app-20220209224833-0014423.13505475168491false
app-20220209224833-0014453.13451848150616false
app-20220209224833-0014375.933921401392140false
app-20220209234821-0092352.919790false
app-20220209234821-0092363.3319265310false
app-20220209234821-0092405.875887640false
app-20220209234821-0092413.91973380false
app-20220209234821-0092383.37407060false
app-20220209234821-0092395.8137479330false
app-20220209234821-0092312.9510010false
app-20220209234821-0092322.924340false
app-20220209234821-0092373.3711752090false
app-20220209234821-0092342.910700false
app-20220209234821-0092423.02230false
app-20220209234821-0092332.99130false
app-20220209230826-0037722.6300true
app-20220209230826-0037539.243626260false
app-20220209230826-0037692.6300true
app-20220209230826-0037404.32031010false
app-20220209230826-0037662.6300true
app-20220209230826-0037434.31970910false
app-20220209230826-0037602.6300true
app-20220209230826-0037746.1805340false
app-20220209230826-0037524.31984690false
app-20220209230826-0037456.456434960false
app-20220209230826-0037652.6300true
app-20220209230826-0037464.32231090false
app-20220209230826-0037413.611165890false
app-20220209230826-0037374.38405410false
app-20220209230826-0037516.4534932780false
app-20220209230826-0037622.6300true
app-20220209230826-0037682.6300true
app-20220209230826-0037712.6300true
app-20220209230826-0037473.612727110false
app-20220209230826-0037632.6300true
app-20220209230826-0037343.616872560false
app-20220209230826-0037312.911190false
app-20220209230826-0037396.456759460false
app-20220209230826-0037366.4514364740false
app-20220209230826-0037738.961251700false
app-20220209230826-0037562.6300true
app-20220209230826-0037486.456837160false
app-20220209230826-0037572.6300true
app-20220209230826-0037672.6300true
app-20220209230826-0037612.6300true
app-20220209230826-0037353.33465700false
app-20220209230826-0037642.6300true
app-20220209230826-0037542.6300true
app-20220209230826-0037494.31256280false
app-20220209230826-0037332.910880false
app-20220209230826-0037552.6300true
app-20220209230826-0037443.611802990false
app-20220209230826-0037383.6110708350false
app-20220209230826-0037582.6300true
app-20220209230826-0037592.6300true
app-20220209230826-0037322.911710false
app-20220209230826-0037426.456244730false
app-20220209230826-0037702.6300true
app-20220209230826-0037503.613263800false
app-20220209232008-0058343.6828670680false
app-20220209232008-0058334.38655840false
app-20220209232008-0058323.6810354270false
app-20220209232008-0058403.04370false
app-20220209232008-0058364.8421604650false
app-20220209232008-0058394.511613600false
app-20220209232008-0058387.7618165800false
app-20220209232008-0058354.315882800false
app-20220209232008-0058374.847826490false
app-20220209232008-0058312.9510890false
app-20220209235212-0099333.615220360false
app-20220209235212-0099343.685403030false
app-20220209235212-0099312.9565290false
app-20220209235212-0099322.9514040false
app-20220209235212-0099355.46102503485419false
app-20220209235212-0099364.692950false
app-20220209232605-0069322.911190false
app-20220209232605-0069332.9511700false
app-20220209232605-0069312.911610false
app-20220209232605-0069383.04580false
app-20220209232605-0069373.96445890false
app-20220209232605-0069342.96410false
app-20220209232605-0069362.7100true
app-20220209232605-0069353.7235696830false
app-20220209232111-0060332.9560160false
app-20220209232111-0060312.957340false
app-20220209232111-0060373.02360false
app-20220209232111-0060343.7222275260false
app-20220209232111-0060364.3643976128795false
app-20220209232111-0060354.39998770false
app-20220209232111-0060322.911310false
app-20220209224619-0010353.7227700170false
app-20220209224619-0010373.02740false
app-20220209224619-0010322.953080false
app-20220209224619-0010332.9510880false
app-20220209224619-0010363.912422970false
app-20220209224619-0010312.9510880false
app-20220209224619-0010342.9520940false
app-20220209231559-0051342.4500true
app-20220209231559-0051333.549995470false
app-20220209231559-0051422.4500true
app-20220209231559-0051402.4500true
app-20220209231559-0051383.7445855691711false
app-20220209231559-0051362.4500true
app-20220209231559-0051373.741535005307001false
app-20220209231559-0051444.744850false
app-20220209231559-0051313.5441791910false
app-20220209231559-0051453.02580false
app-20220209231559-0051432.4500true
app-20220209231559-0051392.4500true
app-20220209231559-0051415.033420false
app-20220209231559-0051322.922470false
app-20220209231559-0051354.343060false
app-20220209230348-0030652.7400true
app-20220209230348-0030692.7400true
app-20220209230348-0030752.7400true
app-20220209230348-0030802.7400true
app-20220209230348-0030662.7400true
app-20220209230348-0030342.951600false
app-20220209230348-0030812.7400true
app-20220209230348-0030592.7400true
app-20220209230348-0030395.9394887110false
app-20220209230348-0030832.7400true
app-20220209230348-0030323.376792590false
app-20220209230348-0030706.459653110false
app-20220209230348-0030742.7400true
app-20220209230348-0030892.7400true
app-20220209230348-0030532.7400true
app-20220209230348-0030454.151364450false
app-20220209230348-0030522.7400true
app-20220209230348-0030784.31712000false
app-20220209230348-0030862.7400true
app-20220209230348-0030933.5210399325998false
app-20220209230348-0030822.7400true
app-20220209230348-0030572.7400true
app-20220209230348-0030434.2748610false
app-20220209230348-0030544.31785830false
app-20220209230348-0030642.7400true
app-20220209230348-0030722.7400true
app-20220209230348-0030412.7400true
app-20220209230348-0030372.7400true
app-20220209230348-0030402.7400true
app-20220209230348-0030772.7400true
app-20220209230348-0030792.7400true
app-20220209230348-0030472.7400true
app-20220209230348-0030442.7400true
app-20220209230348-0030552.95220false
app-20220209230348-0030636.9112336720false
app-20220209230348-0030562.7400true
app-20220209230348-0030333.33380960false
app-20220209230348-0030732.7400true
app-20220209230348-0030882.7400true
app-20220209230348-0030422.7400true
app-20220209230348-0030712.7400true
app-20220209230348-0030842.7400true
app-20220209230348-0030762.7400true
app-20220209230348-0030352.910770false
app-20220209230348-0030682.7400true
app-20220209230348-0030363.33106600false
app-20220209230348-0030922.7400true
app-20220209230348-0030482.7400true
app-20220209230348-0030496.455181240false
app-20220209230348-0030912.7400true
app-20220209230348-0030672.7400true
Showing the first 1000 rows.
"]}}],"execution_count":0},{"cell_type":"markdown","source":["## Execs Output"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"4d7ce219-ae75-4a0c-a78c-4e7f25b8cd6f","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["execs_output=pd.read_csv(outputpath_string + \"/rapids_4_spark_qualification_output/rapids_4_spark_qualification_output_execs.csv\")\ndisplay(execs_output)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"998b0c51-0cb6-408e-a01a-d1f5b1a61e1f","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":true,"datasetInfos":[],"data":[["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,30,false,"31",null,null,true],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,89,false,"39",null,null,true],["app-20220209224509-0008",24,"WholeStageCodegen (15)","WholeStageCodegen (15)",8.0,4234050,95,true,"39","Sort","96",false],["app-20220209224509-0008",24,"Exchange",null,4.2,584,97,true,"36:39",null,null,false],["app-20220209224509-0008",0,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (8)","WholeStageCodegen (8)",2.9,23059,65,true,"37","Project:Filter:ColumnarToRow","66:67:68",false],["app-20220209224509-0008",24,"Union",null,3.0,0,85,true,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (22)","WholeStageCodegen (22)",4.5,18839,76,true,"40","HashAggregate","77",false],["app-20220209224509-0008",24,"Project",null,3.0,0,60,true,null,null,null,false],["app-20220209224509-0008",24,"Exchange",null,4.2,80029,104,true,"35:39",null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,40,true,null,null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,54,true,null,null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,81,true,null,null,null,false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,536,114,true,"34",null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (6)","WholeStageCodegen (6)",4.5,187988,9,true,"40","HashAggregate","10",false],["app-20220209224509-0008",24,"Project",null,3.0,0,56,true,null,null,null,false],["app-20220209224509-0008",24,"SubqueryBroadcast",null,3.0,1736,70,true,null,null,null,false],["app-20220209224509-0008",14,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,33,true,null,null,null,false],["app-20220209224509-0008",24,"HashAggregate",null,4.5,0,77,true,"40",null,null,false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,750661,109,true,"35",null,null,false],["app-20220209224509-0008",24,"HashAggregate",null,4.5,0,6,true,"40",null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,87,true,null,null,null,false],["app-20220209224509-0008",10,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,35,false,"38",null,null,true],["app-20220209224509-0008",24,"BroadcastExchange",null,3.0,1712,38,true,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",4.13,315026,12,true,"38","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin","13:14:15:16:17",false],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,113,false,"34",null,null,true],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,42,false,"31",null,null,true],["app-20220209224509-0008",22,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.9,760,27,true,"31","Project:Filter:ColumnarToRow","28:29:30",false],["app-20220209224509-0008",1,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"BroadcastExchange",null,3.0,1567,71,true,null,null,null,false],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,62,false,"37",null,null,true],["app-20220209224509-0008",24,"WholeStageCodegen (13)","WholeStageCodegen (13)",2.9,17055,86,true,"39","Project:Filter:ColumnarToRow","87:88:89",false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,283,48,true,"32",null,null,false],["app-20220209224509-0008",24,"Sort",null,8.0,0,103,true,"39",null,null,false],["app-20220209224509-0008",23,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,106,true,null,null,null,false],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,22,false,"38",null,null,true],["app-20220209224509-0008",24,"Union",null,3.0,0,8,true,null,null,null,false],["app-20220209224509-0008",12,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"HashAggregate",null,4.5,0,10,true,"40",null,null,false],["app-20220209224509-0008",24,"Filter",null,2.8,0,73,true,"33",null,null,false],["app-20220209224509-0008",24,"BroadcastExchange",null,3.0,1537,110,true,null,null,null,false],["app-20220209224509-0008",24,"SortMergeJoin",null,22.7,0,94,true,"39",null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,14,true,null,null,null,false],["app-20220209224509-0008",24,"SubqueryBroadcast",null,3.0,1736,101,true,null,null,null,false],["app-20220209224509-0008",24,"BroadcastExchange",null,3.0,1128,44,true,null,null,null,false],["app-20220209224509-0008",16,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"Filter",null,2.8,0,61,true,"37",null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (16)","WholeStageCodegen (16)",2.9,1506623,105,true,"35","Project:Filter:ColumnarToRow","106:107:108",false],["app-20220209224509-0008",24,"Filter",null,2.8,0,34,true,"38",null,null,false],["app-20220209224509-0008",24,"Execute InsertIntoHadoopFsRelationCommand parquet",null,3.0,0,0,true,null,null,null,false],["app-20220209224509-0008",5,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (20)","WholeStageCodegen (20)",2.8,540,111,true,"34","Filter:ColumnarToRow","112:113",false],["app-20220209224509-0008",24,"SubqueryBroadcast",null,3.0,1736,37,true,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (14)","WholeStageCodegen (14)",1.0,4090,98,false,"36","ColumnarToRow","99",false],["app-20220209224509-0008",9,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,12454,69,true,"37",null,null,false],["app-20220209224509-0008",6,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,68,false,"37",null,null,true],["app-20220209224509-0008",24,"Filter",null,2.8,0,21,true,"38",null,null,false],["app-20220209224509-0008",24,"TakeOrderedAndProject",null,3.0,0,1,true,"41:42",null,null,false],["app-20220209224509-0008",24,"BroadcastHashJoin",null,5.09,0,15,true,"38",null,null,false],["app-20220209224509-0008",24,"BroadcastHashJoin",null,5.09,0,57,true,"37",null,null,false],["app-20220209224509-0008",24,"Union",null,3.0,0,18,true,null,null,null,false],["app-20220209224509-0008",2,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (7)","WholeStageCodegen (7)",2.9,247099,59,true,"37","Project:Filter:ColumnarToRow","60:61:62",false],["app-20220209224509-0008",7,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",19,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",4,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (21)","WholeStageCodegen (21)",4.13,3230425,79,true,"39","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin","80:81:82:83:84",false],["app-20220209224509-0008",24,"Exchange",null,4.2,768,78,true,"39:40",null,null,false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,173035,23,true,"38",null,null,false],["app-20220209224509-0008",15,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,47,false,"32",null,null,true],["app-20220209224509-0008",24,"BroadcastHashJoin",null,5.09,0,82,true,"39",null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,66,true,null,null,null,false],["app-20220209224509-0008",24,"SubqueryBroadcast",null,3.0,1736,91,true,null,null,null,false],["app-20220209224509-0008",24,"BroadcastHashJoin",null,5.09,0,84,true,"39",null,null,false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,19562,36,true,"38",null,null,false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,515,75,true,"33",null,null,false],["app-20220209224509-0008",24,"Exchange",null,4.2,206,4,true,"40:41",null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,20,true,null,null,null,false],["app-20220209224509-0008",24,"HashAggregate",null,4.5,0,13,true,"38",null,null,false],["app-20220209224509-0008",24,"BroadcastHashJoin",null,5.09,0,55,true,"37",null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (24)","WholeStageCodegen (24)",4.5,30834,2,true,"41","HashAggregate","3",false],["app-20220209224509-0008",24,"Union",null,3.0,0,58,true,null,null,null,false],["app-20220209224509-0008",24,"Filter",null,2.8,0,29,true,"31",null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (12)","WholeStageCodegen (12)",4.5,34686,49,true,"40","HashAggregate","50",false],["app-20220209224509-0008",24,"HashAggregate",null,4.5,0,50,true,"40",null,null,false],["app-20220209224509-0008",24,"SubqueryBroadcast",null,3.0,1736,64,true,null,null,null,false],["app-20220209224509-0008",24,"Exchange",null,4.2,4425,51,true,"37:40",null,null,false],["app-20220209224509-0008",13,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"Filter",null,2.8,0,88,true,"39",null,null,false],["app-20220209224509-0008",24,"Filter",null,2.8,0,46,true,"32",null,null,false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,743,31,true,"31",null,null,false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,2399,100,true,"36",null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",2.8,291,45,true,"32","Filter:ColumnarToRow","46:47",false],["app-20220209224509-0008",24,"Filter",null,2.8,0,41,true,"31",null,null,false],["app-20220209224509-0008",24,"BroadcastHashJoin",null,5.09,0,17,true,"38",null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,93,true,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.9,325673,19,true,"38","Project:Filter:ColumnarToRow","20:21:22",false],["app-20220209224509-0008",24,"Expand",null,3.0,0,7,true,"40",null,null,false],["app-20220209224509-0008",24,"Exchange",null,4.2,6179,11,true,"38:40",null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,28,true,null,null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,16,true,null,null,null,false],["app-20220209224509-0008",24,"Filter",null,2.8,0,67,true,"37",null,null,false],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,108,false,"35",null,null,true],["app-20220209224509-0008",24,"Filter",null,2.8,0,107,true,"35",null,null,false],["app-20220209224509-0008",24,"SubqueryBroadcast",null,3.0,1736,24,true,null,null,null,false],["app-20220209224509-0008",24,"Filter",null,2.8,0,112,true,"34",null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,83,true,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (11)","WholeStageCodegen (11)",4.13,235109,52,true,"37","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin","53:54:55:56:57",false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,132149,63,true,"37",null,null,false],["app-20220209224509-0008",20,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",17,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",3,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",18,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.9,760,39,true,"31","Project:Filter:ColumnarToRow","40:41:42",false],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,99,false,"36",null,null,true],["app-20220209224509-0008",8,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (10)","WholeStageCodegen (10)",2.8,538,72,true,"33","Filter:ColumnarToRow","73:74",false],["app-20220209224509-0008",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",2.9,36275,32,true,"38","Project:Filter:ColumnarToRow","33:34:35",false],["app-20220209224509-0008",24,"HashAggregate",null,4.5,0,53,true,"37",null,null,false],["app-20220209224509-0008",24,"HashAggregate",null,4.5,0,3,true,"41",null,null,false],["app-20220209224509-0008",21,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (23)","WholeStageCodegen (23)",3.75,201149,5,true,"40","HashAggregate:Expand","6:7",false],["app-20220209224509-0008",24,"BroadcastExchange",null,3.0,1712,26,true,null,null,null,false],["app-20220209224509-0008",11,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (18)","WholeStageCodegen (18)",12.85,3376529,92,true,"39","Project:SortMergeJoin","93:94",false],["app-20220209224509-0008",24,"WholeStageCodegen (17)","WholeStageCodegen (17)",8.0,0,102,true,"39","Sort","103",false],["app-20220209224509-0008",24,"HashAggregate",null,4.5,0,80,true,"39",null,null,false],["app-20220209224509-0008",24,"ReusedExchange",null,1.0,0,25,false,null,null,null,false],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,74,false,"33",null,null,true],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,8648,90,true,"39",null,null,false],["app-20220209224509-0008",24,"Sort",null,8.0,0,96,true,"39",null,null,false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,743,43,true,"31",null,null,false],["app-20220209235114-0097",24,"Project",null,3.0,0,35,true,null,null,null,false],["app-20220209235114-0097",24,"Filter",null,2.8,0,52,true,"36",null,null,false],["app-20220209235114-0097",24,"Project",null,3.0,0,49,true,null,null,null,false],["app-20220209235114-0097",24,"Project",null,3.0,0,23,true,null,null,null,false],["app-20220209235114-0097",17,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"BroadcastHashJoin",null,5.09,0,16,true,"35",null,null,false],["app-20220209235114-0097",24,"Project",null,3.0,0,13,true,null,null,null,false],["app-20220209235114-0097",9,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"Scan parquet ",null,3.0,913605,20,true,"35",null,null,false],["app-20220209235114-0097",24,"Exchange",null,4.2,969,42,true,"36:38",null,null,false],["app-20220209235114-0097",24,"Scan parquet ",null,3.0,511,38,true,"33",null,null,false],["app-20220209235114-0097",24,"BroadcastHashJoin",null,5.09,0,46,true,"36",null,null,false],["app-20220209235114-0097",24,"Project",null,3.0,0,15,true,null,null,null,false],["app-20220209235114-0097",24,"WholeStageCodegen (6)","WholeStageCodegen (6)",3.84,418053,43,true,"36","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:Filter:ColumnarToRow","44:45:46:47:48:49:50:51:52:53",false],["app-20220209235114-0097",24,"HashAggregate",null,4.5,0,7,true,"40",null,null,false],["app-20220209235114-0097",24,"BroadcastExchange",null,3.0,1401,55,true,null,null,null,false],["app-20220209235114-0097",24,"Execute InsertIntoHadoopFsRelationCommand parquet",null,3.0,0,0,true,null,null,null,false],["app-20220209235114-0097",21,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",20,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"Project",null,3.0,0,17,true,null,null,null,false],["app-20220209235114-0097",24,"Project",null,3.0,0,57,true,null,null,null,false],["app-20220209235114-0097",14,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"Project",null,3.0,0,47,true,null,null,null,false],["app-20220209235114-0097",3,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",22,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"WholeStageCodegen (8)","WholeStageCodegen (8)",4.5,172,6,true,"40","HashAggregate","7",false],["app-20220209235114-0097",8,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"TakeOrderedAndProject",null,3.0,0,2,true,"40:41",null,null,false],["app-20220209235114-0097",24,"Filter",null,2.8,0,36,true,"33",null,null,false],["app-20220209235114-0097",24,"HashAggregate",null,4.5,0,44,true,"36",null,null,false],["app-20220209235114-0097",24,"Scan parquet ",null,3.0,508,60,true,"34",null,null,false],["app-20220209235114-0097",24,"WholeStageCodegen (7)","WholeStageCodegen (7)",4.5,42,40,true,"38","HashAggregate","41",false],["app-20220209235114-0097",24,"Project",null,3.0,0,4,true,null,null,null,false],["app-20220209235114-0097",13,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",3.84,1443692,9,true,"35","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:Filter:ColumnarToRow","10:11:12:13:14:15:16:17:18:19",false],["app-20220209235114-0097",23,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"Project",null,3.0,0,45,true,null,null,null,false],["app-20220209235114-0097",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.9,519,22,true,"31","Project:Filter:ColumnarToRow","23:24:25",false],["app-20220209235114-0097",24,"Project",null,3.0,0,11,true,null,null,null,false],["app-20220209235114-0097",24,"Filter",null,2.8,0,24,true,"31",null,null,false],["app-20220209235114-0097",24,"AdaptiveSparkPlan",null,1.0,0,1,false,null,null,null,false],["app-20220209235114-0097",24,"ColumnarToRow",null,1.0,0,31,false,"32",null,null,true],["app-20220209235114-0097",24,"BroadcastHashJoin",null,5.09,0,14,true,"35",null,null,false],["app-20220209235114-0097",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.9,515,34,true,"33","Project:Filter:ColumnarToRow","35:36:37",false],["app-20220209235114-0097",24,"HashAggregate",null,4.5,0,41,true,"38",null,null,false],["app-20220209235114-0097",4,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"Project",null,3.0,0,29,true,null,null,null,false],["app-20220209235114-0097",24,"WholeStageCodegen (9)","WholeStageCodegen (9)",3.0,96,3,true,"40","Project","4",false],["app-20220209235114-0097",7,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",12,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"Filter",null,2.8,0,58,true,"34",null,null,false],["app-20220209235114-0097",15,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",16,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",1,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"BroadcastHashJoin",null,5.09,0,50,true,"36",null,null,false],["app-20220209235114-0097",19,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",5,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"BroadcastHashJoin",null,5.09,0,48,true,"36",null,null,false],["app-20220209235114-0097",24,"BroadcastNestedLoopJoin",null,3.0,0,5,true,"40",null,null,false],["app-20220209235114-0097",24,"BroadcastExchange",null,3.0,1331,33,true,null,null,null,false],["app-20220209235114-0097",24,"Exchange",null,4.2,2539,8,true,"35:40",null,null,false],["app-20220209235114-0097",24,"BroadcastHashJoin",null,5.09,0,12,true,"35",null,null,false],["app-20220209235114-0097",24,"ColumnarToRow",null,1.0,0,19,false,"35",null,null,true],["app-20220209235114-0097",24,"Scan parquet ",null,3.0,298,32,true,"32",null,null,false],["app-20220209235114-0097",24,"BroadcastExchange",null,3.0,1490,21,true,null,null,null,false],["app-20220209235114-0097",11,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",0,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"BroadcastExchange",null,3.0,1175,27,true,null,null,null,false],["app-20220209235114-0097",24,"ColumnarToRow",null,1.0,0,37,false,"33",null,null,true],["app-20220209235114-0097",24,"Project",null,3.0,0,51,true,null,null,null,false],["app-20220209235114-0097",24,"ColumnarToRow",null,1.0,0,53,false,"36",null,null,true],["app-20220209235114-0097",24,"Scan parquet ",null,3.0,512,26,true,"31",null,null,false],["app-20220209235114-0097",24,"ColumnarToRow",null,1.0,0,59,false,"34",null,null,true],["app-20220209235114-0097",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",2.9,532,56,true,"34","Project:Filter:ColumnarToRow","57:58:59",false],["app-20220209235114-0097",18,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",10,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"Filter",null,2.8,0,30,true,"32",null,null,false],["app-20220209235114-0097",2,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"Scan parquet ",null,3.0,187093,54,true,"36",null,null,false],["app-20220209235114-0097",24,"BroadcastExchange",null,3.0,315,39,true,null,null,null,false],["app-20220209235114-0097",6,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",2.9,317,28,true,"32","Project:Filter:ColumnarToRow","29:30:31",false],["app-20220209235114-0097",24,"Filter",null,2.8,0,18,true,"35",null,null,false],["app-20220209235114-0097",24,"ColumnarToRow",null,1.0,0,25,false,"31",null,null,true],["app-20220209235114-0097",24,"HashAggregate",null,4.5,0,10,true,"35",null,null,false],["app-20220209230506-0031",24,"BroadcastExchange",null,3.0,1704,49,true,null,null,null,false],["app-20220209230506-0031",24,"Exchange",null,4.2,9,4,true,"39:40",null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (10)","WholeStageCodegen (10)",2.9,635,70,true,"31","Project:Filter:ColumnarToRow","71:72:73",false],["app-20220209230506-0031",24,"WholeStageCodegen (13)","WholeStageCodegen (13)",2.8,4513,81,true,"32","Filter:ColumnarToRow","82:83",false],["app-20220209230506-0031",11,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Project",null,3.0,0,9,true,null,null,null,false],["app-20220209230506-0031",24,"BroadcastExchange",null,3.0,1704,69,true,null,null,null,false],["app-20220209230506-0031",24,"Project",null,3.0,0,23,true,null,null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (8)","WholeStageCodegen (8)",8.0,35213,55,true,"39","Sort","56",false],["app-20220209230506-0031",24,"WholeStageCodegen (7)","WholeStageCodegen (7)",2.8,884757,58,true,"37","Filter:ColumnarToRow","59:60",false],["app-20220209230506-0031",18,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Exchange",null,4.2,6119,42,true,"36:38",null,null,false],["app-20220209230506-0031",13,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (12)","WholeStageCodegen (12)",2.8,817,76,true,"33","Filter:ColumnarToRow","77:78",false],["app-20220209230506-0031",24,"Filter",null,2.8,0,52,true,"31",null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (15)","WholeStageCodegen (15)",4.5,33476,2,true,"40","HashAggregate","3",false],["app-20220209230506-0031",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.8,145646,43,true,"36","Filter:ColumnarToRow","44:45",false],["app-20220209230506-0031",24,"HashAggregate",null,4.5,0,3,true,"40",null,null,false],["app-20220209230506-0031",24,"Filter",null,2.8,0,77,true,"33",null,null,false],["app-20220209230506-0031",24,"Sort",null,8.0,0,20,true,"39",null,null,false],["app-20220209230506-0031",24,"Project",null,3.0,0,36,true,null,null,null,false],["app-20220209230506-0031",24,"Sort",null,8.0,0,26,true,"38",null,null,false],["app-20220209230506-0031",22,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"ColumnarToRow",null,1.0,0,53,false,"31",null,null,true],["app-20220209230506-0031",24,"Project",null,3.0,0,15,true,null,null,null,false],["app-20220209230506-0031",20,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Scan parquet ",null,3.0,59127,46,true,"36",null,null,false],["app-20220209230506-0031",24,"SortMergeJoin",null,22.7,0,18,true,"39",null,null,false],["app-20220209230506-0031",24,"Filter",null,2.8,0,29,true,"35",null,null,false],["app-20220209230506-0031",24,"ColumnarToRow",null,1.0,0,73,false,"31",null,null,true],["app-20220209230506-0031",12,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"ColumnarToRow",null,1.0,0,83,false,"32",null,null,true],["app-20220209230506-0031",9,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (6)","WholeStageCodegen (6)",8.0,1675058,19,true,"39","Sort","20",false],["app-20220209230506-0031",24,"BroadcastHashJoin",null,5.09,0,16,true,"39",null,null,false],["app-20220209230506-0031",6,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",17,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",8,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",21,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Execute InsertIntoHadoopFsRelationCommand parquet",null,3.0,0,0,true,null,null,null,false],["app-20220209230506-0031",24,"Project",null,3.0,0,51,true,null,null,null,false],["app-20220209230506-0031",24,"BroadcastHashJoin",null,5.09,0,8,true,"39",null,null,false],["app-20220209230506-0031",24,"BroadcastHashJoin",null,5.09,0,10,true,"39",null,null,false],["app-20220209230506-0031",15,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Filter",null,2.8,0,37,true,"34",null,null,false],["app-20220209230506-0031",24,"Scan parquet ",null,3.0,610,74,true,"31",null,null,false],["app-20220209230506-0031",16,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Scan parquet ",null,3.0,4268,84,true,"32",null,null,false],["app-20220209230506-0031",10,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",19,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Scan parquet ",null,3.0,610,54,true,"31",null,null,false],["app-20220209230506-0031",24,"Scan parquet ",null,3.0,559865,61,true,"37",null,null,false],["app-20220209230506-0031",24,"Exchange",null,4.2,7697,27,true,"35:38",null,null,false],["app-20220209230506-0031",24,"Project",null,3.0,0,11,true,null,null,null,false],["app-20220209230506-0031",24,"Sort",null,8.0,0,56,true,"39",null,null,false],["app-20220209230506-0031",2,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"BroadcastHashJoin",null,5.09,0,14,true,"39",null,null,false],["app-20220209230506-0031",1,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (9)","WholeStageCodegen (9)",2.9,637,64,true,"34","Project:Filter:ColumnarToRow","65:66:67",false],["app-20220209230506-0031",24,"ColumnarToRow",null,1.0,0,38,false,"34",null,null,true],["app-20220209230506-0031",24,"ColumnarToRow",null,1.0,0,30,false,"35",null,null,true],["app-20220209230506-0031",24,"Exchange",null,4.2,4960,57,true,"37:39",null,null,false],["app-20220209230506-0031",24,"SortMergeJoin",null,22.7,0,24,true,"38",null,null,false],["app-20220209230506-0031",24,"BroadcastExchange",null,3.0,2462,80,true,null,null,null,false],["app-20220209230506-0031",24,"Filter",null,2.8,0,59,true,"37",null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",8.0,968634,40,true,"38","Sort","41",false],["app-20220209230506-0031",24,"BroadcastHashJoin",null,5.09,0,12,true,"39",null,null,false],["app-20220209230506-0031",0,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Filter",null,2.8,0,44,true,"36",null,null,false],["app-20220209230506-0031",7,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"HashAggregate",null,4.5,0,6,true,"39",null,null,false],["app-20220209230506-0031",4,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Project",null,3.0,0,17,true,null,null,null,false],["app-20220209230506-0031",24,"ColumnarToRow",null,1.0,0,67,false,"34",null,null,true],["app-20220209230506-0031",24,"Scan parquet ",null,3.0,618,68,true,"34",null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",12.85,1581047,22,true,"38","Project:SortMergeJoin","23:24",false],["app-20220209230506-0031",24,"Scan parquet ",null,3.0,28231,31,true,"35",null,null,false],["app-20220209230506-0031",24,"Filter",null,2.8,0,72,true,"31",null,null,false],["app-20220209230506-0031",24,"ColumnarToRow",null,1.0,0,45,false,"36",null,null,true],["app-20220209230506-0031",3,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Project",null,3.0,0,71,true,null,null,null,false],["app-20220209230506-0031",24,"Project",null,3.0,0,7,true,null,null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (14)","WholeStageCodegen (14)",5.44,1222545,5,true,"39","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:SortMergeJoin","6:7:8:9:10:11:12:13:14:15:16:17:18",false],["app-20220209230506-0031",24,"WholeStageCodegen (10)","WholeStageCodegen (10)",2.9,635,50,true,"31","Project:Filter:ColumnarToRow","51:52:53",false],["app-20220209230506-0031",24,"Scan parquet ",null,3.0,618,39,true,"34",null,null,false],["app-20220209230506-0031",24,"Filter",null,2.8,0,82,true,"32",null,null,false],["app-20220209230506-0031",24,"BroadcastExchange",null,3.0,1696,75,true,null,null,null,false],["app-20220209230506-0031",24,"Scan parquet ",null,3.0,807,79,true,"33",null,null,false],["app-20220209230506-0031",24,"SubqueryBroadcast",null,3.0,1710,47,true,null,null,null,false],["app-20220209230506-0031",24,"Project",null,3.0,0,13,true,null,null,null,false],["app-20220209230506-0031",24,"BroadcastExchange",null,3.0,1661,34,true,null,null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",8.0,1044148,25,true,"38","Sort","26",false],["app-20220209230506-0031",24,"BroadcastExchange",null,3.0,1661,63,true,null,null,null,false],["app-20220209230506-0031",23,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (9)","WholeStageCodegen (9)",2.9,637,35,true,"34","Project:Filter:ColumnarToRow","36:37:38",false],["app-20220209230506-0031",24,"SubqueryBroadcast",null,3.0,1710,62,true,null,null,null,false],["app-20220209230506-0031",24,"Project",null,3.0,0,65,true,null,null,null,false],["app-20220209230506-0031",24,"TakeOrderedAndProject",null,3.0,0,1,true,"40:41",null,null,false],["app-20220209230506-0031",24,"Filter",null,2.8,0,66,true,"34",null,null,false],["app-20220209230506-0031",24,"ColumnarToRow",null,1.0,0,60,false,"37",null,null,true],["app-20220209230506-0031",24,"ReusedExchange",null,1.0,0,33,false,null,null,null,false],["app-20220209230506-0031",24,"Exchange",null,4.2,9973,21,true,"38:39",null,null,false],["app-20220209230506-0031",24,"ColumnarToRow",null,1.0,0,78,false,"33",null,null,true],["app-20220209230506-0031",24,"SubqueryBroadcast",null,3.0,1680,32,true,null,null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.8,61763,28,true,"35","Filter:ColumnarToRow","29:30",false],["app-20220209230506-0031",14,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Sort",null,8.0,0,41,true,"38",null,null,false],["app-20220209230506-0031",5,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"ReusedExchange",null,1.0,0,48,false,null,null,null,false],["app-20220209232634-0070",24,"Window",null,3.0,0,5,true,null,null,null,false],["app-20220209232634-0070",24,"Execute InsertIntoHadoopFsRelationCommand parquet",null,3.0,0,0,true,null,null,null,false],["app-20220209232634-0070",24,"HashAggregate",null,4.5,0,10,true,"35",null,null,false],["app-20220209232634-0070",5,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"Project",null,3.0,0,22,true,null,null,null,false],["app-20220209232634-0070",7,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",2,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"Scan parquet ",null,3.0,297,42,true,"33",null,null,false],["app-20220209232634-0070",24,"Scan parquet ",null,3.0,496,47,true,"32",null,null,false],["app-20220209232634-0070",14,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",1,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",3,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",4.5,170171,9,true,"35","HashAggregate","10",false],["app-20220209232634-0070",24,"Filter",null,2.8,0,26,true,"34",null,null,false],["app-20220209232634-0070",24,"Sort",null,8.0,0,7,true,"36",null,null,false],["app-20220209232634-0070",24,"ColumnarToRow",null,1.0,0,35,false,"33",null,null,true],["app-20220209232634-0070",20,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"Project",null,3.0,0,39,true,null,null,null,false],["app-20220209232634-0070",24,"Project",null,3.0,0,33,true,null,null,null,false],["app-20220209232634-0070",16,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"ColumnarToRow",null,1.0,0,46,false,"32",null,null,true],["app-20220209232634-0070",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",3.95,1233966,12,true,"34","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Filter:ColumnarToRow","13:14:15:16:17:18:19:26:27",false],["app-20220209232634-0070",24,"Exchange",null,4.2,84261,11,true,"34:35",null,null,false],["app-20220209232634-0070",8,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.9,3044,21,true,"31","Project:Filter:ColumnarToRow","22:23:24",false],["app-20220209232634-0070",24,"BroadcastExchange",null,3.0,1460,43,true,null,null,null,false],["app-20220209232634-0070",24,"SubqueryBroadcast",null,3.0,1121,29,true,null,null,null,false],["app-20220209232634-0070",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.8,502,44,true,"32","Filter:ColumnarToRow","45:46",false],["app-20220209232634-0070",24,"WholeStageCodegen (6)","WholeStageCodegen (6)",8.0,134574,6,true,"36","Sort","7",false],["app-20220209232634-0070",10,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"BroadcastExchange",null,3.0,1110,31,true,null,null,null,false],["app-20220209232634-0070",24,"BroadcastHashJoin",null,5.09,0,17,true,"34",null,null,false],["app-20220209232634-0070",12,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",15,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",19,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"ColumnarToRow",null,1.0,0,41,false,"33",null,null,true],["app-20220209232634-0070",24,"TakeOrderedAndProject",null,3.0,0,1,true,"36:37",null,null,false],["app-20220209232634-0070",24,"Filter",null,2.8,0,40,true,"33",null,null,false],["app-20220209232634-0070",4,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"Exchange",null,4.2,32,8,true,"35:36",null,null,false],["app-20220209232634-0070",24,"Project",null,3.0,0,3,true,null,null,null,false],["app-20220209232634-0070",21,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",9,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",2.9,316,38,true,"33","Project:Filter:ColumnarToRow","39:40:41",false],["app-20220209232634-0070",24,"ReusedExchange",null,1.0,0,30,false,null,null,null,false],["app-20220209232634-0070",24,"BroadcastHashJoin",null,5.09,0,15,true,"34",null,null,false],["app-20220209232634-0070",24,"BroadcastHashJoin",null,5.09,0,19,true,"34",null,null,false],["app-20220209232634-0070",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",2.9,316,32,true,"33","Project:Filter:ColumnarToRow","33:34:35",false],["app-20220209232634-0070",24,"Filter",null,2.8,0,23,true,"31",null,null,false],["app-20220209232634-0070",22,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"ColumnarToRow",null,1.0,0,27,false,"34",null,null,true],["app-20220209232634-0070",24,"Scan parquet ",null,3.0,297,36,true,"33",null,null,false],["app-20220209232634-0070",24,"Filter",null,2.8,0,45,true,"32",null,null,false],["app-20220209232634-0070",24,"Project",null,3.0,0,16,true,null,null,null,false],["app-20220209232634-0070",17,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"BroadcastExchange",null,3.0,1726,20,true,null,null,null,false],["app-20220209232634-0070",18,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",13,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"ColumnarToRow",null,1.0,0,24,false,"31",null,null,true],["app-20220209232634-0070",24,"Project",null,3.0,0,14,true,null,null,null,false],["app-20220209232634-0070",6,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"Project",null,3.0,0,18,true,null,null,null,false],["app-20220209232634-0070",24,"Filter",null,1.0,0,4,false,"36",null,null,false],["app-20220209232634-0070",24,"Scan parquet ",null,3.0,651253,28,true,"34",null,null,false],["app-20220209232634-0070",11,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",0,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"HashAggregate",null,4.5,0,13,true,"34",null,null,false],["app-20220209232634-0070",24,"WholeStageCodegen (7)","WholeStageCodegen (7)",2.0,5621,2,true,"36","Project:Filter","3:4",false],["app-20220209232634-0070",24,"BroadcastExchange",null,3.0,1110,37,true,null,null,null,false],["app-20220209232634-0070",24,"Scan parquet ",null,3.0,2913,25,true,"31",null,null,false],["app-20220209232634-0070",24,"Filter",null,2.8,0,34,true,"33",null,null,false],["app-20220209232634-0070",23,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",2,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.8,465,37,true,"33","Filter:ColumnarToRow","38:39",false],["app-20220209225845-0026",24,"SubqueryBroadcast",null,3.0,1608,17,true,null,null,null,false],["app-20220209225845-0026",24,"BroadcastHashJoin",null,5.09,0,13,true,"34",null,null,false],["app-20220209225845-0026",17,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"Exchange",null,4.2,4241,4,true,"34:35",null,null,false],["app-20220209225845-0026",24,"ColumnarToRow",null,1.0,0,39,false,"33",null,null,true],["app-20220209225845-0026",14,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"Scan parquet ",null,3.0,687,24,true,"31",null,null,false],["app-20220209225845-0026",24,"BroadcastHashJoin",null,5.09,0,11,true,"34",null,null,false],["app-20220209225845-0026",13,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",22,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"Scan parquet ",null,3.0,70247,16,true,"34",null,null,false],["app-20220209225845-0026",24,"Project",null,3.0,0,8,true,null,null,null,false],["app-20220209225845-0026",8,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",10,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",3.84,443046,5,true,"34","HashAggregate:Expand:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Filter:ColumnarToRow","6:7:8:9:10:11:12:13:14:15",false],["app-20220209225845-0026",24,"Project",null,3.0,0,10,true,null,null,null,false],["app-20220209225845-0026",24,"HashAggregate",null,4.5,0,6,true,"34",null,null,false],["app-20220209225845-0026",24,"Filter",null,2.8,0,28,true,"31",null,null,false],["app-20220209225845-0026",6,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"Project",null,3.0,0,12,true,null,null,null,false],["app-20220209225845-0026",3,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",16,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"Filter",null,2.8,0,38,true,"33",null,null,false],["app-20220209225845-0026",24,"Project",null,3.0,0,21,true,null,null,null,false],["app-20220209225845-0026",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",2.8,2544,32,true,"32","Filter:ColumnarToRow","33:34",false],["app-20220209225845-0026",24,"Filter",null,2.8,0,14,true,"34",null,null,false],["app-20220209225845-0026",7,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",5,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",9,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"BroadcastHashJoin",null,5.09,0,9,true,"34",null,null,false],["app-20220209225845-0026",23,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"ColumnarToRow",null,1.0,0,29,false,"31",null,null,true],["app-20220209225845-0026",19,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"Scan parquet ",null,3.0,687,30,true,"31",null,null,false],["app-20220209225845-0026",24,"Scan parquet ",null,3.0,2329,35,true,"32",null,null,false],["app-20220209225845-0026",24,"ReusedExchange",null,1.0,0,18,false,null,null,null,false],["app-20220209225845-0026",18,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"Expand",null,3.0,0,7,true,"34",null,null,false],["app-20220209225845-0026",24,"BroadcastExchange",null,3.0,1587,19,true,null,null,null,false],["app-20220209225845-0026",20,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"BroadcastExchange",null,3.0,1326,36,true,null,null,null,false],["app-20220209225845-0026",24,"Filter",null,2.8,0,22,true,"31",null,null,false],["app-20220209225845-0026",24,"Project",null,3.0,0,27,true,null,null,null,false],["app-20220209225845-0026",24,"ColumnarToRow",null,1.0,0,23,false,"31",null,null,true],["app-20220209225845-0026",24,"Filter",null,2.8,0,33,true,"32",null,null,false],["app-20220209225845-0026",24,"BroadcastExchange",null,3.0,1587,25,true,null,null,null,false],["app-20220209225845-0026",24,"TakeOrderedAndProject",null,3.0,0,1,true,"35:36",null,null,false],["app-20220209225845-0026",24,"HashAggregate",null,4.5,0,3,true,"35",null,null,false],["app-20220209225845-0026",21,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"ColumnarToRow",null,1.0,0,34,false,"32",null,null,true],["app-20220209225845-0026",1,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",11,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",4.5,472310,2,true,"35","HashAggregate","3",false],["app-20220209225845-0026",24,"BroadcastExchange",null,3.0,1905,31,true,null,null,null,false],["app-20220209225845-0026",15,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",12,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",0,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.9,707,26,true,"31","Project:Filter:ColumnarToRow","27:28:29",false],["app-20220209225845-0026",24,"ColumnarToRow",null,1.0,0,15,false,"34",null,null,true],["app-20220209225845-0026",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.9,707,20,true,"31","Project:Filter:ColumnarToRow","21:22:23",false],["app-20220209225845-0026",24,"Scan parquet ",null,3.0,462,40,true,"33",null,null,false],["app-20220209225845-0026",24,"Execute InsertIntoHadoopFsRelationCommand parquet",null,3.0,0,0,true,null,null,null,false],["app-20220209225845-0026",4,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",1,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",14,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",13,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",5.17,215,2,true,"36","Project:Sort:HashAggregate","3:4:5",false],["app-20220209235526-0103",19,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"BroadcastHashJoin",null,5.09,0,10,true,"34",null,null,false],["app-20220209235526-0103",10,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",9,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",0,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",3,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"Project",null,3.0,0,11,true,null,null,null,false],["app-20220209235526-0103",6,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"Project",null,3.0,0,9,true,null,null,null,false],["app-20220209235526-0103",7,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"BroadcastHashJoin",null,5.09,0,12,true,"34",null,null,false],["app-20220209235526-0103",24,"ColumnarToRow",null,1.0,0,35,false,"31",null,null,true],["app-20220209235526-0103",24,"BroadcastExchange",null,3.0,1307,19,true,null,null,null,false],["app-20220209235526-0103",24,"ColumnarToRow",null,1.0,0,23,false,"33",null,null,true],["app-20220209235526-0103",4,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"ColumnarToRow",null,1.0,0,17,false,"34",null,null,true],["app-20220209235526-0103",22,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",12,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"Scan parquet ",null,3.0,1051436,18,true,"34",null,null,false],["app-20220209235526-0103",15,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"Project",null,3.0,0,27,true,null,null,null,false],["app-20220209235526-0103",24,"HashAggregate",null,4.5,0,8,true,"34",null,null,false],["app-20220209235526-0103",24,"BroadcastExchange",null,3.0,1470,31,true,null,null,null,false],["app-20220209235526-0103",16,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"Scan parquet ",null,3.0,605,36,true,"31",null,null,false],["app-20220209235526-0103",24,"Filter",null,2.8,0,16,true,"34",null,null,false],["app-20220209235526-0103",24,"BroadcastExchange",null,3.0,1146,25,true,null,null,null,false],["app-20220209235526-0103",2,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"Scan parquet ",null,3.0,283,30,true,"32",null,null,false],["app-20220209235526-0103",21,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"Project",null,3.0,0,21,true,null,null,null,false],["app-20220209235526-0103",24,"Execute InsertIntoHadoopFsRelationCommand parquet",null,3.0,0,0,true,null,null,null,false],["app-20220209235526-0103",24,"ColumnarToRow",null,1.0,0,29,false,"32",null,null,true],["app-20220209235526-0103",18,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"Project",null,3.0,0,15,true,null,null,null,false],["app-20220209235526-0103",24,"Filter",null,2.8,0,34,true,"31",null,null,false],["app-20220209235526-0103",24,"Filter",null,2.8,0,28,true,"32",null,null,false],["app-20220209235526-0103",11,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",23,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"AdaptiveSparkPlan",null,1.0,0,1,false,null,null,null,false],["app-20220209235526-0103",24,"Sort",null,8.0,0,4,true,"36",null,null,false],["app-20220209235526-0103",17,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",20,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"BroadcastHashJoin",null,5.09,0,14,true,"34",null,null,false],["app-20220209235526-0103",24,"Scan parquet ",null,3.0,492,24,true,"33",null,null,false],["app-20220209235526-0103",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.9,498,20,true,"33","Project:Filter:ColumnarToRow","21:22:23",false],["app-20220209235526-0103",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",3.84,1577328,7,true,"34","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:Filter:ColumnarToRow","8:9:10:11:12:13:14:15:16:17",false],["app-20220209235526-0103",24,"Project",null,3.0,0,13,true,null,null,null,false],["app-20220209235526-0103",24,"Project",null,3.0,0,33,true,null,null,null,false],["app-20220209235526-0103",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",2.9,303,26,true,"32","Project:Filter:ColumnarToRow","27:28:29",false],["app-20220209235526-0103",5,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"Filter",null,2.8,0,22,true,"33",null,null,false],["app-20220209235526-0103",24,"HashAggregate",null,4.5,0,5,true,"36",null,null,false],["app-20220209235526-0103",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.9,610,32,true,"31","Project:Filter:ColumnarToRow","33:34:35",false],["app-20220209235526-0103",8,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"Exchange",null,4.2,2298,6,true,"34:36",null,null,false],["app-20220209235526-0103",24,"Project",null,3.0,0,3,true,null,null,null,false],["app-20220209231919-0057",16,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",9,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"Execute InsertIntoHadoopFsRelationCommand parquet",null,3.0,0,0,true,null,null,null,false],["app-20220209231919-0057",24,"Exchange",null,4.2,511,24,true,"34:36",null,null,false],["app-20220209231919-0057",14,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"Scan parquet ",null,3.0,298,36,true,"32",null,null,false],["app-20220209231919-0057",24,"Project",null,3.0,0,33,true,null,null,null,false],["app-20220209231919-0057",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",8.0,13538935,22,true,"36","Sort","23",false],["app-20220209231919-0057",0,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"Filter",null,2.8,0,19,true,"35",null,null,false],["app-20220209231919-0057",24,"WholeStageCodegen (7)","WholeStageCodegen (7)",2.9,316,48,true,"32","Project:Filter:ColumnarToRow","49:50:51",false],["app-20220209231919-0057",4,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"Filter",null,2.8,0,44,true,"31",null,null,false],["app-20220209231919-0057",24,"Scan parquet ",null,3.0,285,46,true,"31",null,null,false],["app-20220209231919-0057",24,"ColumnarToRow",null,1.0,0,45,false,"31",null,null,true],["app-20220209231919-0057",24,"BroadcastExchange",null,3.0,1208,31,true,null,null,null,false],["app-20220209231919-0057",3,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"SortMergeJoin",null,22.7,0,14,true,"36",null,null,false],["app-20220209231919-0057",24,"Project",null,3.0,0,13,true,null,null,null,false],["app-20220209231919-0057",17,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",15,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"Filter",null,2.8,0,34,true,"32",null,null,false],["app-20220209231919-0057",24,"ColumnarToRow",null,1.0,0,40,false,"33",null,null,true],["app-20220209231919-0057",24,"Exchange",null,4.2,146476,17,true,"35:36",null,null,false],["app-20220209231919-0057",24,"ColumnarToRow",null,1.0,0,27,false,"34",null,null,true],["app-20220209231919-0057",24,"Scan parquet ",null,3.0,298,52,true,"32",null,null,false],["app-20220209231919-0057",24,"SubqueryBroadcast",null,3.0,1234,29,true,null,null,null,false],["app-20220209231919-0057",1,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",12,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"WholeStageCodegen (8)","WholeStageCodegen (8)",6.06,7555734,5,true,"36","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:SortMergeJoin","6:7:8:9:10:11:12:13:14",false],["app-20220209231919-0057",21,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"Project",null,3.0,0,9,true,null,null,null,false],["app-20220209231919-0057",24,"Filter",null,2.8,0,26,true,"34",null,null,false],["app-20220209231919-0057",13,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.8,76352,25,true,"34","Filter:ColumnarToRow","26:27",false],["app-20220209231919-0057",7,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"TakeOrderedAndProject",null,3.0,0,1,true,"37:38",null,null,false],["app-20220209231919-0057",24,"Filter",null,2.8,0,39,true,"33",null,null,false],["app-20220209231919-0057",24,"Project",null,3.0,0,11,true,null,null,null,false],["app-20220209231919-0057",24,"ColumnarToRow",null,1.0,0,35,false,"32",null,null,true],["app-20220209231919-0057",24,"Scan parquet ",null,3.0,289,41,true,"33",null,null,false],["app-20220209231919-0057",24,"Exchange",null,4.2,1492,4,true,"36:37",null,null,false],["app-20220209231919-0057",18,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"HashAggregate",null,4.5,0,3,true,"37",null,null,false],["app-20220209231919-0057",5,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"WholeStageCodegen (6)","WholeStageCodegen (6)",2.8,313,43,true,"31","Filter:ColumnarToRow","44:45",false],["app-20220209231919-0057",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",8.0,21803,15,true,"36","Sort","16",false],["app-20220209231919-0057",11,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",2.8,302,38,true,"33","Filter:ColumnarToRow","39:40",false],["app-20220209231919-0057",24,"ColumnarToRow",null,1.0,0,20,false,"35",null,null,true],["app-20220209231919-0057",24,"Sort",null,8.0,0,16,true,"36",null,null,false],["app-20220209231919-0057",24,"BroadcastHashJoin",null,5.09,0,10,true,"36",null,null,false],["app-20220209231919-0057",23,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"Scan parquet ",null,3.0,47653,28,true,"34",null,null,false],["app-20220209231919-0057",24,"BroadcastExchange",null,3.0,1208,47,true,null,null,null,false],["app-20220209231919-0057",24,"HashAggregate",null,4.5,0,6,true,"36",null,null,false],["app-20220209231919-0057",24,"BroadcastExchange",null,3.0,1214,37,true,null,null,null,false],["app-20220209231919-0057",24,"Scan parquet ",null,3.0,1472681,21,true,"35",null,null,false],["app-20220209231919-0057",24,"Sort",null,8.0,0,23,true,"36",null,null,false],["app-20220209231919-0057",24,"ReusedExchange",null,1.0,0,30,false,null,null,null,false],["app-20220209231919-0057",24,"BroadcastHashJoin",null,5.09,0,12,true,"36",null,null,false],["app-20220209231919-0057",24,"WholeStageCodegen (7)","WholeStageCodegen (7)",2.9,316,32,true,"32","Project:Filter:ColumnarToRow","33:34:35",false],["app-20220209231919-0057",6,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",10,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"ColumnarToRow",null,1.0,0,51,false,"32",null,null,true],["app-20220209231919-0057",24,"BroadcastHashJoin",null,5.09,0,8,true,"36",null,null,false],["app-20220209231919-0057",24,"Project",null,3.0,0,49,true,null,null,null,false],["app-20220209231919-0057",22,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",2,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"BroadcastExchange",null,3.0,1258,42,true,null,null,null,false],["app-20220209231919-0057",24,"Project",null,3.0,0,7,true,null,null,null,false],["app-20220209231919-0057",24,"WholeStageCodegen (9)","WholeStageCodegen (9)",4.5,84122,2,true,"37","HashAggregate","3",false],["app-20220209231919-0057",8,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",19,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"Filter",null,2.8,0,50,true,"32",null,null,false],["app-20220209231919-0057",20,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.8,4414001,18,true,"35","Filter:ColumnarToRow","19:20",false],["app-20220209231533-0050",9,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"Filter",null,2.8,0,14,true,"32",null,null,false],["app-20220209231533-0050",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",4.5,80450,2,true,"34","HashAggregate","3",false],["app-20220209231533-0050",24,"BroadcastHashJoin",null,5.09,0,10,true,"33",null,null,false],["app-20220209231533-0050",24,"BroadcastExchange",null,3.0,1432,11,true,null,null,null,false],["app-20220209231533-0050",24,"SubqueryBroadcast",null,3.0,1442,20,true,null,null,null,false],["app-20220209231533-0050",18,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"BroadcastExchange",null,3.0,1461,21,true,null,null,null,false],["app-20220209231533-0050",24,"Project",null,3.0,0,23,true,null,null,null,false],["app-20220209231533-0050",7,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",23,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"Filter",null,2.8,0,17,true,"33",null,null,false],["app-20220209231533-0050",14,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"Filter",null,2.8,0,24,true,"31",null,null,false],["app-20220209231533-0050",24,"HashAggregate",null,4.5,0,6,true,"33",null,null,false],["app-20220209231533-0050",2,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"ColumnarToRow",null,1.0,0,25,false,"31",null,null,true],["app-20220209231533-0050",6,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"Scan parquet ",null,3.0,546,16,true,"32",null,null,false],["app-20220209231533-0050",10,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"Scan parquet ",null,3.0,720290,19,true,"33",null,null,false],["app-20220209231533-0050",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",2.9,661,22,true,"31","Project:Filter:ColumnarToRow","23:24:25",false],["app-20220209231533-0050",17,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"HashAggregate",null,4.5,0,3,true,"34",null,null,false],["app-20220209231533-0050",24,"TakeOrderedAndProject",null,3.0,0,1,true,"34:35",null,null,false],["app-20220209231533-0050",19,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"ColumnarToRow",null,1.0,0,18,false,"33",null,null,true],["app-20220209231533-0050",24,"BroadcastHashJoin",null,5.09,0,8,true,"33",null,null,false],["app-20220209231533-0050",13,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",12,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"Project",null,3.0,0,13,true,null,null,null,false],["app-20220209231533-0050",21,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"ColumnarToRow",null,1.0,0,15,false,"32",null,null,true],["app-20220209231533-0050",8,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"Scan parquet ",null,3.0,652,26,true,"31",null,null,false],["app-20220209231533-0050",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",3.92,1409729,5,true,"33","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Filter:ColumnarToRow","6:7:8:9:10:17:18",false],["app-20220209231533-0050",24,"Project",null,3.0,0,9,true,null,null,null,false],["app-20220209231533-0050",4,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",16,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",22,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",15,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",20,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",1,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",0,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",5,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.9,566,12,true,"32","Project:Filter:ColumnarToRow","13:14:15",false],["app-20220209231533-0050",3,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"Execute InsertIntoHadoopFsRelationCommand parquet",null,3.0,0,0,true,null,null,null,false],["app-20220209231533-0050",24,"Project",null,3.0,0,7,true,null,null,null,false],["app-20220209231533-0050",24,"Exchange",null,4.2,11542,4,true,"33:34",null,null,false],["app-20220209231533-0050",11,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["application_1665146417445_0002",3,"WholeStageCodegen","WholeStageCodegen",3.75,0,3,true,"6","HashAggregate:Project","4:5",false],["application_1665146417445_0002",0,"CollectLimit",null,1.0,0,0,false,null,null,null,false],["application_1665146417445_0002",3,"WholeStageCodegen","WholeStageCodegen",4.5,0,0,true,"7","HashAggregate","1",false],["application_1665146417445_0002",1,"Project",null,3.0,0,1,true,null,null,null,false],["application_1665146417445_0002",0,"WholeStageCodegen","WholeStageCodegen",3.0,0,1,true,null,"Project","2",false],["application_1665146417445_0002",1,"WholeStageCodegen","WholeStageCodegen",3.0,0,0,true,"1","Project","1",false],["application_1665146417445_0002",3,"Exchange",null,4.2,0,6,true,"5",null,null,false],["application_1665146417445_0002",2,"HashAggregate",null,4.5,0,1,true,"4",null,null,false],["application_1665146417445_0002",2,"HashAggregate",null,4.5,0,6,true,"3",null,null,false],["application_1665146417445_0002",2,"HashAggregate",null,4.5,0,4,true,"3",null,null,false],["application_1665146417445_0002",1,"Scan hive ecomm_ops_tables.s0s0jzb_browse_shelf_cat_map",null,1.0,0,2,false,"1",null,null,false],["application_1665146417445_0002",2,"Scan hive ecomm_ops_tables.zzz_dart_browse_ads_prod_mod",null,1.0,0,8,false,"2",null,null,false],["application_1665146417445_0002",0,"Project",null,3.0,0,2,true,null,null,null,false],["application_1665146417445_0002",3,"HashAggregate",null,4.5,0,4,true,"6",null,null,false],["application_1665146417445_0002",3,"HashAggregate",null,4.5,0,1,true,"7",null,null,false],["application_1665146417445_0002",3,"Scan hive ecomm_ops_tables.zzz_dart_browse_ads_prod_mod",null,1.0,0,7,false,"5",null,null,false],["application_1665146417445_0002",2,"HashAggregate",null,4.5,0,5,true,"3",null,null,false],["application_1665146417445_0002",0,"Scan hive ecomm_ops_tables.zzz_dart_browse_ads_prod_mod",null,1.0,0,3,false,"0",null,null,false],["application_1665146417445_0002",2,"WholeStageCodegen","WholeStageCodegen",4.5,0,0,true,"4","HashAggregate","1",false],["application_1665146417445_0002",3,"Project",null,3.0,0,5,true,null,null,null,false],["application_1665146417445_0002",2,"Exchange",null,4.2,0,2,true,"3",null,null,false],["application_1665146417445_0002",2,"WholeStageCodegen","WholeStageCodegen",4.5,0,3,true,"3","HashAggregate:HashAggregate:HashAggregate","4:5:6",false],["application_1665146417445_0002",2,"Exchange",null,4.2,0,7,true,"2",null,null,false],["application_1665146417445_0002",3,"Exchange",null,4.2,0,2,true,"6",null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,36304,36,true,"49:50",null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,1648,96,true,"37:38",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (35)","WholeStageCodegen (35)",8.0,9740356,227,true,"52","Sort","228",false],["app-20220209230053-0028",24,"Project",null,3.0,0,155,true,null,null,null,false],["app-20220209230053-0028",4,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,204,true,null,null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,143,true,null,null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,72,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (6)","WholeStageCodegen (6)",3.43,332556,37,true,"49","Project:Filter:HashAggregate","38:39:40",false],["app-20220209230053-0028",24,"WholeStageCodegen (32)","WholeStageCodegen (32)",3.0,334418,172,true,"44","Project","173",false],["app-20220209230053-0028",24,"SubqueryBroadcast",null,3.0,1605,51,true,null,null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,4.5,0,43,true,"47",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,30,true,null,null,null,false],["app-20220209230053-0028",7,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,17,true,null,null,null,false],["app-20220209230053-0028",24,"BroadcastExchange",null,3.0,108,202,true,null,null,null,false],["app-20220209230053-0028",15,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",3,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,8779,181,true,"41",null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,62,true,"33",null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,224,false,"52",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",8.0,570738,19,true,"50","Sort","20",false],["app-20220209230053-0028",24,"Project",null,3.0,0,225,true,null,null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,223,false,"52",null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,309,177,true,"41:44",null,null,false],["app-20220209230053-0028",24,"TakeOrderedAndProject",null,3.0,0,1,true,"53:54",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (15)","WholeStageCodegen (15)",2.8,21724,137,true,"45","Filter:ColumnarToRow","138:139",false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,12,true,"51",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (23)","WholeStageCodegen (23)",6.96,29347,6,true,"51","HashAggregate:Project:BroadcastHashJoin:Project:SortMergeJoin","7:8:9:10:11",false],["app-20220209230053-0028",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",2.8,2258,215,true,"32","Filter:ColumnarToRow","216:217",false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,241,true,"52",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,228,true,"52",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,236,true,null,null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,189,true,"42",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,287,33,true,"31",null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,157,false,"31",null,null,true],["app-20220209230053-0028",24,"HashAggregate",null,4.5,0,193,true,"40",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,46,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.8,15333,22,true,"48","Filter:ColumnarToRow","23:24",false],["app-20220209230053-0028",6,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",12,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (42)","WholeStageCodegen (42)",8.0,7107509,242,true,"52","Sort","243",false],["app-20220209230053-0028",24,"Sort",null,8.0,0,233,true,"52",null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,49,false,"47",null,null,true],["app-20220209230053-0028",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",8.0,7271900,120,true,"37","Sort","121",false],["app-20220209230053-0028",24,"Filter",null,2.8,0,48,true,"47",null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,8368,15,true,"50:51",null,null,false],["app-20220209230053-0028",24,"BroadcastExchange",null,3.0,1206,127,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (26)","WholeStageCodegen (26)",8.0,616179,175,true,"44","Sort","176",false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,163,false,"52",null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,239,false,"52",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,235,true,"52",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (21)","WholeStageCodegen (21)",5.67,1192790,141,true,"51","Sort:Project:Filter:HashAggregate:HashAggregate:Project:SortMergeJoin","142:143:144:145:146:147:148",false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,226,true,"52",null,null,false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,104,true,"37",null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,118,false,"34",null,null,true],["app-20220209230053-0028",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.9,548,60,true,"33","Project:Filter:ColumnarToRow","61:62:63",false],["app-20220209230053-0028",24,"BroadcastHashJoin",null,5.09,0,165,true,"52",null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,67,true,"32",null,null,false],["app-20220209230053-0028",24,"BroadcastExchange",null,3.0,1152,28,true,null,null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,146,false,"51",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,20,true,"50",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.9,48,203,true,"39","Project:Filter:ColumnarToRow","204:205:206",false],["app-20220209230053-0028",24,"Exchange",null,4.2,106,5,true,"51:53",null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,6954,171,true,"44:52",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,2038,69,true,"32",null,null,false],["app-20220209230053-0028",24,"BroadcastExchange",null,3.0,1925,214,true,null,null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,173,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (47)","WholeStageCodegen (47)",6.96,58082,162,true,"52","HashAggregate:Project:BroadcastHashJoin:Project:SortMergeJoin","163:164:165:166:167",false],["app-20220209230053-0028",24,"WholeStageCodegen (13)","WholeStageCodegen (13)",8.0,7684689,86,true,"51","Sort","87",false],["app-20220209230053-0028",24,"Sort",null,8.0,0,176,true,"44",null,null,false],["app-20220209230053-0028",11,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,4.5,0,190,true,"42",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,152,true,"51",null,null,false],["app-20220209230053-0028",24,"BroadcastExchange",null,3.0,1596,53,true,null,null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,55,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",3.92,4787686,192,true,"40","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Filter:ColumnarToRow","193:194:195:196:197:198:199",false],["app-20220209230053-0028",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",2.9,341,115,true,"34","Project:Filter:ColumnarToRow","116:117:118",false],["app-20220209230053-0028",24,"Project",null,3.0,0,221,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (38)","WholeStageCodegen (38)",5.67,15748975,219,true,"52","Sort:Project:Filter:HashAggregate:HashAggregate:Project:SortMergeJoin","220:221:222:223:224:225:226",false],["app-20220209230053-0028",2,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",9,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,167,true,"52",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (10)","WholeStageCodegen (10)",2.9,1629090,81,true,"46","Project:Filter:ColumnarToRow","82:83:84",false],["app-20220209230053-0028",24,"Filter",null,2.8,0,31,true,"31",null,null,false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,133,true,"51",null,null,false],["app-20220209230053-0028",8,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,2038,218,true,"32",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (8)","WholeStageCodegen (8)",3.0,317013,16,true,"50","Project","17",false],["app-20220209230053-0028",10,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"BroadcastHashJoin",null,5.09,0,102,true,"37",null,null,false],["app-20220209230053-0028",24,"Union",null,3.0,0,2,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (45)","WholeStageCodegen (45)",5.67,579620,234,true,"52","Sort:Project:Filter:HashAggregate:HashAggregate:Project:SortMergeJoin","235:236:237:238:239:240:241",false],["app-20220209230053-0028",24,"HashAggregate",null,4.5,0,95,true,"38",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,230,true,"52",null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,57306,107,true,"35:37",null,null,false],["app-20220209230053-0028",1,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"BroadcastExchange",null,3.0,1152,153,true,null,null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,75,false,"51",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,525,64,true,"33",null,null,false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,231,true,"52",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,142,true,"51",null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,212,false,"33",null,null,true],["app-20220209230053-0028",24,"BroadcastExchange",null,3.0,1596,208,true,null,null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,210,true,null,null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,91,false,"43",null,null,true],["app-20220209230053-0028",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",2.8,2258,66,true,"32","Filter:ColumnarToRow","67:68",false],["app-20220209230053-0028",24,"Filter",null,2.8,0,179,true,"41",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,79,true,"51",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,1128383,111,true,"35",null,null,false],["app-20220209230053-0028",24,"Filter",null,1.0,0,73,false,"51",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",2.9,341,128,true,"34","Project:Filter:ColumnarToRow","129:130:131",false],["app-20220209230053-0028",24,"Sort",null,8.0,0,245,true,"52",null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,24,false,"48",null,null,true],["app-20220209230053-0028",24,"BroadcastHashJoin",null,5.09,0,195,true,"40",null,null,false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,18,true,"50",null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,4,false,"53",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,196,true,null,null,null,false],["app-20220209230053-0028",24,"SubqueryBroadcast",null,3.0,1212,112,true,null,null,null,false],["app-20220209230053-0028",24,"Filter",null,1.0,0,144,false,"51",null,null,false],["app-20220209230053-0028",23,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,374,136,true,"45:52:51",null,null,false],["app-20220209230053-0028",17,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,4.5,0,98,true,"37",null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,216,true,"32",null,null,false],["app-20220209230053-0028",24,"Execute InsertIntoHadoopFsRelationCommand parquet",null,3.0,0,0,true,null,null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,74225,80,true,"46:52:51",null,null,false],["app-20220209230053-0028",24,"BroadcastExchange",null,3.0,1596,59,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (7)","WholeStageCodegen (7)",8.0,265322,34,true,"50","Sort","35",false],["app-20220209230053-0028",24,"Exchange",null,4.2,64,161,true,"52:53",null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,84,false,"46",null,null,true],["app-20220209230053-0028",24,"Project",null,3.0,0,166,true,null,null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,138,true,"45",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,76,true,null,null,null,false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,148,true,"51",null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,36854,186,true,"42:44",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.8,3141204,108,true,"35","Filter:ColumnarToRow","109:110",false],["app-20220209230053-0028",13,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,168,true,"52",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (11)","WholeStageCodegen (11)",8.0,7736910,78,true,"51","Sort","79",false],["app-20220209230053-0028",24,"ReusedExchange",null,1.0,0,27,false,null,null,null,false],["app-20220209230053-0028",24,"SubqueryBroadcast",null,3.0,1183,26,true,null,null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,125,false,"36",null,null,true],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,20580,126,true,"36",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,525,213,true,"33",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (48)","WholeStageCodegen (48)",1.0,3979,159,false,"53","HashAggregate","160",false],["app-20220209230053-0028",24,"Sort",null,8.0,0,106,true,"37",null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,205,true,"39",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,8,true,null,null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,7,false,"51",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (14)","WholeStageCodegen (14)",5.67,13085436,70,true,"51","Sort:Project:Filter:HashAggregate:HashAggregate:Project:SortMergeJoin","71:72:73:74:75:76:77",false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,145,false,"51",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,129,true,null,null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,110,false,"35",null,null,true],["app-20220209230053-0028",24,"WholeStageCodegen (33)","WholeStageCodegen (33)",8.0,1156186,169,true,"52","Sort","170",false],["app-20220209230053-0028",24,"Exchange",null,4.2,34850,41,true,"47:49",null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,32,false,"31",null,null,true],["app-20220209230053-0028",24,"Filter",null,2.8,0,124,true,"36",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,10,true,null,null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,238,false,"52",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,101,true,null,null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,71,true,"51",null,null,false],["app-20220209230053-0028",24,"BroadcastExchange",null,3.0,1925,65,true,null,null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,23,true,"48",null,null,false],["app-20220209230053-0028",18,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"SubqueryBroadcast",null,3.0,1183,182,true,null,null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,170,true,"52",null,null,false],["app-20220209230053-0028",24,"BroadcastHashJoin",null,5.09,0,45,true,"47",null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,180,false,"41",null,null,true],["app-20220209230053-0028",24,"HashAggregate",null,4.5,0,40,true,"49",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,73193,50,true,"47",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (40)","WholeStageCodegen (40)",8.0,0,232,true,"52","Sort","233",false],["app-20220209230053-0028",16,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,198,true,"40",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,7362,25,true,"48",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,240,true,null,null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,211,true,"33",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,121,true,"37",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (18)","WholeStageCodegen (18)",8.0,5641193,149,true,"51","Sort","150",false],["app-20220209230053-0028",24,"Filter",null,2.8,0,117,true,"34",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (22)","WholeStageCodegen (22)",2.9,305,154,true,"31","Project:Filter:ColumnarToRow","155:156:157",false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,11173,140,true,"45",null,null,false],["app-20220209230053-0028",24,"BroadcastExchange",null,3.0,1206,114,true,null,null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,68,false,"32",null,null,true],["app-20220209230053-0028",24,"Filter",null,2.8,0,156,true,"31",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,525,58,true,"33",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,220,true,"52",null,null,false],["app-20220209230053-0028",21,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,174,true,"44",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,361088,85,true,"46",null,null,false],["app-20220209230053-0028",14,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (9)","WholeStageCodegen (9)",8.0,319031,13,true,"51","Sort","14",false],["app-20220209230053-0028",24,"Sort",null,8.0,0,35,true,"50",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,87,true,"51",null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,99,false,"37",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,9723,92,true,"43",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (6)","WholeStageCodegen (6)",5.76,7077480,97,true,"37","HashAggregate:HashAggregate:HashAggregate:Project:BroadcastHashJoin:Project:SortMergeJoin","98:99:100:101:102:103:104",false],["app-20220209230053-0028",24,"WholeStageCodegen (22)","WholeStageCodegen (22)",2.9,305,29,true,"31","Project:Filter:ColumnarToRow","30:31:32",false],["app-20220209230053-0028",24,"BroadcastHashJoin",null,5.09,0,47,true,"47",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,188,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (12)","WholeStageCodegen (12)",2.8,14372,89,true,"43","Filter:ColumnarToRow","90:91",false],["app-20220209230053-0028",24,"SubqueryBroadcast",null,3.0,108,201,true,null,null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,82,true,null,null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,217,false,"32",null,null,true],["app-20220209230053-0028",24,"Filter",null,1.0,0,222,false,"52",null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,130,true,"34",null,null,false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,11,true,"51",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,116,true,null,null,null,false],["app-20220209230053-0028",24,"ReusedExchange",null,1.0,0,52,false,null,null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,39,true,"49",null,null,false],["app-20220209230053-0028",5,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,194,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.8,27817,123,true,"36","Filter:ColumnarToRow","124:125",false],["app-20220209230053-0028",24,"Filter",null,2.8,0,83,true,"46",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,164,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",8.0,7610479,105,true,"37","Sort","106",false],["app-20220209230053-0028",24,"Exchange",null,4.2,24920,191,true,"40:42",null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,109,true,"35",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,103,true,null,null,null,false],["app-20220209230053-0028",20,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Filter",null,1.0,0,237,false,"52",null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,57,false,"33",null,null,true],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,139,false,"45",null,null,true],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,131,false,"34",null,null,true],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,63,false,"33",null,null,true],["app-20220209230053-0028",24,"WholeStageCodegen (25)","WholeStageCodegen (25)",2.8,15032,178,true,"41","Filter:ColumnarToRow","179:180",false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,206,false,"39",null,null,true],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,77,true,"51",null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,124,122,true,"36:37",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (37)","WholeStageCodegen (37)",8.0,9684161,229,true,"52","Sort","230",false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,199,false,"40",null,null,true],["app-20220209230053-0028",24,"Sort",null,8.0,0,150,true,"51",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,147,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (24)","WholeStageCodegen (24)",1.0,15386,3,false,"53","HashAggregate","4",false],["app-20220209230053-0028",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.9,548,209,true,"33","Project:Filter:ColumnarToRow","210:211:212",false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,287,158,true,"31",null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,74,false,"51",null,null,false],["app-20220209230053-0028",24,"ReusedExchange",null,1.0,0,113,false,null,null,null,false],["app-20220209230053-0028",24,"Subquery",null,1.0,0,93,false,null,null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,152,88,true,"43:52:51",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,135,true,"51",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,38,true,null,null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,160,false,"53",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,324,132,true,"34",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (20)","WholeStageCodegen (20)",8.0,5632344,151,true,"51","Sort","152",false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,104034,200,true,"40",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (31)","WholeStageCodegen (31)",8.0,280275,183,true,"44","Sort","184",false],["app-20220209230053-0028",24,"Exchange",null,4.2,819,21,true,"48:50",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.9,548,54,true,"33","Project:Filter:ColumnarToRow","55:56:57",false],["app-20220209230053-0028",24,"WholeStageCodegen (7)","WholeStageCodegen (7)",4.5,9,94,true,"38","HashAggregate","95",false],["app-20220209230053-0028",0,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,90,true,"43",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,31,207,true,"39",null,null,false],["app-20220209230053-0028",24,"ReusedExchange",null,1.0,0,185,false,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",3.92,4849898,42,true,"47","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Filter:ColumnarToRow","43:44:45:46:47:48:49",false],["app-20220209230053-0028",24,"Sort",null,8.0,0,243,true,"52",null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,100,false,"37",null,null,false],["app-20220209230053-0028",24,"BroadcastHashJoin",null,5.09,0,197,true,"40",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (6)","WholeStageCodegen (6)",3.43,329696,187,true,"42","Project:Filter:HashAggregate","188:189:190",false],["app-20220209230053-0028",24,"Sort",null,8.0,0,184,true,"44",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,324,119,true,"34",null,null,false],["app-20220209230053-0028",22,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,56,true,"33",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,14,true,"51",null,null,false],["app-20220209230053-0028",24,"BroadcastHashJoin",null,5.09,0,9,true,"51",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,61,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (16)","WholeStageCodegen (16)",8.0,0,134,true,"51","Sort","135",false],["app-20220209230053-0028",19,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,44,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (44)","WholeStageCodegen (44)",8.0,7091464,244,true,"52","Sort","245",false],["app-20220209230750-0036",24,"WholeStageCodegen (19)","WholeStageCodegen (19)",2.8,113485,82,true,"40","Filter:ColumnarToRow","83:84",false],["app-20220209230750-0036",24,"Project",null,3.0,0,5,true,null,null,null,false],["app-20220209230750-0036",24,"SortMergeJoin",null,22.7,0,23,true,"37",null,null,false],["app-20220209230750-0036",24,"ColumnarToRow",null,1.0,0,39,false,"32",null,null,true],["app-20220209230750-0036",24,"HashAggregate",null,4.5,0,57,true,"41",null,null,false],["app-20220209230750-0036",24,"ColumnarToRow",null,1.0,0,90,false,"31",null,null,true],["app-20220209230750-0036",24,"Filter",null,2.8,0,17,true,"38",null,null,false],["app-20220209230750-0036",24,"Scan parquet ",null,3.0,9398,53,true,"33",null,null,false],["app-20220209230750-0036",24,"Scan parquet ",null,3.0,8927,91,true,"31",null,null,false],["app-20220209230750-0036",24,"ReusedExchange",null,1.0,0,34,false,null,null,null,false],["app-20220209230750-0036",24,"BroadcastHashJoin",null,5.09,0,4,true,"42",null,null,false],["app-20220209230750-0036",24,"BroadcastExchange",null,3.0,1494,35,true,null,null,null,false],["app-20220209230750-0036",14,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230750-0036",24,"Sort",null,8.0,0,55,true,"41",null,null,false],["app-20220209230750-0036",24,"Project",null,3.0,0,71,true,null,null,null,false],["app-20220209230750-0036",24,"WholeStageCodegen (11)","WholeStageCodegen (11)",8.0,625159,67,true,"35","Sort","68",false],["app-20220209230750-0036",24,"Scan parquet ",null,3.0,62819,85,true,"40",null,null,false],["app-20220209230750-0036",11,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230750-0036",24,"WholeStageCodegen (6)","WholeStageCodegen (6)",10.07,1910905,20,true,"37","HashAggregate:Project:SortMergeJoin","21:22:23",false],["app-20220209230750-0036",24,"Filter",null,1.0,0,56,false,"41",null,null,false],["app-20220209230750-0036",24,"SortMergeJoin",null,22.7,0,66,true,"35",null,null,false],["app-20220209230750-0036",24,"Sort",null,8.0,0,14,true,"41",null,null,false],["app-20220209230750-0036",24,"HashAggregate",null,4.5,0,61,true,"39",null,null,false],["app-20220209230750-0036",24,"Sort",null,8.0,0,25,true,"37",null,null,false],["app-20220209230750-0036",24,"Sort",null,8.0,0,8,true,"42",null,null,false],["app-20220209230750-0036",3,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230750-0036",24,"WholeStageCodegen (14)","WholeStageCodegen (14)",10.07,541305,63,true,"35","HashAggregate:Project:SortMergeJoin","64:65:66",false],["app-20220209230750-0036",24,"Project",null,3.0,0,22,true,null,null,null,false],["app-20220209230750-0036",24,"ColumnarToRow",null,1.0,0,52,false,"33",null,null,true],["app-20220209230750-0036",24,"WholeStageCodegen (7)","WholeStageCodegen (7)",3.65,356825,16,true,"38","Filter:HashAggregate","17:18",false],["app-20220209230750-0036",24,"Filter",null,2.8,0,89,true,"31",null,null,false],["app-20220209230750-0036",15,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230750-0036",5,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230750-0036",16,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230750-0036",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",3.63,404429,27,true,"36","Project:BroadcastHashJoin:Filter:ColumnarToRow","28:29:30:31",false],["app-20220209230750-0036",24,"BroadcastExchange",null,3.0,1494,41,true,null,null,null,false],["app-20220209230750-0036",24,"Project",null,3.0,0,65,true,null,null,null,false],["app-20220209230750-0036",24,"HashAggregate",null,4.5,0,21,true,"37",null,null,false],["app-20220209230750-0036",2,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230750-0036",24,"Project",null,3.0,0,37,true,null,null,null,false],["app-20220209230750-0036",4,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230750-0036",7,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230750-0036",24,"WholeStageCodegen (18)","WholeStageCodegen (18)",8.0,438264,7,true,"42","Sort","8",false],["app-20220209230750-0036",0,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230750-0036",24,"Exchange",null,4.2,91525,69,true,"34:35",null,null,false],["app-20220209230750-0036",24,"HashAggregate",null,4.5,0,64,true,"35",null,null,false],["app-20220209230750-0036",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",8.0,1769290,47,true,"37","Sort","48",false]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"App ID","type":"\"string\"","metadata":"{}"},{"name":"SQL ID","type":"\"long\"","metadata":"{}"},{"name":"Exec Name","type":"\"string\"","metadata":"{}"},{"name":"Expression Name","type":"\"string\"","metadata":"{}"},{"name":"Task Speedup Factor","type":"\"double\"","metadata":"{}"},{"name":"Exec Duration","type":"\"long\"","metadata":"{}"},{"name":"SQL Node Id","type":"\"long\"","metadata":"{}"},{"name":"Exec Is Supported","type":"\"boolean\"","metadata":"{}"},{"name":"Exec Stages","type":"\"string\"","metadata":"{}"},{"name":"Exec Children","type":"\"string\"","metadata":"{}"},{"name":"Exec Children Node Ids","type":"\"string\"","metadata":"{}"},{"name":"Exec Should Remove","type":"\"boolean\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
App IDSQL IDExec NameExpression NameTask Speedup FactorExec DurationSQL Node IdExec Is SupportedExec StagesExec ChildrenExec Children Node IdsExec Should Remove
app-20220209224509-000824ColumnarToRownull1.0030false31nullnulltrue
app-20220209224509-000824ColumnarToRownull1.0089false39nullnulltrue
app-20220209224509-000824WholeStageCodegen (15)WholeStageCodegen (15)8.0423405095true39Sort96false
app-20220209224509-000824Exchangenull4.258497true36:39nullnullfalse
app-20220209224509-00080Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (8)WholeStageCodegen (8)2.92305965true37Project:Filter:ColumnarToRow66:67:68false
app-20220209224509-000824Unionnull3.0085truenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (22)WholeStageCodegen (22)4.51883976true40HashAggregate77false
app-20220209224509-000824Projectnull3.0060truenullnullnullfalse
app-20220209224509-000824Exchangenull4.280029104true35:39nullnullfalse
app-20220209224509-000824Projectnull3.0040truenullnullnullfalse
app-20220209224509-000824Projectnull3.0054truenullnullnullfalse
app-20220209224509-000824Projectnull3.0081truenullnullnullfalse
app-20220209224509-000824Scan parquet null3.0536114true34nullnullfalse
app-20220209224509-000824WholeStageCodegen (6)WholeStageCodegen (6)4.51879889true40HashAggregate10false
app-20220209224509-000824Projectnull3.0056truenullnullnullfalse
app-20220209224509-000824SubqueryBroadcastnull3.0173670truenullnullnullfalse
app-20220209224509-000814Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824Projectnull3.0033truenullnullnullfalse
app-20220209224509-000824HashAggregatenull4.5077true40nullnullfalse
app-20220209224509-000824Scan parquet null3.0750661109true35nullnullfalse
app-20220209224509-000824HashAggregatenull4.506true40nullnullfalse
app-20220209224509-000824Projectnull3.0087truenullnullnullfalse
app-20220209224509-000810Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824ColumnarToRownull1.0035false38nullnulltrue
app-20220209224509-000824BroadcastExchangenull3.0171238truenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (5)WholeStageCodegen (5)4.1331502612true38HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin13:14:15:16:17false
app-20220209224509-000824ColumnarToRownull1.00113false34nullnulltrue
app-20220209224509-000824ColumnarToRownull1.0042false31nullnulltrue
app-20220209224509-000822Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (3)WholeStageCodegen (3)2.976027true31Project:Filter:ColumnarToRow28:29:30false
app-20220209224509-00081Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824BroadcastExchangenull3.0156771truenullnullnullfalse
app-20220209224509-000824ColumnarToRownull1.0062false37nullnulltrue
app-20220209224509-000824WholeStageCodegen (13)WholeStageCodegen (13)2.91705586true39Project:Filter:ColumnarToRow87:88:89false
app-20220209224509-000824Scan parquet null3.028348true32nullnullfalse
app-20220209224509-000824Sortnull8.00103true39nullnullfalse
app-20220209224509-000823Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824Projectnull3.00106truenullnullnullfalse
app-20220209224509-000824ColumnarToRownull1.0022false38nullnulltrue
app-20220209224509-000824Unionnull3.008truenullnullnullfalse
app-20220209224509-000812Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824HashAggregatenull4.5010true40nullnullfalse
app-20220209224509-000824Filternull2.8073true33nullnullfalse
app-20220209224509-000824BroadcastExchangenull3.01537110truenullnullnullfalse
app-20220209224509-000824SortMergeJoinnull22.7094true39nullnullfalse
app-20220209224509-000824Projectnull3.0014truenullnullnullfalse
app-20220209224509-000824SubqueryBroadcastnull3.01736101truenullnullnullfalse
app-20220209224509-000824BroadcastExchangenull3.0112844truenullnullnullfalse
app-20220209224509-000816Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824Filternull2.8061true37nullnullfalse
app-20220209224509-000824WholeStageCodegen (16)WholeStageCodegen (16)2.91506623105true35Project:Filter:ColumnarToRow106:107:108false
app-20220209224509-000824Filternull2.8034true38nullnullfalse
app-20220209224509-000824Execute InsertIntoHadoopFsRelationCommand parquetnull3.000truenullnullnullfalse
app-20220209224509-00085Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (20)WholeStageCodegen (20)2.8540111true34Filter:ColumnarToRow112:113false
app-20220209224509-000824SubqueryBroadcastnull3.0173637truenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (14)WholeStageCodegen (14)1.0409098false36ColumnarToRow99false
app-20220209224509-00089Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824Scan parquet null3.01245469true37nullnullfalse
app-20220209224509-00086Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824ColumnarToRownull1.0068false37nullnulltrue
app-20220209224509-000824Filternull2.8021true38nullnullfalse
app-20220209224509-000824TakeOrderedAndProjectnull3.001true41:42nullnullfalse
app-20220209224509-000824BroadcastHashJoinnull5.09015true38nullnullfalse
app-20220209224509-000824BroadcastHashJoinnull5.09057true37nullnullfalse
app-20220209224509-000824Unionnull3.0018truenullnullnullfalse
app-20220209224509-00082Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (7)WholeStageCodegen (7)2.924709959true37Project:Filter:ColumnarToRow60:61:62false
app-20220209224509-00087Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000819Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-00084Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (21)WholeStageCodegen (21)4.13323042579true39HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin80:81:82:83:84false
app-20220209224509-000824Exchangenull4.276878true39:40nullnullfalse
app-20220209224509-000824Scan parquet null3.017303523true38nullnullfalse
app-20220209224509-000815Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824ColumnarToRownull1.0047false32nullnulltrue
app-20220209224509-000824BroadcastHashJoinnull5.09082true39nullnullfalse
app-20220209224509-000824Projectnull3.0066truenullnullnullfalse
app-20220209224509-000824SubqueryBroadcastnull3.0173691truenullnullnullfalse
app-20220209224509-000824BroadcastHashJoinnull5.09084true39nullnullfalse
app-20220209224509-000824Scan parquet null3.01956236true38nullnullfalse
app-20220209224509-000824Scan parquet null3.051575true33nullnullfalse
app-20220209224509-000824Exchangenull4.22064true40:41nullnullfalse
app-20220209224509-000824Projectnull3.0020truenullnullnullfalse
app-20220209224509-000824HashAggregatenull4.5013true38nullnullfalse
app-20220209224509-000824BroadcastHashJoinnull5.09055true37nullnullfalse
app-20220209224509-000824WholeStageCodegen (24)WholeStageCodegen (24)4.5308342true41HashAggregate3false
app-20220209224509-000824Unionnull3.0058truenullnullnullfalse
app-20220209224509-000824Filternull2.8029true31nullnullfalse
app-20220209224509-000824WholeStageCodegen (12)WholeStageCodegen (12)4.53468649true40HashAggregate50false
app-20220209224509-000824HashAggregatenull4.5050true40nullnullfalse
app-20220209224509-000824SubqueryBroadcastnull3.0173664truenullnullnullfalse
app-20220209224509-000824Exchangenull4.2442551true37:40nullnullfalse
app-20220209224509-000813Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824Filternull2.8088true39nullnullfalse
app-20220209224509-000824Filternull2.8046true32nullnullfalse
app-20220209224509-000824Scan parquet null3.074331true31nullnullfalse
app-20220209224509-000824Scan parquet null3.02399100true36nullnullfalse
app-20220209224509-000824WholeStageCodegen (4)WholeStageCodegen (4)2.829145true32Filter:ColumnarToRow46:47false
app-20220209224509-000824Filternull2.8041true31nullnullfalse
app-20220209224509-000824BroadcastHashJoinnull5.09017true38nullnullfalse
app-20220209224509-000824Projectnull3.0093truenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (1)WholeStageCodegen (1)2.932567319true38Project:Filter:ColumnarToRow20:21:22false
app-20220209224509-000824Expandnull3.007true40nullnullfalse
app-20220209224509-000824Exchangenull4.2617911true38:40nullnullfalse
app-20220209224509-000824Projectnull3.0028truenullnullnullfalse
app-20220209224509-000824Projectnull3.0016truenullnullnullfalse
app-20220209224509-000824Filternull2.8067true37nullnullfalse
app-20220209224509-000824ColumnarToRownull1.00108false35nullnulltrue
app-20220209224509-000824Filternull2.80107true35nullnullfalse
app-20220209224509-000824SubqueryBroadcastnull3.0173624truenullnullnullfalse
app-20220209224509-000824Filternull2.80112true34nullnullfalse
app-20220209224509-000824Projectnull3.0083truenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (11)WholeStageCodegen (11)4.1323510952true37HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin53:54:55:56:57false
app-20220209224509-000824Scan parquet null3.013214963true37nullnullfalse
app-20220209224509-000820Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000817Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-00083Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000818Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (3)WholeStageCodegen (3)2.976039true31Project:Filter:ColumnarToRow40:41:42false
app-20220209224509-000824ColumnarToRownull1.0099false36nullnulltrue
app-20220209224509-00088Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (10)WholeStageCodegen (10)2.853872true33Filter:ColumnarToRow73:74false
app-20220209224509-000824WholeStageCodegen (2)WholeStageCodegen (2)2.93627532true38Project:Filter:ColumnarToRow33:34:35false
app-20220209224509-000824HashAggregatenull4.5053true37nullnullfalse
app-20220209224509-000824HashAggregatenull4.503true41nullnullfalse
app-20220209224509-000821Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (23)WholeStageCodegen (23)3.752011495true40HashAggregate:Expand6:7false
app-20220209224509-000824BroadcastExchangenull3.0171226truenullnullnullfalse
app-20220209224509-000811Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (18)WholeStageCodegen (18)12.85337652992true39Project:SortMergeJoin93:94false
app-20220209224509-000824WholeStageCodegen (17)WholeStageCodegen (17)8.00102true39Sort103false
app-20220209224509-000824HashAggregatenull4.5080true39nullnullfalse
app-20220209224509-000824ReusedExchangenull1.0025falsenullnullnullfalse
app-20220209224509-000824ColumnarToRownull1.0074false33nullnulltrue
app-20220209224509-000824Scan parquet null3.0864890true39nullnullfalse
app-20220209224509-000824Sortnull8.0096true39nullnullfalse
app-20220209224509-000824Scan parquet null3.074343true31nullnullfalse
app-20220209235114-009724Projectnull3.0035truenullnullnullfalse
app-20220209235114-009724Filternull2.8052true36nullnullfalse
app-20220209235114-009724Projectnull3.0049truenullnullnullfalse
app-20220209235114-009724Projectnull3.0023truenullnullnullfalse
app-20220209235114-009717Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724BroadcastHashJoinnull5.09016true35nullnullfalse
app-20220209235114-009724Projectnull3.0013truenullnullnullfalse
app-20220209235114-00979Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724Scan parquet null3.091360520true35nullnullfalse
app-20220209235114-009724Exchangenull4.296942true36:38nullnullfalse
app-20220209235114-009724Scan parquet null3.051138true33nullnullfalse
app-20220209235114-009724BroadcastHashJoinnull5.09046true36nullnullfalse
app-20220209235114-009724Projectnull3.0015truenullnullnullfalse
app-20220209235114-009724WholeStageCodegen (6)WholeStageCodegen (6)3.8441805343true36HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:Filter:ColumnarToRow44:45:46:47:48:49:50:51:52:53false
app-20220209235114-009724HashAggregatenull4.507true40nullnullfalse
app-20220209235114-009724BroadcastExchangenull3.0140155truenullnullnullfalse
app-20220209235114-009724Execute InsertIntoHadoopFsRelationCommand parquetnull3.000truenullnullnullfalse
app-20220209235114-009721Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009720Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724Projectnull3.0017truenullnullnullfalse
app-20220209235114-009724Projectnull3.0057truenullnullnullfalse
app-20220209235114-009714Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724Projectnull3.0047truenullnullnullfalse
app-20220209235114-00973Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009722Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724WholeStageCodegen (8)WholeStageCodegen (8)4.51726true40HashAggregate7false
app-20220209235114-00978Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724TakeOrderedAndProjectnull3.002true40:41nullnullfalse
app-20220209235114-009724Filternull2.8036true33nullnullfalse
app-20220209235114-009724HashAggregatenull4.5044true36nullnullfalse
app-20220209235114-009724Scan parquet null3.050860true34nullnullfalse
app-20220209235114-009724WholeStageCodegen (7)WholeStageCodegen (7)4.54240true38HashAggregate41false
app-20220209235114-009724Projectnull3.004truenullnullnullfalse
app-20220209235114-009713Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724WholeStageCodegen (5)WholeStageCodegen (5)3.8414436929true35HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:Filter:ColumnarToRow10:11:12:13:14:15:16:17:18:19false
app-20220209235114-009723Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724Projectnull3.0045truenullnullnullfalse
app-20220209235114-009724WholeStageCodegen (1)WholeStageCodegen (1)2.951922true31Project:Filter:ColumnarToRow23:24:25false
app-20220209235114-009724Projectnull3.0011truenullnullnullfalse
app-20220209235114-009724Filternull2.8024true31nullnullfalse
app-20220209235114-009724AdaptiveSparkPlannull1.001falsenullnullnullfalse
app-20220209235114-009724ColumnarToRownull1.0031false32nullnulltrue
app-20220209235114-009724BroadcastHashJoinnull5.09014true35nullnullfalse
app-20220209235114-009724WholeStageCodegen (3)WholeStageCodegen (3)2.951534true33Project:Filter:ColumnarToRow35:36:37false
app-20220209235114-009724HashAggregatenull4.5041true38nullnullfalse
app-20220209235114-00974Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724Projectnull3.0029truenullnullnullfalse
app-20220209235114-009724WholeStageCodegen (9)WholeStageCodegen (9)3.0963true40Project4false
app-20220209235114-00977Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009712Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724Filternull2.8058true34nullnullfalse
app-20220209235114-009715Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009716Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-00971Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724BroadcastHashJoinnull5.09050true36nullnullfalse
app-20220209235114-009719Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-00975Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724BroadcastHashJoinnull5.09048true36nullnullfalse
app-20220209235114-009724BroadcastNestedLoopJoinnull3.005true40nullnullfalse
app-20220209235114-009724BroadcastExchangenull3.0133133truenullnullnullfalse
app-20220209235114-009724Exchangenull4.225398true35:40nullnullfalse
app-20220209235114-009724BroadcastHashJoinnull5.09012true35nullnullfalse
app-20220209235114-009724ColumnarToRownull1.0019false35nullnulltrue
app-20220209235114-009724Scan parquet null3.029832true32nullnullfalse
app-20220209235114-009724BroadcastExchangenull3.0149021truenullnullnullfalse
app-20220209235114-009711Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-00970Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724BroadcastExchangenull3.0117527truenullnullnullfalse
app-20220209235114-009724ColumnarToRownull1.0037false33nullnulltrue
app-20220209235114-009724Projectnull3.0051truenullnullnullfalse
app-20220209235114-009724ColumnarToRownull1.0053false36nullnulltrue
app-20220209235114-009724Scan parquet null3.051226true31nullnullfalse
app-20220209235114-009724ColumnarToRownull1.0059false34nullnulltrue
app-20220209235114-009724WholeStageCodegen (4)WholeStageCodegen (4)2.953256true34Project:Filter:ColumnarToRow57:58:59false
app-20220209235114-009718Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009710Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724Filternull2.8030true32nullnullfalse
app-20220209235114-00972Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724Scan parquet null3.018709354true36nullnullfalse
app-20220209235114-009724BroadcastExchangenull3.031539truenullnullnullfalse
app-20220209235114-00976Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724WholeStageCodegen (2)WholeStageCodegen (2)2.931728true32Project:Filter:ColumnarToRow29:30:31false
app-20220209235114-009724Filternull2.8018true35nullnullfalse
app-20220209235114-009724ColumnarToRownull1.0025false31nullnulltrue
app-20220209235114-009724HashAggregatenull4.5010true35nullnullfalse
app-20220209230506-003124BroadcastExchangenull3.0170449truenullnullnullfalse
app-20220209230506-003124Exchangenull4.294true39:40nullnullfalse
app-20220209230506-003124WholeStageCodegen (10)WholeStageCodegen (10)2.963570true31Project:Filter:ColumnarToRow71:72:73false
app-20220209230506-003124WholeStageCodegen (13)WholeStageCodegen (13)2.8451381true32Filter:ColumnarToRow82:83false
app-20220209230506-003111Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Projectnull3.009truenullnullnullfalse
app-20220209230506-003124BroadcastExchangenull3.0170469truenullnullnullfalse
app-20220209230506-003124Projectnull3.0023truenullnullnullfalse
app-20220209230506-003124WholeStageCodegen (8)WholeStageCodegen (8)8.03521355true39Sort56false
app-20220209230506-003124WholeStageCodegen (7)WholeStageCodegen (7)2.888475758true37Filter:ColumnarToRow59:60false
app-20220209230506-003118Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Exchangenull4.2611942true36:38nullnullfalse
app-20220209230506-003113Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124WholeStageCodegen (12)WholeStageCodegen (12)2.881776true33Filter:ColumnarToRow77:78false
app-20220209230506-003124Filternull2.8052true31nullnullfalse
app-20220209230506-003124WholeStageCodegen (15)WholeStageCodegen (15)4.5334762true40HashAggregate3false
app-20220209230506-003124WholeStageCodegen (3)WholeStageCodegen (3)2.814564643true36Filter:ColumnarToRow44:45false
app-20220209230506-003124HashAggregatenull4.503true40nullnullfalse
app-20220209230506-003124Filternull2.8077true33nullnullfalse
app-20220209230506-003124Sortnull8.0020true39nullnullfalse
app-20220209230506-003124Projectnull3.0036truenullnullnullfalse
app-20220209230506-003124Sortnull8.0026true38nullnullfalse
app-20220209230506-003122Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124ColumnarToRownull1.0053false31nullnulltrue
app-20220209230506-003124Projectnull3.0015truenullnullnullfalse
app-20220209230506-003120Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Scan parquet null3.05912746true36nullnullfalse
app-20220209230506-003124SortMergeJoinnull22.7018true39nullnullfalse
app-20220209230506-003124Filternull2.8029true35nullnullfalse
app-20220209230506-003124ColumnarToRownull1.0073false31nullnulltrue
app-20220209230506-003112Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124ColumnarToRownull1.0083false32nullnulltrue
app-20220209230506-00319Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124WholeStageCodegen (6)WholeStageCodegen (6)8.0167505819true39Sort20false
app-20220209230506-003124BroadcastHashJoinnull5.09016true39nullnullfalse
app-20220209230506-00316Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003117Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-00318Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003121Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Execute InsertIntoHadoopFsRelationCommand parquetnull3.000truenullnullnullfalse
app-20220209230506-003124Projectnull3.0051truenullnullnullfalse
app-20220209230506-003124BroadcastHashJoinnull5.0908true39nullnullfalse
app-20220209230506-003124BroadcastHashJoinnull5.09010true39nullnullfalse
app-20220209230506-003115Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Filternull2.8037true34nullnullfalse
app-20220209230506-003124Scan parquet null3.061074true31nullnullfalse
app-20220209230506-003116Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Scan parquet null3.0426884true32nullnullfalse
app-20220209230506-003110Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003119Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Scan parquet null3.061054true31nullnullfalse
app-20220209230506-003124Scan parquet null3.055986561true37nullnullfalse
app-20220209230506-003124Exchangenull4.2769727true35:38nullnullfalse
app-20220209230506-003124Projectnull3.0011truenullnullnullfalse
app-20220209230506-003124Sortnull8.0056true39nullnullfalse
app-20220209230506-00312Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124BroadcastHashJoinnull5.09014true39nullnullfalse
app-20220209230506-00311Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124WholeStageCodegen (9)WholeStageCodegen (9)2.963764true34Project:Filter:ColumnarToRow65:66:67false
app-20220209230506-003124ColumnarToRownull1.0038false34nullnulltrue
app-20220209230506-003124ColumnarToRownull1.0030false35nullnulltrue
app-20220209230506-003124Exchangenull4.2496057true37:39nullnullfalse
app-20220209230506-003124SortMergeJoinnull22.7024true38nullnullfalse
app-20220209230506-003124BroadcastExchangenull3.0246280truenullnullnullfalse
app-20220209230506-003124Filternull2.8059true37nullnullfalse
app-20220209230506-003124WholeStageCodegen (4)WholeStageCodegen (4)8.096863440true38Sort41false
app-20220209230506-003124BroadcastHashJoinnull5.09012true39nullnullfalse
app-20220209230506-00310Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Filternull2.8044true36nullnullfalse
app-20220209230506-00317Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124HashAggregatenull4.506true39nullnullfalse
app-20220209230506-00314Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Projectnull3.0017truenullnullnullfalse
app-20220209230506-003124ColumnarToRownull1.0067false34nullnulltrue
app-20220209230506-003124Scan parquet null3.061868true34nullnullfalse
app-20220209230506-003124WholeStageCodegen (5)WholeStageCodegen (5)12.85158104722true38Project:SortMergeJoin23:24false
app-20220209230506-003124Scan parquet null3.02823131true35nullnullfalse
app-20220209230506-003124Filternull2.8072true31nullnullfalse
app-20220209230506-003124ColumnarToRownull1.0045false36nullnulltrue
app-20220209230506-00313Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Projectnull3.0071truenullnullnullfalse
app-20220209230506-003124Projectnull3.007truenullnullnullfalse
app-20220209230506-003124WholeStageCodegen (14)WholeStageCodegen (14)5.4412225455true39HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:SortMergeJoin6:7:8:9:10:11:12:13:14:15:16:17:18false
app-20220209230506-003124WholeStageCodegen (10)WholeStageCodegen (10)2.963550true31Project:Filter:ColumnarToRow51:52:53false
app-20220209230506-003124Scan parquet null3.061839true34nullnullfalse
app-20220209230506-003124Filternull2.8082true32nullnullfalse
app-20220209230506-003124BroadcastExchangenull3.0169675truenullnullnullfalse
app-20220209230506-003124Scan parquet null3.080779true33nullnullfalse
app-20220209230506-003124SubqueryBroadcastnull3.0171047truenullnullnullfalse
app-20220209230506-003124Projectnull3.0013truenullnullnullfalse
app-20220209230506-003124BroadcastExchangenull3.0166134truenullnullnullfalse
app-20220209230506-003124WholeStageCodegen (2)WholeStageCodegen (2)8.0104414825true38Sort26false
app-20220209230506-003124BroadcastExchangenull3.0166163truenullnullnullfalse
app-20220209230506-003123Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124WholeStageCodegen (9)WholeStageCodegen (9)2.963735true34Project:Filter:ColumnarToRow36:37:38false
app-20220209230506-003124SubqueryBroadcastnull3.0171062truenullnullnullfalse
app-20220209230506-003124Projectnull3.0065truenullnullnullfalse
app-20220209230506-003124TakeOrderedAndProjectnull3.001true40:41nullnullfalse
app-20220209230506-003124Filternull2.8066true34nullnullfalse
app-20220209230506-003124ColumnarToRownull1.0060false37nullnulltrue
app-20220209230506-003124ReusedExchangenull1.0033falsenullnullnullfalse
app-20220209230506-003124Exchangenull4.2997321true38:39nullnullfalse
app-20220209230506-003124ColumnarToRownull1.0078false33nullnulltrue
app-20220209230506-003124SubqueryBroadcastnull3.0168032truenullnullnullfalse
app-20220209230506-003124WholeStageCodegen (1)WholeStageCodegen (1)2.86176328true35Filter:ColumnarToRow29:30false
app-20220209230506-003114Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Sortnull8.0041true38nullnullfalse
app-20220209230506-00315Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124ReusedExchangenull1.0048falsenullnullnullfalse
app-20220209232634-007024Windownull3.005truenullnullnullfalse
app-20220209232634-007024Execute InsertIntoHadoopFsRelationCommand parquetnull3.000truenullnullnullfalse
app-20220209232634-007024HashAggregatenull4.5010true35nullnullfalse
app-20220209232634-00705Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024Projectnull3.0022truenullnullnullfalse
app-20220209232634-00707Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-00702Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024Scan parquet null3.029742true33nullnullfalse
app-20220209232634-007024Scan parquet null3.049647true32nullnullfalse
app-20220209232634-007014Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-00701Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-00703Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024WholeStageCodegen (5)WholeStageCodegen (5)4.51701719true35HashAggregate10false
app-20220209232634-007024Filternull2.8026true34nullnullfalse
app-20220209232634-007024Sortnull8.007true36nullnullfalse
app-20220209232634-007024ColumnarToRownull1.0035false33nullnulltrue
app-20220209232634-007020Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024Projectnull3.0039truenullnullnullfalse
app-20220209232634-007024Projectnull3.0033truenullnullnullfalse
app-20220209232634-007016Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024ColumnarToRownull1.0046false32nullnulltrue
app-20220209232634-007024WholeStageCodegen (4)WholeStageCodegen (4)3.95123396612true34HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Filter:ColumnarToRow13:14:15:16:17:18:19:26:27false
app-20220209232634-007024Exchangenull4.28426111true34:35nullnullfalse
app-20220209232634-00708Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024WholeStageCodegen (1)WholeStageCodegen (1)2.9304421true31Project:Filter:ColumnarToRow22:23:24false
app-20220209232634-007024BroadcastExchangenull3.0146043truenullnullnullfalse
app-20220209232634-007024SubqueryBroadcastnull3.0112129truenullnullnullfalse
app-20220209232634-007024WholeStageCodegen (3)WholeStageCodegen (3)2.850244true32Filter:ColumnarToRow45:46false
app-20220209232634-007024WholeStageCodegen (6)WholeStageCodegen (6)8.01345746true36Sort7false
app-20220209232634-007010Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024BroadcastExchangenull3.0111031truenullnullnullfalse
app-20220209232634-007024BroadcastHashJoinnull5.09017true34nullnullfalse
app-20220209232634-007012Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007015Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007019Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024ColumnarToRownull1.0041false33nullnulltrue
app-20220209232634-007024TakeOrderedAndProjectnull3.001true36:37nullnullfalse
app-20220209232634-007024Filternull2.8040true33nullnullfalse
app-20220209232634-00704Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024Exchangenull4.2328true35:36nullnullfalse
app-20220209232634-007024Projectnull3.003truenullnullnullfalse
app-20220209232634-007021Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-00709Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024WholeStageCodegen (2)WholeStageCodegen (2)2.931638true33Project:Filter:ColumnarToRow39:40:41false
app-20220209232634-007024ReusedExchangenull1.0030falsenullnullnullfalse
app-20220209232634-007024BroadcastHashJoinnull5.09015true34nullnullfalse
app-20220209232634-007024BroadcastHashJoinnull5.09019true34nullnullfalse
app-20220209232634-007024WholeStageCodegen (2)WholeStageCodegen (2)2.931632true33Project:Filter:ColumnarToRow33:34:35false
app-20220209232634-007024Filternull2.8023true31nullnullfalse
app-20220209232634-007022Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024ColumnarToRownull1.0027false34nullnulltrue
app-20220209232634-007024Scan parquet null3.029736true33nullnullfalse
app-20220209232634-007024Filternull2.8045true32nullnullfalse
app-20220209232634-007024Projectnull3.0016truenullnullnullfalse
app-20220209232634-007017Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024BroadcastExchangenull3.0172620truenullnullnullfalse
app-20220209232634-007018Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007013Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024ColumnarToRownull1.0024false31nullnulltrue
app-20220209232634-007024Projectnull3.0014truenullnullnullfalse
app-20220209232634-00706Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024Projectnull3.0018truenullnullnullfalse
app-20220209232634-007024Filternull1.004false36nullnullfalse
app-20220209232634-007024Scan parquet null3.065125328true34nullnullfalse
app-20220209232634-007011Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-00700Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024HashAggregatenull4.5013true34nullnullfalse
app-20220209232634-007024WholeStageCodegen (7)WholeStageCodegen (7)2.056212true36Project:Filter3:4false
app-20220209232634-007024BroadcastExchangenull3.0111037truenullnullnullfalse
app-20220209232634-007024Scan parquet null3.0291325true31nullnullfalse
app-20220209232634-007024Filternull2.8034true33nullnullfalse
app-20220209232634-007023Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-00262Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624WholeStageCodegen (3)WholeStageCodegen (3)2.846537true33Filter:ColumnarToRow38:39false
app-20220209225845-002624SubqueryBroadcastnull3.0160817truenullnullnullfalse
app-20220209225845-002624BroadcastHashJoinnull5.09013true34nullnullfalse
app-20220209225845-002617Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624Exchangenull4.242414true34:35nullnullfalse
app-20220209225845-002624ColumnarToRownull1.0039false33nullnulltrue
app-20220209225845-002614Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624Scan parquet null3.068724true31nullnullfalse
app-20220209225845-002624BroadcastHashJoinnull5.09011true34nullnullfalse
app-20220209225845-002613Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002622Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624Scan parquet null3.07024716true34nullnullfalse
app-20220209225845-002624Projectnull3.008truenullnullnullfalse
app-20220209225845-00268Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002610Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624WholeStageCodegen (4)WholeStageCodegen (4)3.844430465true34HashAggregate:Expand:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Filter:ColumnarToRow6:7:8:9:10:11:12:13:14:15false
app-20220209225845-002624Projectnull3.0010truenullnullnullfalse
app-20220209225845-002624HashAggregatenull4.506true34nullnullfalse
app-20220209225845-002624Filternull2.8028true31nullnullfalse
app-20220209225845-00266Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624Projectnull3.0012truenullnullnullfalse
app-20220209225845-00263Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002616Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624Filternull2.8038true33nullnullfalse
app-20220209225845-002624Projectnull3.0021truenullnullnullfalse
app-20220209225845-002624WholeStageCodegen (2)WholeStageCodegen (2)2.8254432true32Filter:ColumnarToRow33:34false
app-20220209225845-002624Filternull2.8014true34nullnullfalse
app-20220209225845-00267Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-00265Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-00269Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624BroadcastHashJoinnull5.0909true34nullnullfalse
app-20220209225845-002623Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624ColumnarToRownull1.0029false31nullnulltrue
app-20220209225845-002619Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624Scan parquet null3.068730true31nullnullfalse
app-20220209225845-002624Scan parquet null3.0232935true32nullnullfalse
app-20220209225845-002624ReusedExchangenull1.0018falsenullnullnullfalse
app-20220209225845-002618Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624Expandnull3.007true34nullnullfalse
app-20220209225845-002624BroadcastExchangenull3.0158719truenullnullnullfalse
app-20220209225845-002620Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624BroadcastExchangenull3.0132636truenullnullnullfalse
app-20220209225845-002624Filternull2.8022true31nullnullfalse
app-20220209225845-002624Projectnull3.0027truenullnullnullfalse
app-20220209225845-002624ColumnarToRownull1.0023false31nullnulltrue
app-20220209225845-002624Filternull2.8033true32nullnullfalse
app-20220209225845-002624BroadcastExchangenull3.0158725truenullnullnullfalse
app-20220209225845-002624TakeOrderedAndProjectnull3.001true35:36nullnullfalse
app-20220209225845-002624HashAggregatenull4.503true35nullnullfalse
app-20220209225845-002621Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624ColumnarToRownull1.0034false32nullnulltrue
app-20220209225845-00261Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002611Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624WholeStageCodegen (5)WholeStageCodegen (5)4.54723102true35HashAggregate3false
app-20220209225845-002624BroadcastExchangenull3.0190531truenullnullnullfalse
app-20220209225845-002615Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002612Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-00260Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624WholeStageCodegen (1)WholeStageCodegen (1)2.970726true31Project:Filter:ColumnarToRow27:28:29false
app-20220209225845-002624ColumnarToRownull1.0015false34nullnulltrue
app-20220209225845-002624WholeStageCodegen (1)WholeStageCodegen (1)2.970720true31Project:Filter:ColumnarToRow21:22:23false
app-20220209225845-002624Scan parquet null3.046240true33nullnullfalse
app-20220209225845-002624Execute InsertIntoHadoopFsRelationCommand parquetnull3.000truenullnullnullfalse
app-20220209225845-00264Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-01031Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010314Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010313Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324WholeStageCodegen (5)WholeStageCodegen (5)5.172152true36Project:Sort:HashAggregate3:4:5false
app-20220209235526-010319Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324BroadcastHashJoinnull5.09010true34nullnullfalse
app-20220209235526-010310Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-01039Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-01030Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-01033Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324Projectnull3.0011truenullnullnullfalse
app-20220209235526-01036Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324Projectnull3.009truenullnullnullfalse
app-20220209235526-01037Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324BroadcastHashJoinnull5.09012true34nullnullfalse
app-20220209235526-010324ColumnarToRownull1.0035false31nullnulltrue
app-20220209235526-010324BroadcastExchangenull3.0130719truenullnullnullfalse
app-20220209235526-010324ColumnarToRownull1.0023false33nullnulltrue
app-20220209235526-01034Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324ColumnarToRownull1.0017false34nullnulltrue
app-20220209235526-010322Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010312Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324Scan parquet null3.0105143618true34nullnullfalse
app-20220209235526-010315Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324Projectnull3.0027truenullnullnullfalse
app-20220209235526-010324HashAggregatenull4.508true34nullnullfalse
app-20220209235526-010324BroadcastExchangenull3.0147031truenullnullnullfalse
app-20220209235526-010316Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324Scan parquet null3.060536true31nullnullfalse
app-20220209235526-010324Filternull2.8016true34nullnullfalse
app-20220209235526-010324BroadcastExchangenull3.0114625truenullnullnullfalse
app-20220209235526-01032Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324Scan parquet null3.028330true32nullnullfalse
app-20220209235526-010321Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324Projectnull3.0021truenullnullnullfalse
app-20220209235526-010324Execute InsertIntoHadoopFsRelationCommand parquetnull3.000truenullnullnullfalse
app-20220209235526-010324ColumnarToRownull1.0029false32nullnulltrue
app-20220209235526-010318Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324Projectnull3.0015truenullnullnullfalse
app-20220209235526-010324Filternull2.8034true31nullnullfalse
app-20220209235526-010324Filternull2.8028true32nullnullfalse
app-20220209235526-010311Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010323Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324AdaptiveSparkPlannull1.001falsenullnullnullfalse
app-20220209235526-010324Sortnull8.004true36nullnullfalse
app-20220209235526-010317Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010320Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324BroadcastHashJoinnull5.09014true34nullnullfalse
app-20220209235526-010324Scan parquet null3.049224true33nullnullfalse
app-20220209235526-010324WholeStageCodegen (1)WholeStageCodegen (1)2.949820true33Project:Filter:ColumnarToRow21:22:23false
app-20220209235526-010324WholeStageCodegen (4)WholeStageCodegen (4)3.8415773287true34HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:Filter:ColumnarToRow8:9:10:11:12:13:14:15:16:17false
app-20220209235526-010324Projectnull3.0013truenullnullnullfalse
app-20220209235526-010324Projectnull3.0033truenullnullnullfalse
app-20220209235526-010324WholeStageCodegen (2)WholeStageCodegen (2)2.930326true32Project:Filter:ColumnarToRow27:28:29false
app-20220209235526-01035Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324Filternull2.8022true33nullnullfalse
app-20220209235526-010324HashAggregatenull4.505true36nullnullfalse
app-20220209235526-010324WholeStageCodegen (3)WholeStageCodegen (3)2.961032true31Project:Filter:ColumnarToRow33:34:35false
app-20220209235526-01038Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324Exchangenull4.222986true34:36nullnullfalse
app-20220209235526-010324Projectnull3.003truenullnullnullfalse
app-20220209231919-005716Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-00579Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724Execute InsertIntoHadoopFsRelationCommand parquetnull3.000truenullnullnullfalse
app-20220209231919-005724Exchangenull4.251124true34:36nullnullfalse
app-20220209231919-005714Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724Scan parquet null3.029836true32nullnullfalse
app-20220209231919-005724Projectnull3.0033truenullnullnullfalse
app-20220209231919-005724WholeStageCodegen (4)WholeStageCodegen (4)8.01353893522true36Sort23false
app-20220209231919-00570Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724Filternull2.8019true35nullnullfalse
app-20220209231919-005724WholeStageCodegen (7)WholeStageCodegen (7)2.931648true32Project:Filter:ColumnarToRow49:50:51false
app-20220209231919-00574Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724Filternull2.8044true31nullnullfalse
app-20220209231919-005724Scan parquet null3.028546true31nullnullfalse
app-20220209231919-005724ColumnarToRownull1.0045false31nullnulltrue
app-20220209231919-005724BroadcastExchangenull3.0120831truenullnullnullfalse
app-20220209231919-00573Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724SortMergeJoinnull22.7014true36nullnullfalse
app-20220209231919-005724Projectnull3.0013truenullnullnullfalse
app-20220209231919-005717Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005715Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724Filternull2.8034true32nullnullfalse
app-20220209231919-005724ColumnarToRownull1.0040false33nullnulltrue
app-20220209231919-005724Exchangenull4.214647617true35:36nullnullfalse
app-20220209231919-005724ColumnarToRownull1.0027false34nullnulltrue
app-20220209231919-005724Scan parquet null3.029852true32nullnullfalse
app-20220209231919-005724SubqueryBroadcastnull3.0123429truenullnullnullfalse
app-20220209231919-00571Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005712Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724WholeStageCodegen (8)WholeStageCodegen (8)6.0675557345true36HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:SortMergeJoin6:7:8:9:10:11:12:13:14false
app-20220209231919-005721Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724Projectnull3.009truenullnullnullfalse
app-20220209231919-005724Filternull2.8026true34nullnullfalse
app-20220209231919-005713Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724WholeStageCodegen (3)WholeStageCodegen (3)2.87635225true34Filter:ColumnarToRow26:27false
app-20220209231919-00577Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724TakeOrderedAndProjectnull3.001true37:38nullnullfalse
app-20220209231919-005724Filternull2.8039true33nullnullfalse
app-20220209231919-005724Projectnull3.0011truenullnullnullfalse
app-20220209231919-005724ColumnarToRownull1.0035false32nullnulltrue
app-20220209231919-005724Scan parquet null3.028941true33nullnullfalse
app-20220209231919-005724Exchangenull4.214924true36:37nullnullfalse
app-20220209231919-005718Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724HashAggregatenull4.503true37nullnullfalse
app-20220209231919-00575Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724WholeStageCodegen (6)WholeStageCodegen (6)2.831343true31Filter:ColumnarToRow44:45false
app-20220209231919-005724WholeStageCodegen (2)WholeStageCodegen (2)8.02180315true36Sort16false
app-20220209231919-005711Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724WholeStageCodegen (5)WholeStageCodegen (5)2.830238true33Filter:ColumnarToRow39:40false
app-20220209231919-005724ColumnarToRownull1.0020false35nullnulltrue
app-20220209231919-005724Sortnull8.0016true36nullnullfalse
app-20220209231919-005724BroadcastHashJoinnull5.09010true36nullnullfalse
app-20220209231919-005723Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724Scan parquet null3.04765328true34nullnullfalse
app-20220209231919-005724BroadcastExchangenull3.0120847truenullnullnullfalse
app-20220209231919-005724HashAggregatenull4.506true36nullnullfalse
app-20220209231919-005724BroadcastExchangenull3.0121437truenullnullnullfalse
app-20220209231919-005724Scan parquet null3.0147268121true35nullnullfalse
app-20220209231919-005724Sortnull8.0023true36nullnullfalse
app-20220209231919-005724ReusedExchangenull1.0030falsenullnullnullfalse
app-20220209231919-005724BroadcastHashJoinnull5.09012true36nullnullfalse
app-20220209231919-005724WholeStageCodegen (7)WholeStageCodegen (7)2.931632true32Project:Filter:ColumnarToRow33:34:35false
app-20220209231919-00576Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005710Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724ColumnarToRownull1.0051false32nullnulltrue
app-20220209231919-005724BroadcastHashJoinnull5.0908true36nullnullfalse
app-20220209231919-005724Projectnull3.0049truenullnullnullfalse
app-20220209231919-005722Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-00572Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724BroadcastExchangenull3.0125842truenullnullnullfalse
app-20220209231919-005724Projectnull3.007truenullnullnullfalse
app-20220209231919-005724WholeStageCodegen (9)WholeStageCodegen (9)4.5841222true37HashAggregate3false
app-20220209231919-00578Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005719Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724Filternull2.8050true32nullnullfalse
app-20220209231919-005720Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724WholeStageCodegen (1)WholeStageCodegen (1)2.8441400118true35Filter:ColumnarToRow19:20false
app-20220209231533-00509Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024Filternull2.8014true32nullnullfalse
app-20220209231533-005024WholeStageCodegen (4)WholeStageCodegen (4)4.5804502true34HashAggregate3false
app-20220209231533-005024BroadcastHashJoinnull5.09010true33nullnullfalse
app-20220209231533-005024BroadcastExchangenull3.0143211truenullnullnullfalse
app-20220209231533-005024SubqueryBroadcastnull3.0144220truenullnullnullfalse
app-20220209231533-005018Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024BroadcastExchangenull3.0146121truenullnullnullfalse
app-20220209231533-005024Projectnull3.0023truenullnullnullfalse
app-20220209231533-00507Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005023Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024Filternull2.8017true33nullnullfalse
app-20220209231533-005014Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024Filternull2.8024true31nullnullfalse
app-20220209231533-005024HashAggregatenull4.506true33nullnullfalse
app-20220209231533-00502Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024ColumnarToRownull1.0025false31nullnulltrue
app-20220209231533-00506Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024Scan parquet null3.054616true32nullnullfalse
app-20220209231533-005010Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024Scan parquet null3.072029019true33nullnullfalse
app-20220209231533-005024WholeStageCodegen (2)WholeStageCodegen (2)2.966122true31Project:Filter:ColumnarToRow23:24:25false
app-20220209231533-005017Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024HashAggregatenull4.503true34nullnullfalse
app-20220209231533-005024TakeOrderedAndProjectnull3.001true34:35nullnullfalse
app-20220209231533-005019Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024ColumnarToRownull1.0018false33nullnulltrue
app-20220209231533-005024BroadcastHashJoinnull5.0908true33nullnullfalse
app-20220209231533-005013Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005012Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024Projectnull3.0013truenullnullnullfalse
app-20220209231533-005021Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024ColumnarToRownull1.0015false32nullnulltrue
app-20220209231533-00508Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024Scan parquet null3.065226true31nullnullfalse
app-20220209231533-005024WholeStageCodegen (3)WholeStageCodegen (3)3.9214097295true33HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Filter:ColumnarToRow6:7:8:9:10:17:18false
app-20220209231533-005024Projectnull3.009truenullnullnullfalse
app-20220209231533-00504Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005016Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005022Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005015Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005020Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-00501Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-00500Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-00505Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024WholeStageCodegen (1)WholeStageCodegen (1)2.956612true32Project:Filter:ColumnarToRow13:14:15false
app-20220209231533-00503Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024Execute InsertIntoHadoopFsRelationCommand parquetnull3.000truenullnullnullfalse
app-20220209231533-005024Projectnull3.007truenullnullnullfalse
app-20220209231533-005024Exchangenull4.2115424true33:34nullnullfalse
app-20220209231533-005011Execute CreateViewCommandnull1.000falsenullnullnullfalse
application_1665146417445_00023WholeStageCodegenWholeStageCodegen3.7503true6HashAggregate:Project4:5false
application_1665146417445_00020CollectLimitnull1.000falsenullnullnullfalse
application_1665146417445_00023WholeStageCodegenWholeStageCodegen4.500true7HashAggregate1false
application_1665146417445_00021Projectnull3.001truenullnullnullfalse
application_1665146417445_00020WholeStageCodegenWholeStageCodegen3.001truenullProject2false
application_1665146417445_00021WholeStageCodegenWholeStageCodegen3.000true1Project1false
application_1665146417445_00023Exchangenull4.206true5nullnullfalse
application_1665146417445_00022HashAggregatenull4.501true4nullnullfalse
application_1665146417445_00022HashAggregatenull4.506true3nullnullfalse
application_1665146417445_00022HashAggregatenull4.504true3nullnullfalse
application_1665146417445_00021Scan hive ecomm_ops_tables.s0s0jzb_browse_shelf_cat_mapnull1.002false1nullnullfalse
application_1665146417445_00022Scan hive ecomm_ops_tables.zzz_dart_browse_ads_prod_modnull1.008false2nullnullfalse
application_1665146417445_00020Projectnull3.002truenullnullnullfalse
application_1665146417445_00023HashAggregatenull4.504true6nullnullfalse
application_1665146417445_00023HashAggregatenull4.501true7nullnullfalse
application_1665146417445_00023Scan hive ecomm_ops_tables.zzz_dart_browse_ads_prod_modnull1.007false5nullnullfalse
application_1665146417445_00022HashAggregatenull4.505true3nullnullfalse
application_1665146417445_00020Scan hive ecomm_ops_tables.zzz_dart_browse_ads_prod_modnull1.003false0nullnullfalse
application_1665146417445_00022WholeStageCodegenWholeStageCodegen4.500true4HashAggregate1false
application_1665146417445_00023Projectnull3.005truenullnullnullfalse
application_1665146417445_00022Exchangenull4.202true3nullnullfalse
application_1665146417445_00022WholeStageCodegenWholeStageCodegen4.503true3HashAggregate:HashAggregate:HashAggregate4:5:6false
application_1665146417445_00022Exchangenull4.207true2nullnullfalse
application_1665146417445_00023Exchangenull4.202true6nullnullfalse
app-20220209230053-002824Exchangenull4.23630436true49:50nullnullfalse
app-20220209230053-002824Exchangenull4.2164896true37:38nullnullfalse
app-20220209230053-002824WholeStageCodegen (35)WholeStageCodegen (35)8.09740356227true52Sort228false
app-20220209230053-002824Projectnull3.00155truenullnullnullfalse
app-20220209230053-00284Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Projectnull3.00204truenullnullnullfalse
app-20220209230053-002824Projectnull3.00143truenullnullnullfalse
app-20220209230053-002824Projectnull3.0072truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (6)WholeStageCodegen (6)3.4333255637true49Project:Filter:HashAggregate38:39:40false
app-20220209230053-002824WholeStageCodegen (32)WholeStageCodegen (32)3.0334418172true44Project173false
app-20220209230053-002824SubqueryBroadcastnull3.0160551truenullnullnullfalse
app-20220209230053-002824HashAggregatenull4.5043true47nullnullfalse
app-20220209230053-002824Projectnull3.0030truenullnullnullfalse
app-20220209230053-00287Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Projectnull3.0017truenullnullnullfalse
app-20220209230053-002824BroadcastExchangenull3.0108202truenullnullnullfalse
app-20220209230053-002815Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-00283Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Scan parquet null3.08779181true41nullnullfalse
app-20220209230053-002824Filternull2.8062true33nullnullfalse
app-20220209230053-002824HashAggregatenull1.00224false52nullnullfalse
app-20220209230053-002824WholeStageCodegen (2)WholeStageCodegen (2)8.057073819true50Sort20false
app-20220209230053-002824Projectnull3.00225truenullnullnullfalse
app-20220209230053-002824HashAggregatenull1.00223false52nullnullfalse
app-20220209230053-002824Exchangenull4.2309177true41:44nullnullfalse
app-20220209230053-002824TakeOrderedAndProjectnull3.001true53:54nullnullfalse
app-20220209230053-002824WholeStageCodegen (15)WholeStageCodegen (15)2.821724137true45Filter:ColumnarToRow138:139false
app-20220209230053-002824SortMergeJoinnull22.7012true51nullnullfalse
app-20220209230053-002824WholeStageCodegen (23)WholeStageCodegen (23)6.96293476true51HashAggregate:Project:BroadcastHashJoin:Project:SortMergeJoin7:8:9:10:11false
app-20220209230053-002824WholeStageCodegen (4)WholeStageCodegen (4)2.82258215true32Filter:ColumnarToRow216:217false
app-20220209230053-002824SortMergeJoinnull22.70241true52nullnullfalse
app-20220209230053-002824Sortnull8.00228true52nullnullfalse
app-20220209230053-002824Projectnull3.00236truenullnullnullfalse
app-20220209230053-002824Filternull2.80189true42nullnullfalse
app-20220209230053-002824Scan parquet null3.028733true31nullnullfalse
app-20220209230053-002824ColumnarToRownull1.00157false31nullnulltrue
app-20220209230053-002824HashAggregatenull4.50193true40nullnullfalse
app-20220209230053-002824Projectnull3.0046truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (1)WholeStageCodegen (1)2.81533322true48Filter:ColumnarToRow23:24false
app-20220209230053-00286Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002812Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (42)WholeStageCodegen (42)8.07107509242true52Sort243false
app-20220209230053-002824Sortnull8.00233true52nullnullfalse
app-20220209230053-002824ColumnarToRownull1.0049false47nullnulltrue
app-20220209230053-002824WholeStageCodegen (4)WholeStageCodegen (4)8.07271900120true37Sort121false
app-20220209230053-002824Filternull2.8048true47nullnullfalse
app-20220209230053-002824Exchangenull4.2836815true50:51nullnullfalse
app-20220209230053-002824BroadcastExchangenull3.01206127truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (26)WholeStageCodegen (26)8.0616179175true44Sort176false
app-20220209230053-002824HashAggregatenull1.00163false52nullnullfalse
app-20220209230053-002824HashAggregatenull1.00239false52nullnullfalse
app-20220209230053-002824Sortnull8.00235true52nullnullfalse
app-20220209230053-002824WholeStageCodegen (21)WholeStageCodegen (21)5.671192790141true51Sort:Project:Filter:HashAggregate:HashAggregate:Project:SortMergeJoin142:143:144:145:146:147:148false
app-20220209230053-002824SortMergeJoinnull22.70226true52nullnullfalse
app-20220209230053-002824SortMergeJoinnull22.70104true37nullnullfalse
app-20220209230053-002824ColumnarToRownull1.00118false34nullnulltrue
app-20220209230053-002824WholeStageCodegen (3)WholeStageCodegen (3)2.954860true33Project:Filter:ColumnarToRow61:62:63false
app-20220209230053-002824BroadcastHashJoinnull5.090165true52nullnullfalse
app-20220209230053-002824Filternull2.8067true32nullnullfalse
app-20220209230053-002824BroadcastExchangenull3.0115228truenullnullnullfalse
app-20220209230053-002824HashAggregatenull1.00146false51nullnullfalse
app-20220209230053-002824Sortnull8.0020true50nullnullfalse
app-20220209230053-002824WholeStageCodegen (1)WholeStageCodegen (1)2.948203true39Project:Filter:ColumnarToRow204:205:206false
app-20220209230053-002824Exchangenull4.21065true51:53nullnullfalse
app-20220209230053-002824Exchangenull4.26954171true44:52nullnullfalse
app-20220209230053-002824Scan parquet null3.0203869true32nullnullfalse
app-20220209230053-002824BroadcastExchangenull3.01925214truenullnullnullfalse
app-20220209230053-002824Projectnull3.00173truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (47)WholeStageCodegen (47)6.9658082162true52HashAggregate:Project:BroadcastHashJoin:Project:SortMergeJoin163:164:165:166:167false
app-20220209230053-002824WholeStageCodegen (13)WholeStageCodegen (13)8.0768468986true51Sort87false
app-20220209230053-002824Sortnull8.00176true44nullnullfalse
app-20220209230053-002811Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824HashAggregatenull4.50190true42nullnullfalse
app-20220209230053-002824Sortnull8.00152true51nullnullfalse
app-20220209230053-002824BroadcastExchangenull3.0159653truenullnullnullfalse
app-20220209230053-002824Projectnull3.0055truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (5)WholeStageCodegen (5)3.924787686192true40HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Filter:ColumnarToRow193:194:195:196:197:198:199false
app-20220209230053-002824WholeStageCodegen (5)WholeStageCodegen (5)2.9341115true34Project:Filter:ColumnarToRow116:117:118false
app-20220209230053-002824Projectnull3.00221truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (38)WholeStageCodegen (38)5.6715748975219true52Sort:Project:Filter:HashAggregate:HashAggregate:Project:SortMergeJoin220:221:222:223:224:225:226false
app-20220209230053-00282Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-00289Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824SortMergeJoinnull22.70167true52nullnullfalse
app-20220209230053-002824WholeStageCodegen (10)WholeStageCodegen (10)2.9162909081true46Project:Filter:ColumnarToRow82:83:84false
app-20220209230053-002824Filternull2.8031true31nullnullfalse
app-20220209230053-002824SortMergeJoinnull22.70133true51nullnullfalse
app-20220209230053-00288Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Scan parquet null3.02038218true32nullnullfalse
app-20220209230053-002824WholeStageCodegen (8)WholeStageCodegen (8)3.031701316true50Project17false
app-20220209230053-002810Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824BroadcastHashJoinnull5.090102true37nullnullfalse
app-20220209230053-002824Unionnull3.002truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (45)WholeStageCodegen (45)5.67579620234true52Sort:Project:Filter:HashAggregate:HashAggregate:Project:SortMergeJoin235:236:237:238:239:240:241false
app-20220209230053-002824HashAggregatenull4.5095true38nullnullfalse
app-20220209230053-002824Sortnull8.00230true52nullnullfalse
app-20220209230053-002824Exchangenull4.257306107true35:37nullnullfalse
app-20220209230053-00281Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824BroadcastExchangenull3.01152153truenullnullnullfalse
app-20220209230053-002824HashAggregatenull1.0075false51nullnullfalse
app-20220209230053-002824Scan parquet null3.052564true33nullnullfalse
app-20220209230053-002824SortMergeJoinnull22.70231true52nullnullfalse
app-20220209230053-002824Sortnull8.00142true51nullnullfalse
app-20220209230053-002824ColumnarToRownull1.00212false33nullnulltrue
app-20220209230053-002824BroadcastExchangenull3.01596208truenullnullnullfalse
app-20220209230053-002824Projectnull3.00210truenullnullnullfalse
app-20220209230053-002824ColumnarToRownull1.0091false43nullnulltrue
app-20220209230053-002824WholeStageCodegen (4)WholeStageCodegen (4)2.8225866true32Filter:ColumnarToRow67:68false
app-20220209230053-002824Filternull2.80179true41nullnullfalse
app-20220209230053-002824Sortnull8.0079true51nullnullfalse
app-20220209230053-002824Scan parquet null3.01128383111true35nullnullfalse
app-20220209230053-002824Filternull1.0073false51nullnullfalse
app-20220209230053-002824WholeStageCodegen (5)WholeStageCodegen (5)2.9341128true34Project:Filter:ColumnarToRow129:130:131false
app-20220209230053-002824Sortnull8.00245true52nullnullfalse
app-20220209230053-002824ColumnarToRownull1.0024false48nullnulltrue
app-20220209230053-002824BroadcastHashJoinnull5.090195true40nullnullfalse
app-20220209230053-002824SortMergeJoinnull22.7018true50nullnullfalse
app-20220209230053-002824HashAggregatenull1.004false53nullnullfalse
app-20220209230053-002824Projectnull3.00196truenullnullnullfalse
app-20220209230053-002824SubqueryBroadcastnull3.01212112truenullnullnullfalse
app-20220209230053-002824Filternull1.00144false51nullnullfalse
app-20220209230053-002823Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Exchangenull4.2374136true45:52:51nullnullfalse
app-20220209230053-002817Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824HashAggregatenull4.5098true37nullnullfalse
app-20220209230053-002824Filternull2.80216true32nullnullfalse
app-20220209230053-002824Execute InsertIntoHadoopFsRelationCommand parquetnull3.000truenullnullnullfalse
app-20220209230053-002824Exchangenull4.27422580true46:52:51nullnullfalse
app-20220209230053-002824BroadcastExchangenull3.0159659truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (7)WholeStageCodegen (7)8.026532234true50Sort35false
app-20220209230053-002824Exchangenull4.264161true52:53nullnullfalse
app-20220209230053-002824ColumnarToRownull1.0084false46nullnulltrue
app-20220209230053-002824Projectnull3.00166truenullnullnullfalse
app-20220209230053-002824Filternull2.80138true45nullnullfalse
app-20220209230053-002824Projectnull3.0076truenullnullnullfalse
app-20220209230053-002824SortMergeJoinnull22.70148true51nullnullfalse
app-20220209230053-002824Exchangenull4.236854186true42:44nullnullfalse
app-20220209230053-002824WholeStageCodegen (1)WholeStageCodegen (1)2.83141204108true35Filter:ColumnarToRow109:110false
app-20220209230053-002813Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824SortMergeJoinnull22.70168true52nullnullfalse
app-20220209230053-002824WholeStageCodegen (11)WholeStageCodegen (11)8.0773691078true51Sort79false
app-20220209230053-002824ReusedExchangenull1.0027falsenullnullnullfalse
app-20220209230053-002824SubqueryBroadcastnull3.0118326truenullnullnullfalse
app-20220209230053-002824ColumnarToRownull1.00125false36nullnulltrue
app-20220209230053-002824Scan parquet null3.020580126true36nullnullfalse
app-20220209230053-002824Scan parquet null3.0525213true33nullnullfalse
app-20220209230053-002824WholeStageCodegen (48)WholeStageCodegen (48)1.03979159false53HashAggregate160false
app-20220209230053-002824Sortnull8.00106true37nullnullfalse
app-20220209230053-002824Filternull2.80205true39nullnullfalse
app-20220209230053-002824Projectnull3.008truenullnullnullfalse
app-20220209230053-002824HashAggregatenull1.007false51nullnullfalse
app-20220209230053-002824WholeStageCodegen (14)WholeStageCodegen (14)5.671308543670true51Sort:Project:Filter:HashAggregate:HashAggregate:Project:SortMergeJoin71:72:73:74:75:76:77false
app-20220209230053-002824HashAggregatenull1.00145false51nullnullfalse
app-20220209230053-002824Projectnull3.00129truenullnullnullfalse
app-20220209230053-002824ColumnarToRownull1.00110false35nullnulltrue
app-20220209230053-002824WholeStageCodegen (33)WholeStageCodegen (33)8.01156186169true52Sort170false
app-20220209230053-002824Exchangenull4.23485041true47:49nullnullfalse
app-20220209230053-002824ColumnarToRownull1.0032false31nullnulltrue
app-20220209230053-002824Filternull2.80124true36nullnullfalse
app-20220209230053-002824Projectnull3.0010truenullnullnullfalse
app-20220209230053-002824HashAggregatenull1.00238false52nullnullfalse
app-20220209230053-002824Projectnull3.00101truenullnullnullfalse
app-20220209230053-002824Sortnull8.0071true51nullnullfalse
app-20220209230053-002824BroadcastExchangenull3.0192565truenullnullnullfalse
app-20220209230053-002824Filternull2.8023true48nullnullfalse
app-20220209230053-002818Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824SubqueryBroadcastnull3.01183182truenullnullnullfalse
app-20220209230053-002824Sortnull8.00170true52nullnullfalse
app-20220209230053-002824BroadcastHashJoinnull5.09045true47nullnullfalse
app-20220209230053-002824ColumnarToRownull1.00180false41nullnulltrue
app-20220209230053-002824HashAggregatenull4.5040true49nullnullfalse
app-20220209230053-002824Scan parquet null3.07319350true47nullnullfalse
app-20220209230053-002824WholeStageCodegen (40)WholeStageCodegen (40)8.00232true52Sort233false
app-20220209230053-002816Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Filternull2.80198true40nullnullfalse
app-20220209230053-002824Scan parquet null3.0736225true48nullnullfalse
app-20220209230053-002824Projectnull3.00240truenullnullnullfalse
app-20220209230053-002824Filternull2.80211true33nullnullfalse
app-20220209230053-002824Sortnull8.00121true37nullnullfalse
app-20220209230053-002824WholeStageCodegen (18)WholeStageCodegen (18)8.05641193149true51Sort150false
app-20220209230053-002824Filternull2.80117true34nullnullfalse
app-20220209230053-002824WholeStageCodegen (22)WholeStageCodegen (22)2.9305154true31Project:Filter:ColumnarToRow155:156:157false
app-20220209230053-002824Scan parquet null3.011173140true45nullnullfalse
app-20220209230053-002824BroadcastExchangenull3.01206114truenullnullnullfalse
app-20220209230053-002824ColumnarToRownull1.0068false32nullnulltrue
app-20220209230053-002824Filternull2.80156true31nullnullfalse
app-20220209230053-002824Scan parquet null3.052558true33nullnullfalse
app-20220209230053-002824Sortnull8.00220true52nullnullfalse
app-20220209230053-002821Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824SortMergeJoinnull22.70174true44nullnullfalse
app-20220209230053-002824Scan parquet null3.036108885true46nullnullfalse
app-20220209230053-002814Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (9)WholeStageCodegen (9)8.031903113true51Sort14false
app-20220209230053-002824Sortnull8.0035true50nullnullfalse
app-20220209230053-002824Sortnull8.0087true51nullnullfalse
app-20220209230053-002824HashAggregatenull1.0099false37nullnullfalse
app-20220209230053-002824Scan parquet null3.0972392true43nullnullfalse
app-20220209230053-002824WholeStageCodegen (6)WholeStageCodegen (6)5.76707748097true37HashAggregate:HashAggregate:HashAggregate:Project:BroadcastHashJoin:Project:SortMergeJoin98:99:100:101:102:103:104false
app-20220209230053-002824WholeStageCodegen (22)WholeStageCodegen (22)2.930529true31Project:Filter:ColumnarToRow30:31:32false
app-20220209230053-002824BroadcastHashJoinnull5.09047true47nullnullfalse
app-20220209230053-002824Projectnull3.00188truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (12)WholeStageCodegen (12)2.81437289true43Filter:ColumnarToRow90:91false
app-20220209230053-002824SubqueryBroadcastnull3.0108201truenullnullnullfalse
app-20220209230053-002824Projectnull3.0082truenullnullnullfalse
app-20220209230053-002824ColumnarToRownull1.00217false32nullnulltrue
app-20220209230053-002824Filternull1.00222false52nullnullfalse
app-20220209230053-002824Filternull2.80130true34nullnullfalse
app-20220209230053-002824SortMergeJoinnull22.7011true51nullnullfalse
app-20220209230053-002824Projectnull3.00116truenullnullnullfalse
app-20220209230053-002824ReusedExchangenull1.0052falsenullnullnullfalse
app-20220209230053-002824Filternull2.8039true49nullnullfalse
app-20220209230053-00285Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Projectnull3.00194truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (3)WholeStageCodegen (3)2.827817123true36Filter:ColumnarToRow124:125false
app-20220209230053-002824Filternull2.8083true46nullnullfalse
app-20220209230053-002824Projectnull3.00164truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (2)WholeStageCodegen (2)8.07610479105true37Sort106false
app-20220209230053-002824Exchangenull4.224920191true40:42nullnullfalse
app-20220209230053-002824Filternull2.80109true35nullnullfalse
app-20220209230053-002824Projectnull3.00103truenullnullnullfalse
app-20220209230053-002820Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Filternull1.00237false52nullnullfalse
app-20220209230053-002824ColumnarToRownull1.0057false33nullnulltrue
app-20220209230053-002824ColumnarToRownull1.00139false45nullnulltrue
app-20220209230053-002824ColumnarToRownull1.00131false34nullnulltrue
app-20220209230053-002824ColumnarToRownull1.0063false33nullnulltrue
app-20220209230053-002824WholeStageCodegen (25)WholeStageCodegen (25)2.815032178true41Filter:ColumnarToRow179:180false
app-20220209230053-002824ColumnarToRownull1.00206false39nullnulltrue
app-20220209230053-002824SortMergeJoinnull22.7077true51nullnullfalse
app-20220209230053-002824Exchangenull4.2124122true36:37nullnullfalse
app-20220209230053-002824WholeStageCodegen (37)WholeStageCodegen (37)8.09684161229true52Sort230false
app-20220209230053-002824ColumnarToRownull1.00199false40nullnulltrue
app-20220209230053-002824Sortnull8.00150true51nullnullfalse
app-20220209230053-002824Projectnull3.00147truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (24)WholeStageCodegen (24)1.0153863false53HashAggregate4false
app-20220209230053-002824WholeStageCodegen (3)WholeStageCodegen (3)2.9548209true33Project:Filter:ColumnarToRow210:211:212false
app-20220209230053-002824Scan parquet null3.0287158true31nullnullfalse
app-20220209230053-002824HashAggregatenull1.0074false51nullnullfalse
app-20220209230053-002824ReusedExchangenull1.00113falsenullnullnullfalse
app-20220209230053-002824Subquerynull1.0093falsenullnullnullfalse
app-20220209230053-002824Exchangenull4.215288true43:52:51nullnullfalse
app-20220209230053-002824Sortnull8.00135true51nullnullfalse
app-20220209230053-002824Projectnull3.0038truenullnullnullfalse
app-20220209230053-002824HashAggregatenull1.00160false53nullnullfalse
app-20220209230053-002824Scan parquet null3.0324132true34nullnullfalse
app-20220209230053-002824WholeStageCodegen (20)WholeStageCodegen (20)8.05632344151true51Sort152false
app-20220209230053-002824Scan parquet null3.0104034200true40nullnullfalse
app-20220209230053-002824WholeStageCodegen (31)WholeStageCodegen (31)8.0280275183true44Sort184false
app-20220209230053-002824Exchangenull4.281921true48:50nullnullfalse
app-20220209230053-002824WholeStageCodegen (3)WholeStageCodegen (3)2.954854true33Project:Filter:ColumnarToRow55:56:57false
app-20220209230053-002824WholeStageCodegen (7)WholeStageCodegen (7)4.5994true38HashAggregate95false
app-20220209230053-00280Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Filternull2.8090true43nullnullfalse
app-20220209230053-002824Scan parquet null3.031207true39nullnullfalse
app-20220209230053-002824ReusedExchangenull1.00185falsenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (5)WholeStageCodegen (5)3.92484989842true47HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Filter:ColumnarToRow43:44:45:46:47:48:49false
app-20220209230053-002824Sortnull8.00243true52nullnullfalse
app-20220209230053-002824HashAggregatenull1.00100false37nullnullfalse
app-20220209230053-002824BroadcastHashJoinnull5.090197true40nullnullfalse
app-20220209230053-002824WholeStageCodegen (6)WholeStageCodegen (6)3.43329696187true42Project:Filter:HashAggregate188:189:190false
app-20220209230053-002824Sortnull8.00184true44nullnullfalse
app-20220209230053-002824Scan parquet null3.0324119true34nullnullfalse
app-20220209230053-002822Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Filternull2.8056true33nullnullfalse
app-20220209230053-002824Sortnull8.0014true51nullnullfalse
app-20220209230053-002824BroadcastHashJoinnull5.0909true51nullnullfalse
app-20220209230053-002824Projectnull3.0061truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (16)WholeStageCodegen (16)8.00134true51Sort135false
app-20220209230053-002819Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Projectnull3.0044truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (44)WholeStageCodegen (44)8.07091464244true52Sort245false
app-20220209230750-003624WholeStageCodegen (19)WholeStageCodegen (19)2.811348582true40Filter:ColumnarToRow83:84false
app-20220209230750-003624Projectnull3.005truenullnullnullfalse
app-20220209230750-003624SortMergeJoinnull22.7023true37nullnullfalse
app-20220209230750-003624ColumnarToRownull1.0039false32nullnulltrue
app-20220209230750-003624HashAggregatenull4.5057true41nullnullfalse
app-20220209230750-003624ColumnarToRownull1.0090false31nullnulltrue
app-20220209230750-003624Filternull2.8017true38nullnullfalse
app-20220209230750-003624Scan parquet null3.0939853true33nullnullfalse
app-20220209230750-003624Scan parquet null3.0892791true31nullnullfalse
app-20220209230750-003624ReusedExchangenull1.0034falsenullnullnullfalse
app-20220209230750-003624BroadcastHashJoinnull5.0904true42nullnullfalse
app-20220209230750-003624BroadcastExchangenull3.0149435truenullnullnullfalse
app-20220209230750-003614Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230750-003624Sortnull8.0055true41nullnullfalse
app-20220209230750-003624Projectnull3.0071truenullnullnullfalse
app-20220209230750-003624WholeStageCodegen (11)WholeStageCodegen (11)8.062515967true35Sort68false
app-20220209230750-003624Scan parquet null3.06281985true40nullnullfalse
app-20220209230750-003611Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230750-003624WholeStageCodegen (6)WholeStageCodegen (6)10.07191090520true37HashAggregate:Project:SortMergeJoin21:22:23false
app-20220209230750-003624Filternull1.0056false41nullnullfalse
app-20220209230750-003624SortMergeJoinnull22.7066true35nullnullfalse
app-20220209230750-003624Sortnull8.0014true41nullnullfalse
app-20220209230750-003624HashAggregatenull4.5061true39nullnullfalse
app-20220209230750-003624Sortnull8.0025true37nullnullfalse
app-20220209230750-003624Sortnull8.008true42nullnullfalse
app-20220209230750-00363Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230750-003624WholeStageCodegen (14)WholeStageCodegen (14)10.0754130563true35HashAggregate:Project:SortMergeJoin64:65:66false
app-20220209230750-003624Projectnull3.0022truenullnullnullfalse
app-20220209230750-003624ColumnarToRownull1.0052false33nullnulltrue
app-20220209230750-003624WholeStageCodegen (7)WholeStageCodegen (7)3.6535682516true38Filter:HashAggregate17:18false
app-20220209230750-003624Filternull2.8089true31nullnullfalse
app-20220209230750-003615Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230750-00365Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230750-003616Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230750-003624WholeStageCodegen (2)WholeStageCodegen (2)3.6340442927true36Project:BroadcastHashJoin:Filter:ColumnarToRow28:29:30:31false
app-20220209230750-003624BroadcastExchangenull3.0149441truenullnullnullfalse
app-20220209230750-003624Projectnull3.0065truenullnullnullfalse
app-20220209230750-003624HashAggregatenull4.5021true37nullnullfalse
app-20220209230750-00362Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230750-003624Projectnull3.0037truenullnullnullfalse
app-20220209230750-00364Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230750-00367Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230750-003624WholeStageCodegen (18)WholeStageCodegen (18)8.04382647true42Sort8false
app-20220209230750-00360Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230750-003624Exchangenull4.29152569true34:35nullnullfalse
app-20220209230750-003624HashAggregatenull4.5064true35nullnullfalse
app-20220209230750-003624WholeStageCodegen (5)WholeStageCodegen (5)8.0176929047true37Sort48false
Showing the first 1000 rows.
"]}}],"execution_count":0}],"metadata":{"application/vnd.databricks.v1+notebook":{"notebookName":"[RAPIDS Accelerator for Apache Spark] Qualification Tool Notebook Template","dashboards":[{"elements":[],"guid":"0ed3c80b-b2f6-4c89-9a92-1af2f168d5ea","layoutOption":{"stack":true,"grid":true},"version":"DashboardViewV1","nuid":"91c1bfb2-695a-4e5c-8a25-848a433108dc","origId":2721260844584915,"title":"Executive View","width":1600,"globalVars":{}},{"elements":[],"guid":"ab4cecf9-0471-4fee-aa33-8927bb7e1bb1","layoutOption":{"stack":true,"grid":true},"version":"DashboardViewV1","nuid":"62243296-4562-4f06-90ac-d7a609f19c16","origId":2721260844584916,"title":"App View","width":1920,"globalVars":{}}],"notebookMetadata":{"pythonIndentUnit":2,"widgetLayout":[{"name":"log_path","width":551,"breakBefore":false},{"name":"output_path","width":551,"breakBefore":false}]},"language":"python","widgets":{"log_path":{"nuid":"88986aa6-6e67-4d09-aeeb-7c96ea1ea8f1","currentValue":"/dbfs/user1/qualification_logs","widgetInfo":{"widgetType":"text","name":"log_path","defaultValue":"","label":null,"options":{"widgetType":"text","validationRegex":null}}},"output_path":{"nuid":"0b9846bd-5c3e-4ae2-ba00-80bb9da1ee32","currentValue":"/tmp","widgetInfo":{"widgetType":"text","name":"output_path","defaultValue":"","label":null,"options":{"widgetType":"text","validationRegex":null}}}},"notebookOrigID":2721260844584890}},"nbformat":4,"nbformat_minor":0} +{"cells":[{"cell_type":"markdown","source":["# Welcome to the Qualification Tool for the RAPIDS Accelerator for Apache Spark\nTo run the tool, you need to enter a log path that represents the DBFS location for your Spark CPU event logs. Then you can select \"Run all\" to execute the notebook. After the notebook completes, you will see various output tables show up below. More options for running the qualification tool can be found here: https://nvidia.github.io/spark-rapids/docs/spark-qualification-tool.html#qualification-tool-options.\n\n## Summary Output\nThe report represents the entire app execution, including unsupported operators and non-SQL operations. By default, the applications and queries are sorted in descending order by the following fields:\n- Recommendation;\n- Estimated GPU Speed-up;\n- Estimated GPU Time Saved; and\n- End Time.\n\n## Stages Output\nFor each stage used in SQL operations, the Qualification tool generates the following information:\n1. App ID\n1. Stage ID\n1. Average Speedup Factor: the average estimated speed-up of all the operators in the given stage.\n1. Stage Task Duration: amount of time spent in tasks of SQL Dataframe operations for the given stage.\n1. Unsupported Task Duration: sum of task durations for the unsupported operators. For more details, see Supported Operators.\n1. Stage Estimated: True or False indicates if we had to estimate the stage duration.\n\n## Execs Output\nThe Qualification tool generates a report of the “Exec” in the “SparkPlan” or “Executor Nodes” along with the estimated acceleration on the GPU. Please refer to the Supported Operators guide for more details on limitations on UDFs and unsupported operators.\n1. App ID\n1. SQL ID\n1. Exec Name: example Filter, HashAggregate\n1. Expression Name\n1. Task Speedup Factor: it is simply the average acceleration of the operators based on the original CPU duration of the operator divided by the GPU duration. The tool uses historical queries and benchmarks to estimate a speed-up at an individual operator level to calculate how much a specific operator would accelerate on GPU.\n1. Exec Duration: wall-Clock time measured since the operator starts till it is completed.\n1. SQL Node Id\n1. Exec Is Supported: whether the Exec is supported by RAPIDS or not. Please refer to the Supported Operators section.\n1. Exec Stages: an array of stage IDs\n1. Exec Children\n1. Exec Children Node Ids\n1. Exec Should Remove: whether the Op is removed from the migrated plan."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"df33c614-2ecc-47a0-8600-bc891681997f","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["import json\nimport requests\nimport base64\nimport shlex\nimport subprocess\nimport pandas as pd\n\n# Download Spark RAPIDS tool jar\nTOOL_JAR_URL = 'https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark-tools_2.12/23.06.0/rapids-4-spark-tools_2.12-23.06.0.jar'\nTOOL_JAR_LOCAL_PATH = '/tmp/rapids-4-spark-tools.jar'\nresponse = requests.get(TOOL_JAR_URL)\nopen(TOOL_JAR_LOCAL_PATH, \"wb\").write(response.content)\n\n# Download S3 jars\nHADOOP_AWS_URL = 'https://repo.maven.apache.org/maven2/org/apache/hadoop/hadoop-aws/2.7.4/hadoop-aws-2.7.4.jar'\nHADOOP_AWS_LOCAL_PATH = '/tmp/hadoop-aws-2.7.4.jar'\nresponse = requests.get(HADOOP_AWS_URL)\nopen(HADOOP_AWS_LOCAL_PATH, \"wb\").write(response.content)\n\nAWS_JAVA_URL = 'https://repo.maven.apache.org/maven2/com/amazonaws/aws-java-sdk/1.7.4/aws-java-sdk-1.7.4.jar'\nAWS_JAVA_LOCAL_PATH = '/tmp/aws-java-sdk-1.7.4.jar'\nresponse = requests.get(AWS_JAVA_URL)\nopen(AWS_JAVA_LOCAL_PATH, \"wb\").write(response.content)\n\n"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"53b4d770-9db6-4bd7-9b93-d036d375eac5","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"datasetInfos":[],"data":"
Out[38]: 11948376
","removedWidgets":[],"addedWidgets":{},"metadata":{},"type":"html","arguments":{}}},"output_type":"display_data","data":{"text/html":["\n
Out[38]: 11948376
"]}}],"execution_count":0},{"cell_type":"code","source":["dbutils.widgets.text(\"log_path\", \"\")\neventlog_string=dbutils.widgets.get(\"log_path\")\n\ndbutils.widgets.text(\"output_path\", \"\")\noutputpath_string=dbutils.widgets.get(\"output_path\")"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"acf401a3-12d3-4236-a6c5-8fe8990b153a","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"datasetInfos":[],"data":"
","removedWidgets":[],"addedWidgets":{},"metadata":{},"type":"html","arguments":{}}},"output_type":"display_data","data":{"text/html":["\n
"]}}],"execution_count":0},{"cell_type":"code","source":["!java -Xmx10g -cp /tmp/rapids-4-spark-tools.jar:/tmp/hadoop-aws-2.7.4.jar:/tmp/aws-java-sdk-1.7.4.jar:/databricks/jars/* com.nvidia.spark.rapids.tool.qualification.QualificationMain -o $outputpath_string $eventlog_string &> /tmp/qual_debug.log"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"65c4e778-5505-4334-ab89-424334803253","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"datasetInfos":[],"data":"
","removedWidgets":[],"addedWidgets":{},"metadata":{},"type":"html","arguments":{}}},"output_type":"display_data","data":{"text/html":["\n
"]}}],"execution_count":0},{"cell_type":"markdown","source":["## Summary Output"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"bbe50fde-0bd6-4281-95fd-6a1ec6f17ab2","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["summary_output=pd.read_csv(outputpath_string + \"/rapids_4_spark_qualification_output/rapids_4_spark_qualification_output.csv\")\ndisplay(summary_output)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"fb8edb26-e173-47ff-92a1-463baec7c06b","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["TPC-DS Like Bench q14b","app-20220209225233-0018","Strongly Recommended",2.7,48971.53,83400.46,112708,27066964,132372,109793,65.66,null,null,null,null,null,null,112701,2939275,700037,26366927,4.16,false,"HashAggregate;Subquery;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q14a","app-20220209225013-0017","Strongly Recommended",2.66,51728.96,86381.03,117178,28746000,138110,112636,64.69,null,null,null,null,null,null,117172,2978987,1114076,27631924,4.29,false,"HashAggregate;Subquery;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q4","app-20220209224316-0007","Strongly Recommended",2.66,41856.03,69720.96,90167,85324700,111577,90167,65.09,null,null,null,null,null,null,90163,3086516,0,85324700,4.41,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q24b","app-20220209230348-0030","Recommended",2.34,32581.07,43720.92,56748,27574691,76302,56694,60.89,null,null,null,null,null,null,56741,2950634,25998,27548693,4.37,false,"AdaptiveSparkPlan;Subquery;Execute CreateViewCommand;Filter;ColumnarToRow","decimal"],["TPC-DS Like Bench q67","app-20220209232913-0074","Recommended",2.27,144720.72,184416.27,308185,15437192,329137,265300,73.64,null,null,null,null,null,null,308174,3028469,2148108,13289084,3.28,false,"Execute CreateViewCommand;ReusedExchange;HashAggregate;ColumnarToRow","DecimalType"],["TPC-DS Like Bench q24a","app-20220209230232-0029","Recommended",2.25,33029.22,41483.77,53469,27911960,74513,53202,60.14,null,null,null,null,null,null,53455,3305140,139193,27772767,4.54,false,"AdaptiveSparkPlan;Subquery;Execute CreateViewCommand;Filter;ColumnarToRow","decimal"],["TPC-DS Like Bench q93","app-20220209235239-0100","Recommended",2.18,31203.42,36894.57,50166,29213056,68098,50166,64.73,null,null,null,null,null,null,50161,2973035,0,29213056,3.78,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench q23a","app-20220209225917-0027","Recommended",2.17,43196.97,50617.02,74068,45913641,93814,66840,64.81,null,null,null,null,null,null,74064,2975228,4480262,41433379,4.12,false,"HashAggregate;Subquery;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q23b","app-20220209230053-0028","Recommended",2.08,46588.14,50761.85,77422,59799857,97350,66526,66.43,null,null,null,null,null,null,77417,3011951,8415627,51384230,4.22,false,"HashAggregate;Subquery;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRow","DecimalType;decimal"],["TPC-DS Like Bench q72","app-20220209233659-0079","Recommended",1.97,30920.88,30054.11,41703,25434438,60975,41703,74.77,null,null,null,null,null,null,41694,2971887,0,25434438,3.58,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q64","app-20220209232701-0071","Recommended",1.95,30544.61,29103.38,38925,31852357,59648,37301,55.12,null,null,null,null,null,null,38919,2987987,1328490,30523867,4.55,false,"HashAggregate;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q78","app-20220209234412-0085","Recommended",1.94,24390.79,22946.2,29098,24753911,47337,29098,56.99,null,null,null,null,null,null,29090,2968697,0,24753911,4.73,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q95","app-20220209235427-0102","Recommended",1.9,29920.38,26967.61,37674,23337528,56888,35528,49.19,null,null,null,null,null,null,37667,2958216,1328886,22008642,4.15,false,"Execute CreateViewCommand;AdaptiveSparkPlan;HashAggregate;ColumnarToRow","merge_sum"],["TPC-DS Like Bench q87","app-20220209234925-0094","Recommended",1.81,25518.2,20871.79,26279,16348325,46390,26279,52.04,null,null,null,null,null,null,26272,2954066,0,16348325,4.86,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q50","app-20220209231919-0057","Recommended",1.76,26735.89,20549.1,28736,16444045,47285,28736,52.87,null,null,null,null,null,null,28732,3339217,0,16444045,3.51,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q97","app-20220209235552-0104","Recommended",1.76,24057.8,18398.19,23731,11475611,42456,23731,58.69,null,null,null,null,null,null,23727,3009477,0,11475611,4.45,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q75","app-20220209233914-0082","Recommended",1.74,25544.26,18972.73,24939,19831478,44517,24939,43.74,null,null,null,null,null,null,24933,2987306,0,19831478,4.18,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q38","app-20220209231214-0044","Recommended",1.73,23047.06,16910.93,21292,15248682,39958,21292,48.81,null,null,null,null,null,null,21288,3167687,0,15248682,4.86,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q31","app-20220209230826-0037","Recommended",1.68,23595.69,16242.3,20407,12617670,39838,20407,34.76,null,null,null,null,null,null,20399,2942830,0,12617670,4.9,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q74","app-20220209233831-0081","Recommended",1.68,24668.06,16781.93,21747,16692240,41450,21747,46.93,null,null,null,null,null,null,21741,3325282,0,16692240,4.38,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q11","app-20220209224833-0014","Recommended",1.62,26707.24,16820.75,24208,17615125,43528,22143,45.76,null,null,null,null,null,null,24205,2917642,1502045,16113080,4.16,false,"Execute CreateViewCommand;ReusedExchange;HashAggregate;ColumnarToRow","DecimalType"],["TPC-DS Like Bench q16","app-20220209225524-0020","Recommended",1.62,25717.33,16006.66,22726,18535920,41724,21306,44.67,null,null,null,null,null,null,22720,3028781,1157466,17378454,4.01,false,"Execute CreateViewCommand;AdaptiveSparkPlan;HashAggregate;ColumnarToRow","merge_sum"],["TPC-DS Like Bench q51","app-20220209232008-0058","Recommended",1.59,21942.35,13069.64,16925,12278939,35012,16925,47.26,null,null,null,null,null,null,16920,2979507,0,12278939,4.38,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q81","app-20220209234611-0088","Recommended",1.58,23125.59,13612.4,17437,10033526,36738,17393,36.22,null,null,null,null,null,null,17431,3083743,24955,10008571,4.59,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow;Filter","DECIMAL"],["TPC-DS Like Bench q65","app-20220209232803-0072","Recommended",1.57,23403.59,13469.4,18332,10164071,36873,18332,46.41,null,null,null,null,null,null,18324,2941892,0,10164071,3.77,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q30","app-20220209230750-0036","Recommended",1.56,21777.06,12322.93,16070,8447753,34100,16023,33.65,null,null,null,null,null,null,16063,2987480,24435,8423318,4.33,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow;Filter","DECIMAL"],["TPC-DS Like Bench q15","app-20220209225447-0019","Recommended",1.52,23166.12,12074.87,15970,6770100,35241,15970,34.25,null,null,null,null,null,null,15964,2923648,0,6770100,4.09,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q35","app-20220209231035-0041","Recommended",1.51,24552.13,12648.86,18298,10027023,37201,17010,37.15,null,null,null,null,null,null,18293,3059747,705510,9321513,3.9,false,"Execute CreateViewCommand;SortMergeJoin;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q8","app-20220209224648-0011","Recommended",1.51,23372.7,12016.29,15691,6693324,35389,15691,20.01,null,null,null,null,null,null,15686,3133963,0,6693324,4.26,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q69","app-20220209233517-0076","Recommended",1.5,24534.64,12431.35,16589,7246714,36966,16589,27.75,null,null,null,null,null,null,16583,2963952,0,7246714,3.99,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q94","app-20220209235349-0101","Recommended",1.5,24361.44,12284.55,17424,13168326,36646,16352,41.87,null,null,null,null,null,null,17416,3048502,809952,12358374,4.01,false,"Execute CreateViewCommand;AdaptiveSparkPlan;HashAggregate;ColumnarToRow","merge_sum"],["TPC-DS Like Bench q54","app-20220209232140-0061","Recommended",1.5,23475.06,11742.93,15568,5555140,35218,15568,28.65,null,null,null,null,null,null,15563,3021018,0,5555140,4.07,false,"Execute CreateViewCommand;ReusedExchange;Subquery;ColumnarToRow",null],["TPC-DS Like Bench q39a","app-20220209231256-0045","Recommended",1.49,22102.22,10863.77,14136,4794226,32966,14136,24.49,null,null,null,null,null,null,14131,2998677,0,4794226,4.32,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q29","app-20220209230713-0035","Recommended",1.49,23597.91,11588.08,15912,10021701,35186,15912,44.09,null,null,null,null,null,null,15905,3057910,0,10021701,3.68,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q47","app-20220209231740-0054","Recommended",1.48,23520.63,11417.36,15246,8996925,34938,15160,35.78,null,null,null,null,null,null,15241,3107687,50299,8946626,4.05,false,"Execute CreateViewCommand;ReusedExchange;Filter;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q59","app-20220209232422-0066","Recommended",1.48,24246.78,11658.21,16091,6749831,35905,16091,34.65,null,null,null,null,null,null,16084,3068245,0,6749831,3.63,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench q6","app-20220209224544-0009","Recommended",1.46,22488.01,10526.98,13758,6335474,33015,13756,30.04,null,null,null,null,null,null,13753,2943126,863,6334611,4.26,false,"Subquery;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q80","app-20220209234532-0087","Recommended",1.46,25298.12,11841.87,16742,12630126,37140,15856,40.02,null,null,null,null,null,null,16735,3360633,668346,11961780,3.95,false,"Execute CreateViewCommand;ReusedExchange;HashAggregate;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q39b","app-20220209231330-0046","Recommended",1.46,22094.04,10341.95,13457,3807675,32436,13457,30.24,null,null,null,null,null,null,13451,2941727,0,3807675,4.32,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q57","app-20220209232314-0064","Recommended",1.46,22995.99,10722.0,14351,8374423,33718,14237,31.73,null,null,null,null,null,null,14345,2948771,66283,8308140,4.05,false,"Execute CreateViewCommand;ReusedExchange;Filter;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q1","app-20220209224147-0004","Recommended",1.46,21599.35,10007.64,13417,7598550,31607,13321,37.09,null,null,null,null,null,null,13412,3012015,54119,7544431,4.01,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow;Filter","DECIMAL"],["TPC-DS Like Bench q18","app-20220209225644-0022","Recommended",1.44,22216.88,9865.11,13492,7586670,32082,13492,33.42,null,null,null,null,null,null,13484,2962080,0,7586670,3.72,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q45","app-20220209231631-0052","Recommended",1.44,23723.45,10458.54,14455,5768757,34182,14154,33.74,null,null,null,null,null,null,14447,2957022,120068,5648689,3.83,false,"Execute CreateViewCommand;ReusedExchange;BroadcastHashJoin;ColumnarToRow",null],["TPC-DS Like Bench q17","app-20220209225607-0021","Recommended",1.43,24334.61,10564.38,14420,7818278,34899,14420,37.4,null,null,null,null,null,null,14412,3106844,0,7818278,3.74,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q25","app-20220209230506-0031","Recommended",1.43,21671.78,9370.21,12790,7060196,31042,12790,34.97,null,null,null,null,null,null,12784,3060435,0,7060196,3.74,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q49","app-20220209231846-0056","Recommended",1.42,22231.44,9476.55,12466,8785195,31708,12466,26.92,null,null,null,null,null,null,12448,3080539,0,8785195,4.17,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q46","app-20220209231707-0053","Recommended",1.42,22047.85,9385.14,12318,6163042,31433,12318,26.39,null,null,null,null,null,null,12312,3017041,0,6163042,4.2,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q10","app-20220209224756-0013","Recommended",1.42,24919.87,10489.12,15574,7745798,35409,14432,30.14,null,null,null,null,null,null,15567,3236768,567780,7178018,3.66,false,"Execute CreateViewCommand;SortMergeJoin;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q68","app-20220209233444-0075","Recommended",1.41,21674.52,9006.47,11821,5109423,30681,11821,20.54,null,null,null,null,null,null,11814,3004334,0,5109423,4.2,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q5","app-20220209224509-0008","Recommended",1.41,23548.42,9749.57,13729,8967631,33298,13729,41.35,null,null,null,null,null,null,13722,3186659,0,8967631,3.45,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q34","app-20220209231004-0040","Recommended",1.4,20675.69,8427.3,10842,5053339,29103,10842,27.34,null,null,null,null,null,null,10836,2994320,0,5053339,4.49,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q82","app-20220209234649-0089","Recommended",1.4,22206.53,8955.46,12212,7344489,31162,12212,39.29,null,null,null,null,null,null,12199,2973553,0,7344489,3.75,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q85","app-20220209234821-0092","Recommended",1.4,24121.11,9726.88,13468,7684101,33848,13468,29.91,null,null,null,null,null,null,13462,2949755,0,7684101,3.6,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q28","app-20220209230637-0034","Recommended",1.39,24599.41,9839.58,15464,14309580,34439,13823,33.04,null,null,null,null,null,null,15458,3008413,1518296,12791284,3.47,false,"AdaptiveSparkPlan;CollectLimit;HashAggregate;Execute CreateViewCommand;ColumnarToRow","merge_avg;merge_count"],["TPC-DS Like Bench q58","app-20220209232349-0065","Recommended",1.39,22489.0,8770.99,12322,5717106,31260,12322,34.17,null,null,null,null,null,null,12313,3102820,0,5717106,3.47,false,"Execute CreateViewCommand;Subquery;ColumnarToRow",null],["TPC-DS Like Bench q19","app-20220209225718-0023","Recommended",1.38,21689.15,8456.84,11373,5749051,30146,11373,23.22,null,null,null,null,null,null,11364,3161292,0,5749051,3.9,false,"Execute CreateViewCommand;ColumnarToRow",null],["TPC-DS Like Bench q61","app-20220209232531-0068","Recommended",1.38,23308.72,9017.27,12357,4376440,32326,12357,36.63,null,null,null,null,null,null,12349,3022176,0,4376440,3.7,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q71","app-20220209233627-0078","Recommended",1.38,21967.67,8440.32,11371,4987537,30408,11371,21.81,null,null,null,null,null,null,11363,3052139,0,4987537,3.88,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q22","app-20220209225845-0026","Recommended",1.38,22397.03,8535.96,12381,1736064,30933,12381,50.01,null,null,null,null,null,null,12376,2929875,0,1736064,3.22,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q70","app-20220209233555-0077","Recommended",1.37,21798.79,8233.2,10751,4816235,30032,10751,33.51,null,null,null,null,null,null,10746,3034688,0,4816235,4.26,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q83","app-20220209234722-0090","Recommended",1.36,21949.16,8010.83,10956,5253931,29960,10956,26.62,null,null,null,null,null,null,10949,2993826,0,5253931,3.72,false,"Execute CreateViewCommand;ColumnarToRow",null],["TPC-DS Like Bench q98","app-20220209235636-0105","Recommended",1.36,20487.86,7376.13,9674,3164505,27864,9674,21.36,null,null,null,null,null,null,9669,2953354,0,3164505,4.21,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q79","app-20220209234502-0086","Recommended",1.35,21073.77,7578.22,10344,5584295,28652,10344,29.69,null,null,null,null,null,null,10340,3007559,0,5584295,3.74,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q73","app-20220209233802-0080","Recommended",1.35,20143.11,7154.88,9205,3086301,27298,9205,27.46,null,null,null,null,null,null,9201,2929775,0,3086301,4.49,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q91","app-20220209235141-0098","Recommended",1.34,22090.61,7648.38,10351,3106198,29739,10351,23.11,null,null,null,null,null,null,10347,2997584,0,3106198,3.83,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q37","app-20220209231143-0043","Recommended",1.34,22130.6,7605.4,10371,5754398,29736,10371,38.21,null,null,null,null,null,null,10366,3003155,0,5754398,3.75,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q44","app-20220209231559-0051","Recommended",1.34,22359.33,7652.66,10956,7175937,30012,10347,29.11,null,null,null,null,null,null,10950,3029969,398712,6777225,3.84,false,"AdaptiveSparkPlan;Subquery;Execute CreateViewCommand;Filter;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q9","app-20220209224725-0012","Recommended",1.33,21873.81,7315.18,9829,8064543,29189,9829,35.84,null,null,null,null,null,null,9823,3021491,0,8064543,3.91,false,"Execute CreateViewCommand;AdaptiveSparkPlan;Subquery;ColumnarToRow",null],["TPC-DS Like Bench q40","app-20220209231405-0047","Recommended",1.33,24561.7,8167.29,12119,8004983,32729,11272,36.85,null,null,null,null,null,null,12110,3142013,558989,7445994,3.63,false,"Execute CreateViewCommand;ReusedExchange;HashAggregate;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q2","app-20220209224220-0005","Recommended",1.32,21301.46,6890.53,8966,4724046,28192,8966,38.76,null,null,null,null,null,null,8960,3025086,0,4724046,4.32,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench ss_max","app-20220209235735-0107","Recommended",1.31,20784.37,6539.62,9176,5331368,27324,8883,40.82,null,null,null,null,null,null,9171,3049122,169902,5161466,3.79,false,"Execute CreateViewCommand;AdaptiveSparkPlan;HashAggregate;ColumnarToRow","merge_count;merge_max"],["TPC-DS Like Bench q60","app-20220209232500-0067","Recommended",1.31,22250.37,6983.62,9811,3834676,29234,9811,19.92,null,null,null,null,null,null,9806,2939560,0,3834676,3.47,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q13","app-20220209224945-0016","Recommended",1.31,20407.71,6360.28,8816,4265966,26768,8816,34.5,null,null,null,null,null,null,8808,2951094,0,4265966,3.59,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q56","app-20220209232242-0063","Recommended",1.3,22798.87,7044.12,9896,3729466,29843,9896,14.44,null,null,null,null,null,null,9890,2971656,0,3729466,3.47,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q76","app-20220209234000-0083","Recommended",1.3,22630.64,6827.35,9835,6264831,29458,9835,33.9,null,null,null,null,null,null,9830,3037202,0,6264831,3.27,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench q33","app-20220209230935-0039","Recommended",1.3,21561.95,6491.04,9119,3032680,28053,9119,18.14,null,null,null,null,null,null,9111,2983234,0,3032680,3.47,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q88","app-20220209235013-0095","Recommended",1.3,23989.56,7197.43,9998,6687038,31187,9998,43.92,null,null,null,null,null,null,9987,3212440,0,6687038,3.57,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench q7","app-20220209224619-0010","Not Recommended",1.29,20663.5,6143.5,8936,4022166,26807,8936,35.88,null,null,null,null,null,null,8929,2959904,0,4022166,3.2,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q48","app-20220209231816-0055","Not Recommended",1.29,21310.47,6237.52,8514,3969649,27548,8514,33.42,null,null,null,null,null,null,8507,2990347,0,3969649,3.74,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q26","app-20220209230539-0032","Not Recommended",1.28,21556.18,6109.81,8887,4002441,27666,8887,36.79,null,null,null,null,null,null,8876,3012952,0,4002441,3.2,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q12","app-20220209224918-0015","Not Recommended",1.27,19624.36,5459.63,7584,1865587,25084,7584,23.82,null,null,null,null,null,null,7577,3102250,0,1865587,3.57,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q62","app-20220209232605-0069","Not Recommended",1.27,21448.22,5877.77,8574,4218821,27326,8574,36.47,null,null,null,null,null,null,8565,3017055,0,4218821,3.18,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench q20","app-20220209225749-0024","Not Recommended",1.26,21250.95,5641.04,7836,2040974,26892,7836,22.51,null,null,null,null,null,null,7829,3039094,0,2040974,3.57,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q99","app-20220209235705-0106","Not Recommended",1.25,22355.32,5801.67,8463,4558275,28157,8463,33.1,null,null,null,null,null,null,8455,2973149,0,4558275,3.18,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench q36","app-20220209231114-0042","Not Recommended",1.25,21356.73,5527.26,7756,3642750,26884,7756,30.08,null,null,null,null,null,null,7752,2905924,0,3642750,3.48,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q89","app-20220209235046-0096","Not Recommended",1.25,20969.23,5401.76,7869,4029740,26371,7615,24.99,null,null,null,null,null,null,7858,3012145,129765,3899975,3.44,false,"Execute CreateViewCommand;ReusedExchange;Filter;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q86","app-20220209234857-0093","Not Recommended",1.25,21140.77,5388.22,7493,3505441,26529,7493,29.09,null,null,null,null,null,null,7489,3240380,0,3505441,3.56,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q27","app-20220209230608-0033","Not Recommended",1.25,22114.89,5587.1,8150,3737103,27702,8150,29.62,null,null,null,null,null,null,8143,3067371,0,3737103,3.18,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q66","app-20220209232841-0073","Not Recommended",1.24,24291.91,5938.08,9771,5287383,30230,8612,35.68,null,null,null,null,null,null,9765,2922061,626680,4660703,3.22,false,"Execute CreateViewCommand;ReusedExchange;HashAggregate;ColumnarToRow","DecimalType"],["TPC-DS Like Bench q53","app-20220209232111-0060","Not Recommended",1.23,22160.97,5233.02,7622,3879496,27394,7368,25.54,null,null,null,null,null,null,7617,2905347,128795,3750701,3.45,false,"Execute CreateViewCommand;ReusedExchange;Filter;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q84","app-20220209234754-0091","Not Recommended",1.23,21195.3,4968.69,7129,3814060,26164,7129,40.65,null,null,null,null,null,null,7123,3029105,0,3814060,3.3,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench q63","app-20220209232634-0070","Not Recommended",1.23,21192.66,4957.33,7215,3490147,26150,6980,26.58,null,null,null,null,null,null,7207,2976838,113318,3376829,3.45,false,"Execute CreateViewCommand;ReusedExchange;Filter;ColumnarToRow","decimal;DecimalType"],["TPC-DS Like Bench q43","app-20220209231533-0050","Not Recommended",1.23,19958.18,4641.81,6660,3257940,24600,6660,29.65,null,null,null,null,null,null,6651,2961446,0,3257940,3.3,false,"Execute CreateViewCommand;ColumnarToRow",null],["TPC-DS Like Bench ss_maxb","app-20220209235804-0108","Not Recommended",1.23,19063.41,4414.58,5825,3798491,23478,5825,48.17,null,null,null,null,null,null,5819,3155711,0,3798491,4.13,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench q3","app-20220209224250-0006","Not Recommended",1.22,20089.36,4522.63,6489,2898373,24612,6489,26.88,null,null,null,null,null,null,6483,3094853,0,2898373,3.3,false,"Execute CreateViewCommand;ColumnarToRow",null],["TPC-DS Like Bench q21","app-20220209225818-0025","Not Recommended",1.22,20413.61,4531.38,6610,1072926,24945,6610,40.94,null,null,null,null,null,null,6605,3079474,0,1072926,3.18,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow",null],["TPC-DS Like Bench q55","app-20220209232217-0062","Not Recommended",1.22,19494.18,4296.81,6165,2612787,23791,6165,24.78,null,null,null,null,null,null,6158,2995446,0,2612787,3.3,false,"Execute CreateViewCommand;ColumnarToRow",null],["TPC-DS Like Bench q92","app-20220209235212-0099","Not Recommended",1.21,20741.45,4549.54,6384,2095601,25291,6123,25.07,null,null,null,null,null,null,6380,2967129,85419,2010182,3.89,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow;Filter","DECIMAL"],["TPC-DS Like Bench q90","app-20220209235114-0097","Not Recommended",1.21,20450.98,4350.01,6209,2604676,24801,6209,44.95,null,null,null,null,null,null,6204,2976499,0,2604676,3.34,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench q32","app-20220209230908-0038","Not Recommended",1.2,20973.26,4366.73,6107,2712962,25340,5909,25.21,null,null,null,null,null,null,6098,3048254,87623,2625339,3.83,false,"Execute CreateViewCommand;ReusedExchange;ColumnarToRow;Filter","DECIMAL"],["TPC-DS Like Bench q42","app-20220209231505-0049","Not Recommended",1.2,21414.78,4436.21,6365,2726759,25851,6365,23.15,null,null,null,null,null,null,6358,3047836,0,2726759,3.3,false,"Execute CreateViewCommand;ColumnarToRow",null],["TPC-DS Like Bench q52","app-20220209232045-0059","Not Recommended",1.19,20523.3,4071.69,5842,2683090,24595,5842,25.46,null,null,null,null,null,null,5827,3074975,0,2683090,3.3,false,"Execute CreateViewCommand;ColumnarToRow",null],["TPC-DS Like Bench q41","app-20220209231439-0048","Not Recommended",1.19,20533.93,4071.06,5649,161564,24605,5649,55.4,null,null,null,null,null,null,5642,2970757,0,161564,3.58,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["TPC-DS Like Bench q96","app-20220209235526-0103","Not Recommended",1.18,20189.67,3776.32,5324,2304428,23966,5324,44.32,null,null,null,null,null,null,5317,2947875,0,2304428,3.44,false,"Execute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRow",null],["DART-ALGO","application_1665146417445_0002","Not Recommended",1.04,375798.12,16253.87,44531,75900172,392052,23675,14.55,null,null,null,null,null,null,16579,58017590,35546441,40353731,3.19,false,"Scan hive ecomm_ops_tables.zzz_dart_browse_ads_prod_mod;Scan hive ecomm_ops_tables.s0s0jzb_browse_shelf_cat_map;CollectLimit",null],["DART-ALGO","application_1665146417445_0003","Not Recommended",1.0,690682.0,0.0,0,0,690682,0,0.0,null,null,null,null,null,null,0,0,0,0,1.0,false,null,null]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"App Name","type":"\"string\"","metadata":"{}"},{"name":"App ID","type":"\"string\"","metadata":"{}"},{"name":"Recommendation","type":"\"string\"","metadata":"{}"},{"name":"Estimated GPU Speedup","type":"\"double\"","metadata":"{}"},{"name":"Estimated GPU Duration","type":"\"double\"","metadata":"{}"},{"name":"Estimated GPU Time Saved","type":"\"double\"","metadata":"{}"},{"name":"SQL DF Duration","type":"\"long\"","metadata":"{}"},{"name":"SQL Dataframe Task Duration","type":"\"long\"","metadata":"{}"},{"name":"App Duration","type":"\"long\"","metadata":"{}"},{"name":"GPU Opportunity","type":"\"long\"","metadata":"{}"},{"name":"Executor CPU Time Percent","type":"\"double\"","metadata":"{}"},{"name":"SQL Ids with Failures","type":"\"double\"","metadata":"{}"},{"name":"Unsupported Read File Formats and Types","type":"\"double\"","metadata":"{}"},{"name":"Unsupported Write Data Format","type":"\"double\"","metadata":"{}"},{"name":"Complex Types","type":"\"double\"","metadata":"{}"},{"name":"Nested Complex Types","type":"\"double\"","metadata":"{}"},{"name":"Potential Problems","type":"\"double\"","metadata":"{}"},{"name":"Longest SQL Duration","type":"\"long\"","metadata":"{}"},{"name":"NONSQL Task Duration Plus Overhead","type":"\"long\"","metadata":"{}"},{"name":"Unsupported Task Duration","type":"\"long\"","metadata":"{}"},{"name":"Supported SQL DF Task Duration","type":"\"long\"","metadata":"{}"},{"name":"Task Speedup Factor","type":"\"double\"","metadata":"{}"},{"name":"App Duration Estimated","type":"\"boolean\"","metadata":"{}"},{"name":"Unsupported Execs","type":"\"string\"","metadata":"{}"},{"name":"Unsupported Expressions","type":"\"string\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
App NameApp IDRecommendationEstimated GPU SpeedupEstimated GPU DurationEstimated GPU Time SavedSQL DF DurationSQL Dataframe Task DurationApp DurationGPU OpportunityExecutor CPU Time PercentSQL Ids with FailuresUnsupported Read File Formats and TypesUnsupported Write Data FormatComplex TypesNested Complex TypesPotential ProblemsLongest SQL DurationNONSQL Task Duration Plus OverheadUnsupported Task DurationSupported SQL DF Task DurationTask Speedup FactorApp Duration EstimatedUnsupported ExecsUnsupported Expressions
TPC-DS Like Bench q14bapp-20220209225233-0018Strongly Recommended2.748971.5383400.461127082706696413237210979365.66nullnullnullnullnullnull1127012939275700037263669274.16falseHashAggregate;Subquery;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q14aapp-20220209225013-0017Strongly Recommended2.6651728.9686381.031171782874600013811011263664.69nullnullnullnullnullnull11717229789871114076276319244.29falseHashAggregate;Subquery;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q4app-20220209224316-0007Strongly Recommended2.6641856.0369720.9690167853247001115779016765.09nullnullnullnullnullnull9016330865160853247004.41falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q24bapp-20220209230348-0030Recommended2.3432581.0743720.925674827574691763025669460.89nullnullnullnullnullnull56741295063425998275486934.37falseAdaptiveSparkPlan;Subquery;Execute CreateViewCommand;Filter;ColumnarToRowdecimal
TPC-DS Like Bench q67app-20220209232913-0074Recommended2.27144720.72184416.273081851543719232913726530073.64nullnullnullnullnullnull30817430284692148108132890843.28falseExecute CreateViewCommand;ReusedExchange;HashAggregate;ColumnarToRowDecimalType
TPC-DS Like Bench q24aapp-20220209230232-0029Recommended2.2533029.2241483.775346927911960745135320260.14nullnullnullnullnullnull534553305140139193277727674.54falseAdaptiveSparkPlan;Subquery;Execute CreateViewCommand;Filter;ColumnarToRowdecimal
TPC-DS Like Bench q93app-20220209235239-0100Recommended2.1831203.4236894.575016629213056680985016664.73nullnullnullnullnullnull5016129730350292130563.78falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench q23aapp-20220209225917-0027Recommended2.1743196.9750617.027406845913641938146684064.81nullnullnullnullnullnull7406429752284480262414333794.12falseHashAggregate;Subquery;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q23bapp-20220209230053-0028Recommended2.0846588.1450761.857742259799857973506652666.43nullnullnullnullnullnull7741730119518415627513842304.22falseHashAggregate;Subquery;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRowDecimalType;decimal
TPC-DS Like Bench q72app-20220209233659-0079Recommended1.9730920.8830054.114170325434438609754170374.77nullnullnullnullnullnull4169429718870254344383.58falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q64app-20220209232701-0071Recommended1.9530544.6129103.383892531852357596483730155.12nullnullnullnullnullnull3891929879871328490305238674.55falseHashAggregate;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q78app-20220209234412-0085Recommended1.9424390.7922946.22909824753911473372909856.99nullnullnullnullnullnull2909029686970247539114.73falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q95app-20220209235427-0102Recommended1.929920.3826967.613767423337528568883552849.19nullnullnullnullnullnull3766729582161328886220086424.15falseExecute CreateViewCommand;AdaptiveSparkPlan;HashAggregate;ColumnarToRowmerge_sum
TPC-DS Like Bench q87app-20220209234925-0094Recommended1.8125518.220871.792627916348325463902627952.04nullnullnullnullnullnull2627229540660163483254.86falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q50app-20220209231919-0057Recommended1.7626735.8920549.12873616444045472852873652.87nullnullnullnullnullnull2873233392170164440453.51falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q97app-20220209235552-0104Recommended1.7624057.818398.192373111475611424562373158.69nullnullnullnullnullnull2372730094770114756114.45falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q75app-20220209233914-0082Recommended1.7425544.2618972.732493919831478445172493943.74nullnullnullnullnullnull2493329873060198314784.18falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q38app-20220209231214-0044Recommended1.7323047.0616910.932129215248682399582129248.81nullnullnullnullnullnull2128831676870152486824.86falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q31app-20220209230826-0037Recommended1.6823595.6916242.32040712617670398382040734.76nullnullnullnullnullnull2039929428300126176704.9falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q74app-20220209233831-0081Recommended1.6824668.0616781.932174716692240414502174746.93nullnullnullnullnullnull2174133252820166922404.38falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q11app-20220209224833-0014Recommended1.6226707.2416820.752420817615125435282214345.76nullnullnullnullnullnull2420529176421502045161130804.16falseExecute CreateViewCommand;ReusedExchange;HashAggregate;ColumnarToRowDecimalType
TPC-DS Like Bench q16app-20220209225524-0020Recommended1.6225717.3316006.662272618535920417242130644.67nullnullnullnullnullnull2272030287811157466173784544.01falseExecute CreateViewCommand;AdaptiveSparkPlan;HashAggregate;ColumnarToRowmerge_sum
TPC-DS Like Bench q51app-20220209232008-0058Recommended1.5921942.3513069.641692512278939350121692547.26nullnullnullnullnullnull1692029795070122789394.38falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q81app-20220209234611-0088Recommended1.5823125.5913612.41743710033526367381739336.22nullnullnullnullnullnull17431308374324955100085714.59falseExecute CreateViewCommand;ReusedExchange;ColumnarToRow;FilterDECIMAL
TPC-DS Like Bench q65app-20220209232803-0072Recommended1.5723403.5913469.41833210164071368731833246.41nullnullnullnullnullnull1832429418920101640713.77falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q30app-20220209230750-0036Recommended1.5621777.0612322.93160708447753341001602333.65nullnullnullnullnullnull1606329874802443584233184.33falseExecute CreateViewCommand;ReusedExchange;ColumnarToRow;FilterDECIMAL
TPC-DS Like Bench q15app-20220209225447-0019Recommended1.5223166.1212074.87159706770100352411597034.25nullnullnullnullnullnull159642923648067701004.09falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q35app-20220209231035-0041Recommended1.5124552.1312648.861829810027023372011701037.15nullnullnullnullnullnull18293305974770551093215133.9falseExecute CreateViewCommand;SortMergeJoin;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q8app-20220209224648-0011Recommended1.5123372.712016.29156916693324353891569120.01nullnullnullnullnullnull156863133963066933244.26falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q69app-20220209233517-0076Recommended1.524534.6412431.35165897246714369661658927.75nullnullnullnullnullnull165832963952072467143.99falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q94app-20220209235349-0101Recommended1.524361.4412284.551742413168326366461635241.87nullnullnullnullnullnull174163048502809952123583744.01falseExecute CreateViewCommand;AdaptiveSparkPlan;HashAggregate;ColumnarToRowmerge_sum
TPC-DS Like Bench q54app-20220209232140-0061Recommended1.523475.0611742.93155685555140352181556828.65nullnullnullnullnullnull155633021018055551404.07falseExecute CreateViewCommand;ReusedExchange;Subquery;ColumnarToRownull
TPC-DS Like Bench q39aapp-20220209231256-0045Recommended1.4922102.2210863.77141364794226329661413624.49nullnullnullnullnullnull141312998677047942264.32falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q29app-20220209230713-0035Recommended1.4923597.9111588.081591210021701351861591244.09nullnullnullnullnullnull1590530579100100217013.68falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q47app-20220209231740-0054Recommended1.4823520.6311417.36152468996925349381516035.78nullnullnullnullnullnull1524131076875029989466264.05falseExecute CreateViewCommand;ReusedExchange;Filter;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q59app-20220209232422-0066Recommended1.4824246.7811658.21160916749831359051609134.65nullnullnullnullnullnull160843068245067498313.63falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench q6app-20220209224544-0009Recommended1.4622488.0110526.98137586335474330151375630.04nullnullnullnullnullnull13753294312686363346114.26falseSubquery;Execute CreateViewCommand;Filter;ReusedExchange;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q80app-20220209234532-0087Recommended1.4625298.1211841.871674212630126371401585640.02nullnullnullnullnullnull167353360633668346119617803.95falseExecute CreateViewCommand;ReusedExchange;HashAggregate;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q39bapp-20220209231330-0046Recommended1.4622094.0410341.95134573807675324361345730.24nullnullnullnullnullnull134512941727038076754.32falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q57app-20220209232314-0064Recommended1.4622995.9910722.0143518374423337181423731.73nullnullnullnullnullnull1434529487716628383081404.05falseExecute CreateViewCommand;ReusedExchange;Filter;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q1app-20220209224147-0004Recommended1.4621599.3510007.64134177598550316071332137.09nullnullnullnullnullnull1341230120155411975444314.01falseExecute CreateViewCommand;ReusedExchange;ColumnarToRow;FilterDECIMAL
TPC-DS Like Bench q18app-20220209225644-0022Recommended1.4422216.889865.11134927586670320821349233.42nullnullnullnullnullnull134842962080075866703.72falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q45app-20220209231631-0052Recommended1.4423723.4510458.54144555768757341821415433.74nullnullnullnullnullnull14447295702212006856486893.83falseExecute CreateViewCommand;ReusedExchange;BroadcastHashJoin;ColumnarToRownull
TPC-DS Like Bench q17app-20220209225607-0021Recommended1.4324334.6110564.38144207818278348991442037.4nullnullnullnullnullnull144123106844078182783.74falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q25app-20220209230506-0031Recommended1.4321671.789370.21127907060196310421279034.97nullnullnullnullnullnull127843060435070601963.74falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q49app-20220209231846-0056Recommended1.4222231.449476.55124668785195317081246626.92nullnullnullnullnullnull124483080539087851954.17falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q46app-20220209231707-0053Recommended1.4222047.859385.14123186163042314331231826.39nullnullnullnullnullnull123123017041061630424.2falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q10app-20220209224756-0013Recommended1.4224919.8710489.12155747745798354091443230.14nullnullnullnullnullnull15567323676856778071780183.66falseExecute CreateViewCommand;SortMergeJoin;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q68app-20220209233444-0075Recommended1.4121674.529006.47118215109423306811182120.54nullnullnullnullnullnull118143004334051094234.2falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q5app-20220209224509-0008Recommended1.4123548.429749.57137298967631332981372941.35nullnullnullnullnullnull137223186659089676313.45falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q34app-20220209231004-0040Recommended1.420675.698427.3108425053339291031084227.34nullnullnullnullnullnull108362994320050533394.49falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q82app-20220209234649-0089Recommended1.422206.538955.46122127344489311621221239.29nullnullnullnullnullnull121992973553073444893.75falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q85app-20220209234821-0092Recommended1.424121.119726.88134687684101338481346829.91nullnullnullnullnullnull134622949755076841013.6falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q28app-20220209230637-0034Recommended1.3924599.419839.581546414309580344391382333.04nullnullnullnullnullnull1545830084131518296127912843.47falseAdaptiveSparkPlan;CollectLimit;HashAggregate;Execute CreateViewCommand;ColumnarToRowmerge_avg;merge_count
TPC-DS Like Bench q58app-20220209232349-0065Recommended1.3922489.08770.99123225717106312601232234.17nullnullnullnullnullnull123133102820057171063.47falseExecute CreateViewCommand;Subquery;ColumnarToRownull
TPC-DS Like Bench q19app-20220209225718-0023Recommended1.3821689.158456.84113735749051301461137323.22nullnullnullnullnullnull113643161292057490513.9falseExecute CreateViewCommand;ColumnarToRownull
TPC-DS Like Bench q61app-20220209232531-0068Recommended1.3823308.729017.27123574376440323261235736.63nullnullnullnullnullnull123493022176043764403.7falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q71app-20220209233627-0078Recommended1.3821967.678440.32113714987537304081137121.81nullnullnullnullnullnull113633052139049875373.88falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q22app-20220209225845-0026Recommended1.3822397.038535.96123811736064309331238150.01nullnullnullnullnullnull123762929875017360643.22falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q70app-20220209233555-0077Recommended1.3721798.798233.2107514816235300321075133.51nullnullnullnullnullnull107463034688048162354.26falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q83app-20220209234722-0090Recommended1.3621949.168010.83109565253931299601095626.62nullnullnullnullnullnull109492993826052539313.72falseExecute CreateViewCommand;ColumnarToRownull
TPC-DS Like Bench q98app-20220209235636-0105Recommended1.3620487.867376.139674316450527864967421.36nullnullnullnullnullnull96692953354031645054.21falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q79app-20220209234502-0086Recommended1.3521073.777578.22103445584295286521034429.69nullnullnullnullnullnull103403007559055842953.74falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q73app-20220209233802-0080Recommended1.3520143.117154.889205308630127298920527.46nullnullnullnullnullnull92012929775030863014.49falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q91app-20220209235141-0098Recommended1.3422090.617648.38103513106198297391035123.11nullnullnullnullnullnull103472997584031061983.83falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q37app-20220209231143-0043Recommended1.3422130.67605.4103715754398297361037138.21nullnullnullnullnullnull103663003155057543983.75falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q44app-20220209231559-0051Recommended1.3422359.337652.66109567175937300121034729.11nullnullnullnullnullnull10950302996939871267772253.84falseAdaptiveSparkPlan;Subquery;Execute CreateViewCommand;Filter;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q9app-20220209224725-0012Recommended1.3321873.817315.189829806454329189982935.84nullnullnullnullnullnull98233021491080645433.91falseExecute CreateViewCommand;AdaptiveSparkPlan;Subquery;ColumnarToRownull
TPC-DS Like Bench q40app-20220209231405-0047Recommended1.3324561.78167.29121198004983327291127236.85nullnullnullnullnullnull12110314201355898974459943.63falseExecute CreateViewCommand;ReusedExchange;HashAggregate;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q2app-20220209224220-0005Recommended1.3221301.466890.538966472404628192896638.76nullnullnullnullnullnull89603025086047240464.32falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench ss_maxapp-20220209235735-0107Recommended1.3120784.376539.629176533136827324888340.82nullnullnullnullnullnull9171304912216990251614663.79falseExecute CreateViewCommand;AdaptiveSparkPlan;HashAggregate;ColumnarToRowmerge_count;merge_max
TPC-DS Like Bench q60app-20220209232500-0067Recommended1.3122250.376983.629811383467629234981119.92nullnullnullnullnullnull98062939560038346763.47falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q13app-20220209224945-0016Recommended1.3120407.716360.288816426596626768881634.5nullnullnullnullnullnull88082951094042659663.59falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q56app-20220209232242-0063Recommended1.322798.877044.129896372946629843989614.44nullnullnullnullnullnull98902971656037294663.47falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q76app-20220209234000-0083Recommended1.322630.646827.359835626483129458983533.9nullnullnullnullnullnull98303037202062648313.27falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench q33app-20220209230935-0039Recommended1.321561.956491.049119303268028053911918.14nullnullnullnullnullnull91112983234030326803.47falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q88app-20220209235013-0095Recommended1.323989.567197.439998668703831187999843.92nullnullnullnullnullnull99873212440066870383.57falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench q7app-20220209224619-0010Not Recommended1.2920663.56143.58936402216626807893635.88nullnullnullnullnullnull89292959904040221663.2falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q48app-20220209231816-0055Not Recommended1.2921310.476237.528514396964927548851433.42nullnullnullnullnullnull85072990347039696493.74falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q26app-20220209230539-0032Not Recommended1.2821556.186109.818887400244127666888736.79nullnullnullnullnullnull88763012952040024413.2falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q12app-20220209224918-0015Not Recommended1.2719624.365459.637584186558725084758423.82nullnullnullnullnullnull75773102250018655873.57falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q62app-20220209232605-0069Not Recommended1.2721448.225877.778574421882127326857436.47nullnullnullnullnullnull85653017055042188213.18falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench q20app-20220209225749-0024Not Recommended1.2621250.955641.047836204097426892783622.51nullnullnullnullnullnull78293039094020409743.57falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q99app-20220209235705-0106Not Recommended1.2522355.325801.678463455827528157846333.1nullnullnullnullnullnull84552973149045582753.18falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench q36app-20220209231114-0042Not Recommended1.2521356.735527.267756364275026884775630.08nullnullnullnullnullnull77522905924036427503.48falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q89app-20220209235046-0096Not Recommended1.2520969.235401.767869402974026371761524.99nullnullnullnullnullnull7858301214512976538999753.44falseExecute CreateViewCommand;ReusedExchange;Filter;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q86app-20220209234857-0093Not Recommended1.2521140.775388.227493350544126529749329.09nullnullnullnullnullnull74893240380035054413.56falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q27app-20220209230608-0033Not Recommended1.2522114.895587.18150373710327702815029.62nullnullnullnullnullnull81433067371037371033.18falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q66app-20220209232841-0073Not Recommended1.2424291.915938.089771528738330230861235.68nullnullnullnullnullnull9765292206162668046607033.22falseExecute CreateViewCommand;ReusedExchange;HashAggregate;ColumnarToRowDecimalType
TPC-DS Like Bench q53app-20220209232111-0060Not Recommended1.2322160.975233.027622387949627394736825.54nullnullnullnullnullnull7617290534712879537507013.45falseExecute CreateViewCommand;ReusedExchange;Filter;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q84app-20220209234754-0091Not Recommended1.2321195.34968.697129381406026164712940.65nullnullnullnullnullnull71233029105038140603.3falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench q63app-20220209232634-0070Not Recommended1.2321192.664957.337215349014726150698026.58nullnullnullnullnullnull7207297683811331833768293.45falseExecute CreateViewCommand;ReusedExchange;Filter;ColumnarToRowdecimal;DecimalType
TPC-DS Like Bench q43app-20220209231533-0050Not Recommended1.2319958.184641.816660325794024600666029.65nullnullnullnullnullnull66512961446032579403.3falseExecute CreateViewCommand;ColumnarToRownull
TPC-DS Like Bench ss_maxbapp-20220209235804-0108Not Recommended1.2319063.414414.585825379849123478582548.17nullnullnullnullnullnull58193155711037984914.13falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench q3app-20220209224250-0006Not Recommended1.2220089.364522.636489289837324612648926.88nullnullnullnullnullnull64833094853028983733.3falseExecute CreateViewCommand;ColumnarToRownull
TPC-DS Like Bench q21app-20220209225818-0025Not Recommended1.2220413.614531.386610107292624945661040.94nullnullnullnullnullnull66053079474010729263.18falseExecute CreateViewCommand;ReusedExchange;ColumnarToRownull
TPC-DS Like Bench q55app-20220209232217-0062Not Recommended1.2219494.184296.816165261278723791616524.78nullnullnullnullnullnull61582995446026127873.3falseExecute CreateViewCommand;ColumnarToRownull
TPC-DS Like Bench q92app-20220209235212-0099Not Recommended1.2120741.454549.546384209560125291612325.07nullnullnullnullnullnull638029671298541920101823.89falseExecute CreateViewCommand;ReusedExchange;ColumnarToRow;FilterDECIMAL
TPC-DS Like Bench q90app-20220209235114-0097Not Recommended1.2120450.984350.016209260467624801620944.95nullnullnullnullnullnull62042976499026046763.34falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench q32app-20220209230908-0038Not Recommended1.220973.264366.736107271296225340590925.21nullnullnullnullnullnull609830482548762326253393.83falseExecute CreateViewCommand;ReusedExchange;ColumnarToRow;FilterDECIMAL
TPC-DS Like Bench q42app-20220209231505-0049Not Recommended1.221414.784436.216365272675925851636523.15nullnullnullnullnullnull63583047836027267593.3falseExecute CreateViewCommand;ColumnarToRownull
TPC-DS Like Bench q52app-20220209232045-0059Not Recommended1.1920523.34071.695842268309024595584225.46nullnullnullnullnullnull58273074975026830903.3falseExecute CreateViewCommand;ColumnarToRownull
TPC-DS Like Bench q41app-20220209231439-0048Not Recommended1.1920533.934071.06564916156424605564955.4nullnullnullnullnullnull5642297075701615643.58falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
TPC-DS Like Bench q96app-20220209235526-0103Not Recommended1.1820189.673776.325324230442823966532444.32nullnullnullnullnullnull53172947875023044283.44falseExecute CreateViewCommand;AdaptiveSparkPlan;ColumnarToRownull
DART-ALGOapplication_1665146417445_0002Not Recommended1.04375798.1216253.8744531759001723920522367514.55nullnullnullnullnullnull165795801759035546441403537313.19falseScan hive ecomm_ops_tables.zzz_dart_browse_ads_prod_mod;Scan hive ecomm_ops_tables.s0s0jzb_browse_shelf_cat_map;CollectLimitnull
DART-ALGOapplication_1665146417445_0003Not Recommended1.0690682.00.00069068200.0nullnullnullnullnullnull00001.0falsenullnull
"]}}],"execution_count":0},{"cell_type":"markdown","source":["## Stages Output"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"6756159b-30ca-407a-ab6b-9c29ced01ea6","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["stages_output=pd.read_csv(outputpath_string + \"/rapids_4_spark_qualification_output/rapids_4_spark_qualification_output_stages.csv\")\ndisplay(stages_output)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"cdde6177-db5f-434a-995b-776678a64a3a","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":true,"datasetInfos":[],"data":[["app-20220209224509-0008",31,2.95,1184,0,false],["app-20220209224509-0008",33,2.9,1086,0,false],["app-20220209224509-0008",35,3.37,2321523,0,false],["app-20220209224509-0008",41,3.9,172648,0,false],["app-20220209224509-0008",39,5.72,4586824,0,false],["app-20220209224509-0008",38,3.36,694337,0,false],["app-20220209224509-0008",40,4.26,656835,0,false],["app-20220209224509-0008",37,3.36,524190,0,false],["app-20220209224509-0008",32,2.9,641,0,false],["app-20220209224509-0008",36,2.73,7065,0,false],["app-20220209224509-0008",42,3.0,218,0,false],["app-20220209224509-0008",34,2.9,1080,0,false],["app-20220209235114-0097",39,2.71,0,0,true],["app-20220209235114-0097",40,3.54,413,0,false],["app-20220209235114-0097",34,2.95,964,0,false],["app-20220209235114-0097",37,2.71,0,0,true],["app-20220209235114-0097",41,3.0,365,0,false],["app-20220209235114-0097",31,2.95,1058,0,false],["app-20220209235114-0097",32,2.95,694,0,false],["app-20220209235114-0097",35,3.68,2142147,0,false],["app-20220209235114-0097",38,4.34,271,0,false],["app-20220209235114-0097",36,3.68,457864,0,false],["app-20220209235114-0097",33,2.95,900,0,false],["app-20220209230506-0031",35,3.33,93394,0,false],["app-20220209230506-0031",36,3.33,239863,0,false],["app-20220209230506-0031",38,6.91,2696172,0,false],["app-20220209230506-0031",37,3.33,1684494,0,false],["app-20220209230506-0031",40,3.9,205018,0,false],["app-20220209230506-0031",32,2.9,7530,0,false],["app-20220209230506-0031",41,3.0,210,0,false],["app-20220209230506-0031",39,5.67,2129775,0,false],["app-20220209230506-0031",34,2.95,1198,0,false],["app-20220209230506-0031",31,2.95,1284,0,false],["app-20220209230506-0031",33,2.9,1258,0,false],["app-20220209232634-0070",32,2.9,1046,0,false],["app-20220209232634-0070",34,3.72,2226056,0,false],["app-20220209232634-0070",31,2.95,6677,0,false],["app-20220209232634-0070",33,2.95,672,0,false],["app-20220209232634-0070",37,3.0,210,0,false],["app-20220209232634-0070",35,4.3,688894,0,false],["app-20220209232634-0070",36,4.3,566592,113318,false],["app-20220209225845-0026",36,3.0,303,0,false],["app-20220209225845-0026",32,2.9,5690,0,false],["app-20220209225845-0026",31,2.95,1181,0,false],["app-20220209225845-0026",34,3.68,621736,0,false],["app-20220209225845-0026",33,2.9,894,0,false],["app-20220209225845-0026",35,3.9,1106260,0,false],["app-20220209235526-0103",34,3.68,2301205,0,false],["app-20220209235526-0103",31,2.95,1051,0,false],["app-20220209235526-0103",33,2.95,875,0,false],["app-20220209235526-0103",32,2.95,676,0,false],["app-20220209235526-0103",36,4.69,621,0,false],["app-20220209235526-0103",35,2.6,0,0,true],["app-20220209231919-0057",35,3.33,6655624,0,false],["app-20220209231919-0057",36,5.78,9297072,0,false],["app-20220209231919-0057",38,3.0,228,0,false],["app-20220209231919-0057",31,2.9,711,0,false],["app-20220209231919-0057",37,3.9,354848,0,false],["app-20220209231919-0057",34,3.33,134143,0,false],["app-20220209231919-0057",32,2.95,724,0,false],["app-20220209231919-0057",33,2.9,695,0,false],["app-20220209231533-0050",33,3.71,2489960,0,false],["app-20220209231533-0050",34,3.9,765614,0,false],["app-20220209231533-0050",35,3.0,246,0,false],["app-20220209231533-0050",32,2.95,1024,0,false],["app-20220209231533-0050",31,2.95,1096,0,false],["application_1665146417445_0002",4,4.5,233,0,false],["application_1665146417445_0002",3,4.34,2893207,0,false],["application_1665146417445_0002",2,2.6,14571021,7285510,false],["application_1665146417445_0002",1,2.0,51972027,25986013,false],["application_1665146417445_0002",7,4.5,244,0,false],["application_1665146417445_0002",6,3.98,1918109,0,false],["application_1665146417445_0002",5,2.6,4540826,2270413,false],["application_1665146417445_0002",0,1.0,4505,4505,false],["app-20220209230053-0028",40,3.71,4979300,0,false],["app-20220209230053-0028",42,3.94,517898,0,false],["app-20220209230053-0028",38,4.34,53,0,false],["app-20220209230053-0028",44,7.76,730644,0,false],["app-20220209230053-0028",54,3.0,221,0,false],["app-20220209230053-0028",35,3.33,4618718,0,false],["app-20220209230053-0028",36,3.33,59206,0,false],["app-20220209230053-0028",50,7.76,661105,0,false],["app-20220209230053-0028",43,3.33,25052,0,false],["app-20220209230053-0028",37,5.73,8697022,1449502,false],["app-20220209230053-0028",39,2.95,77,0,false],["app-20220209230053-0028",53,2.68,456328,182530,false],["app-20220209230053-0028",45,3.33,34900,0,false],["app-20220209230053-0028",51,8.28,13701110,2997113,false],["app-20220209230053-0028",31,2.95,701,0,false],["app-20220209230053-0028",46,3.37,2366404,0,false],["app-20220209230053-0028",52,8.28,17309649,3786482,false],["app-20220209230053-0028",32,2.9,5351,0,false],["app-20220209230053-0028",34,2.95,764,0,false],["app-20220209230053-0028",33,2.95,1153,0,false],["app-20220209230053-0028",48,3.33,28729,0,false],["app-20220209230053-0028",49,3.94,509837,0,false],["app-20220209230053-0028",41,3.33,23824,0,false],["app-20220209230053-0028",47,3.71,5071811,0,false],["app-20220209230750-0036",42,5.98,600422,0,false],["app-20220209230750-0036",34,3.61,743462,0,false],["app-20220209230750-0036",41,6.33,219915,24435,false],["app-20220209230750-0036",32,2.95,1026,0,false],["app-20220209230750-0036",40,3.33,216977,0,false],["app-20220209230750-0036",33,3.33,31565,0,false],["app-20220209230750-0036",31,2.95,22333,0,false],["app-20220209230750-0036",38,4.01,796870,0,false],["app-20220209230750-0036",39,4.3,579941,0,false],["app-20220209230750-0036",35,6.45,1095379,0,false],["app-20220209230750-0036",37,6.45,3390912,0,false],["app-20220209230750-0036",43,3.0,317,0,false],["app-20220209230750-0036",36,3.61,748634,0,false],["app-20220209224725-0012",60,1.06,0,0,true],["app-20220209224725-0012",48,1.06,0,0,true],["app-20220209224725-0012",67,4.34,116,0,false],["app-20220209224725-0012",39,3.54,321010,0,false],["app-20220209224725-0012",57,4.34,355,0,false],["app-20220209224725-0012",47,4.34,403,0,false],["app-20220209224725-0012",70,1.06,0,0,true],["app-20220209224725-0012",53,4.34,319,0,false],["app-20220209224725-0012",38,3.54,417745,0,false],["app-20220209224725-0012",52,1.06,0,0,true],["app-20220209224725-0012",32,3.54,459002,0,false],["app-20220209224725-0012",74,1.06,0,0,true],["app-20220209224725-0012",61,4.34,351,0,false],["app-20220209224725-0012",76,2.95,345,0,false],["app-20220209224725-0012",44,3.54,715730,0,false],["app-20220209224725-0012",45,3.54,301672,0,false],["app-20220209224725-0012",33,3.54,270046,0,false],["app-20220209224725-0012",58,1.06,0,0,true],["app-20220209224725-0012",63,4.34,493,0,false],["app-20220209224725-0012",66,1.06,0,0,true],["app-20220209224725-0012",69,4.34,60,0,false],["app-20220209224725-0012",75,4.34,238,0,false],["app-20220209224725-0012",62,1.06,0,0,true],["app-20220209224725-0012",73,4.34,229,0,false],["app-20220209224725-0012",64,1.06,0,0,true],["app-20220209224725-0012",46,1.06,0,0,true],["app-20220209224725-0012",71,4.34,230,0,false],["app-20220209224725-0012",65,4.34,391,0,false],["app-20220209224725-0012",31,3.54,2284766,0,false],["app-20220209224725-0012",55,4.34,359,0,false],["app-20220209224725-0012",40,3.54,444891,0,false],["app-20220209224725-0012",50,1.06,0,0,true],["app-20220209224725-0012",54,1.06,0,0,true],["app-20220209224725-0012",36,3.54,591557,0,false],["app-20220209224725-0012",34,3.54,312789,0,false],["app-20220209224725-0012",49,4.34,392,0,false],["app-20220209224725-0012",42,3.54,493357,0,false],["app-20220209224725-0012",72,1.06,0,0,true],["app-20220209224725-0012",37,3.54,435568,0,false],["app-20220209224725-0012",51,4.34,407,0,false],["app-20220209224725-0012",68,1.06,0,0,true],["app-20220209224725-0012",59,4.34,408,0,false],["app-20220209224725-0012",56,1.06,0,0,true],["app-20220209224725-0012",41,3.54,318752,0,false],["app-20220209224725-0012",35,3.54,415493,0,false],["app-20220209224725-0012",43,3.54,277069,0,false],["app-20220209233831-0081",44,3.94,417661,0,false],["app-20220209233831-0081",43,4.3,441931,0,false],["app-20220209233831-0081",47,3.0,315,0,false],["app-20220209233831-0081",40,3.33,2196010,0,false],["app-20220209233831-0081",33,3.33,254652,0,false],["app-20220209233831-0081",45,4.3,487701,0,false],["app-20220209233831-0081",32,2.9,734,0,false],["app-20220209233831-0081",34,3.33,580229,0,false],["app-20220209233831-0081",31,2.9,720,0,false],["app-20220209233831-0081",39,6.04,2047617,0,false],["app-20220209233831-0081",38,3.33,608034,0,false],["app-20220209233831-0081",42,4.01,439284,0,false],["app-20220209233831-0081",46,8.35,1560260,0,false],["app-20220209233831-0081",41,6.04,1630341,0,false],["app-20220209233831-0081",35,6.04,1807228,0,false],["app-20220209233831-0081",37,6.04,3659231,0,false],["app-20220209233831-0081",36,3.33,560292,0,false],["app-20220209231114-0042",31,2.95,922,0,false],["app-20220209231114-0042",36,4.55,511528,0,false],["app-20220209231114-0042",37,3.0,210,0,false],["app-20220209231114-0042",35,4.3,609916,0,false],["app-20220209231114-0042",33,2.9,5804,0,false],["app-20220209231114-0042",34,3.68,2513313,0,false],["app-20220209231114-0042",32,2.95,1057,0,false],["app-20220209235046-0096",37,3.0,259,0,false],["app-20220209235046-0096",35,4.3,965075,0,false],["app-20220209235046-0096",32,2.9,6405,0,false],["app-20220209235046-0096",33,2.95,1182,0,false],["app-20220209235046-0096",34,3.72,2407080,0,false],["app-20220209235046-0096",36,4.3,648825,129765,false],["app-20220209235046-0096",31,2.9,914,0,false],["app-20220209231505-0049",32,2.95,5516,0,false],["app-20220209231505-0049",34,3.9,641427,0,false],["app-20220209231505-0049",35,3.0,248,0,false],["app-20220209231505-0049",31,2.95,976,0,false],["app-20220209231505-0049",33,3.71,2078592,0,false],["app-20220209225818-0025",33,2.95,6013,0,false],["app-20220209225818-0025",36,3.0,544,0,false],["app-20220209225818-0025",31,2.9,1361,0,false],["app-20220209225818-0025",32,2.9,1240,0,false],["app-20220209225818-0025",35,3.62,1015964,0,false],["app-20220209225818-0025",34,3.72,47804,0,false],["app-20220209225607-0021",38,3.33,387672,0,false],["app-20220209225607-0021",34,2.9,6157,0,false],["app-20220209225607-0021",35,3.33,1378114,0,false],["app-20220209225607-0021",37,6.91,3272073,0,false],["app-20220209225607-0021",31,2.95,714,0,false],["app-20220209225607-0021",40,3.9,201893,0,false],["app-20220209225607-0021",39,5.67,1946956,0,false],["app-20220209225607-0021",33,2.9,1214,0,false],["app-20220209225607-0021",36,3.33,622516,0,false],["app-20220209225607-0021",32,2.95,700,0,false],["app-20220209225607-0021",41,3.0,269,0,false],["app-20220209225749-0024",32,2.9,6036,0,false],["app-20220209225749-0024",33,3.71,359383,0,false],["app-20220209225749-0024",31,2.95,1315,0,false],["app-20220209225749-0024",35,4.55,715482,0,false],["app-20220209225749-0024",34,4.3,958227,0,false],["app-20220209225749-0024",36,3.0,531,0,false],["app-20220209231439-0048",31,3.54,8109,0,false],["app-20220209231439-0048",36,3.9,65909,0,false],["app-20220209231439-0048",37,3.0,683,0,false],["app-20220209231439-0048",32,2.6,0,0,true],["app-20220209231439-0048",33,3.82,83422,0,false],["app-20220209231439-0048",35,2.6,0,0,true],["app-20220209231439-0048",34,3.63,3441,0,false],["app-20220209232045-0059",31,2.95,1017,0,false],["app-20220209232045-0059",32,2.95,5391,0,false],["app-20220209232045-0059",35,3.0,269,0,false],["app-20220209232045-0059",33,3.71,1986094,0,false],["app-20220209232045-0059",34,3.9,690319,0,false],["app-20220209224648-0011",32,2.9,1241,0,false],["app-20220209224648-0011",40,3.67,1155731,0,false],["app-20220209224648-0011",31,2.95,1005,0,false],["app-20220209224648-0011",37,3.94,1180107,0,false],["app-20220209224648-0011",41,6.45,356915,0,false],["app-20220209224648-0011",33,3.37,217326,0,false],["app-20220209224648-0011",43,3.0,199,0,false],["app-20220209224648-0011",42,3.9,139846,0,false],["app-20220209224648-0011",36,3.33,37191,0,false],["app-20220209224648-0011",38,7.86,449220,0,false],["app-20220209224648-0011",39,4.3,110154,0,false],["app-20220209224648-0011",34,3.33,39348,0,false],["app-20220209224648-0011",35,6.45,3005041,0,false],["app-20220209224756-0013",38,6.27,5393922,567780,false],["app-20220209224756-0013",40,3.0,247,0,false],["app-20220209224756-0013",36,3.75,154489,0,false],["app-20220209224756-0013",34,3.75,1406700,0,false],["app-20220209224756-0013",31,2.9,2548,0,false],["app-20220209224756-0013",32,2.95,852,0,false],["app-20220209224756-0013",35,3.33,65257,0,false],["app-20220209224756-0013",33,2.95,22123,0,false],["app-20220209224756-0013",39,3.9,549588,0,false],["app-20220209224756-0013",37,3.75,150072,0,false],["app-20220209235141-0098",39,4.34,314408,0,false],["app-20220209235141-0098",42,2.78,0,0,true],["app-20220209235141-0098",34,2.9,1104,0,false],["app-20220209235141-0098",37,3.33,123845,0,false],["app-20220209235141-0098",38,5.78,2429250,0,false],["app-20220209235141-0098",31,2.95,1242,0,false],["app-20220209235141-0098",43,4.3,145210,0,false],["app-20220209235141-0098",36,3.67,54739,0,false],["app-20220209235141-0098",40,2.78,0,0,true],["app-20220209235141-0098",32,2.95,20611,0,false],["app-20220209235141-0098",33,2.95,957,0,false],["app-20220209235141-0098",41,2.78,0,0,true],["app-20220209235141-0098",44,6.1,12646,0,false],["app-20220209235141-0098",35,2.9,2186,0,false],["app-20220209231256-0045",32,2.9,838,0,false],["app-20220209231256-0045",33,2.9,6217,0,false],["app-20220209231256-0045",41,2.64,0,0,true],["app-20220209231256-0045",35,3.72,33955,0,false],["app-20220209231256-0045",42,2.64,0,0,true],["app-20220209231256-0045",37,3.72,33154,0,false],["app-20220209231256-0045",31,2.95,700,0,false],["app-20220209231256-0045",44,6.91,506140,0,false],["app-20220209231256-0045",36,3.94,393170,0,false],["app-20220209231256-0045",34,2.95,945,0,false],["app-20220209231256-0045",40,2.64,0,0,true],["app-20220209231256-0045",43,2.64,0,0,true],["app-20220209231256-0045",38,3.94,1744813,0,false],["app-20220209231256-0045",45,6.1,1050573,0,false],["app-20220209231256-0045",39,7.45,1023721,0,false],["app-20220209224316-0007",48,4.3,487756,0,false],["app-20220209224316-0007",34,3.33,279385,0,false],["app-20220209224316-0007",36,3.33,805680,0,false],["app-20220209224316-0007",38,3.33,1127786,0,false],["app-20220209224316-0007",47,3.94,431055,0,false],["app-20220209224316-0007",45,6.04,13349286,0,false],["app-20220209224316-0007",35,6.04,19573046,0,false],["app-20220209224316-0007",31,2.9,1186,0,false],["app-20220209224316-0007",41,6.04,9850301,0,false],["app-20220209224316-0007",53,3.0,241,0,false],["app-20220209224316-0007",39,6.04,18402446,0,false],["app-20220209224316-0007",42,3.33,393456,0,false],["app-20220209224316-0007",50,4.3,512640,0,false],["app-20220209224316-0007",44,3.33,2478797,0,false],["app-20220209224316-0007",43,6.04,5018114,0,false],["app-20220209224316-0007",40,3.33,733210,0,false],["app-20220209224316-0007",51,4.3,515369,0,false],["app-20220209224316-0007",46,3.94,770947,0,false],["app-20220209224316-0007",32,2.9,707,0,false],["app-20220209224316-0007",52,8.35,2747585,0,false],["app-20220209224316-0007",33,3.33,1830306,0,false],["app-20220209224316-0007",37,6.04,5448378,0,false],["app-20220209224316-0007",49,4.01,567023,0,false],["app-20220209234754-0091",31,3.37,2792403,0,false],["app-20220209234754-0091",36,3.7,55108,0,false],["app-20220209234754-0091",38,4.2,217327,0,false],["app-20220209234754-0091",34,2.95,520,0,false],["app-20220209234754-0091",35,2.95,12240,0,false],["app-20220209234754-0091",39,2.78,0,0,true],["app-20220209234754-0091",37,2.78,0,0,true],["app-20220209234754-0091",33,2.9,860,0,false],["app-20220209234754-0091",40,3.75,734901,0,false],["app-20220209234754-0091",41,3.0,346,0,false],["app-20220209234754-0091",32,2.9,355,0,false],["app-20220209232242-0063",32,2.95,22511,0,false],["app-20220209232242-0063",35,3.72,474053,0,false],["app-20220209232242-0063",37,3.72,178166,0,false],["app-20220209232242-0063",39,3.9,277181,0,false],["app-20220209232242-0063",38,4.34,2418570,0,false],["app-20220209232242-0063",40,3.0,279,0,false],["app-20220209232242-0063",31,2.95,760,0,false],["app-20220209232242-0063",36,3.72,348149,0,false],["app-20220209232242-0063",34,3.48,4301,0,false],["app-20220209232242-0063",33,2.95,5496,0,false],["app-20220209232500-0067",36,3.72,850479,0,false],["app-20220209232500-0067",35,3.72,934763,0,false],["app-20220209232500-0067",37,3.72,63271,0,false],["app-20220209232500-0067",40,3.0,243,0,false],["app-20220209232500-0067",31,2.95,1000,0,false],["app-20220209232500-0067",34,3.48,3841,0,false],["app-20220209232500-0067",33,2.95,5817,0,false],["app-20220209232500-0067",32,2.95,23002,0,false],["app-20220209232500-0067",38,4.34,1706437,0,false],["app-20220209232500-0067",39,3.9,245823,0,false],["app-20220209234532-0087",31,2.95,1378,0,false],["app-20220209234532-0087",44,7.85,2042645,127665,false],["app-20220209234532-0087",41,3.33,1154273,0,false],["app-20220209234532-0087",42,3.37,761369,0,false],["app-20220209234532-0087",47,3.9,167144,0,false],["app-20220209234532-0087",34,2.9,730,0,false],["app-20220209234532-0087",40,3.37,853020,0,false],["app-20220209234532-0087",33,2.9,914,0,false],["app-20220209234532-0087",38,3.33,89863,0,false],["app-20220209234532-0087",43,7.85,1710173,106885,false],["app-20220209234532-0087",48,3.0,220,0,false],["app-20220209234532-0087",45,7.85,3459742,216233,false],["app-20220209234532-0087",39,3.33,494266,0,false],["app-20220209234532-0087",46,2.94,652694,217563,false],["app-20220209234532-0087",35,2.9,1036,0,false],["app-20220209234532-0087",32,2.95,1383,0,false],["app-20220209234532-0087",36,2.95,5670,0,false],["app-20220209234532-0087",37,3.37,1233606,0,false],["app-20220209232841-0073",35,3.61,3266643,272220,false],["app-20220209232841-0073",34,2.9,1104,0,false],["app-20220209232841-0073",37,3.18,831509,277168,false],["app-20220209232841-0073",36,3.61,927511,77292,false],["app-20220209232841-0073",31,2.95,984,0,false],["app-20220209232841-0073",32,2.95,882,0,false],["app-20220209232841-0073",33,2.9,709,0,false],["app-20220209232841-0073",39,3.0,264,0,false],["app-20220209232841-0073",38,3.9,257777,0,false],["app-20220209234412-0085",38,7.85,4660460,0,false],["app-20220209234412-0085",37,3.37,500540,0,false],["app-20220209234412-0085",42,3.0,273,0,false],["app-20220209234412-0085",39,7.85,1163782,0,false],["app-20220209234412-0085",41,7.79,6766750,0,false],["app-20220209234412-0085",36,2.73,3065804,0,false],["app-20220209234412-0085",40,7.85,5326278,0,false],["app-20220209234412-0085",32,3.33,1206608,0,false],["app-20220209234412-0085",31,2.9,1128,0,false],["app-20220209234412-0085",35,3.37,480342,0,false],["app-20220209234412-0085",33,3.37,1044334,0,false],["app-20220209234412-0085",34,3.33,537612,0,false],["app-20220209224220-0005",36,4.2,89436,0,false],["app-20220209224220-0005",31,2.9,736,0,false],["app-20220209224220-0005",44,2.8,0,0,true],["app-20220209224220-0005",41,2.8,0,0,true],["app-20220209224220-0005",38,2.8,0,0,true],["app-20220209224220-0005",37,2.8,0,0,true],["app-20220209224220-0005",43,2.8,0,0,true],["app-20220209224220-0005",34,3.4,4520914,0,false],["app-20220209224220-0005",32,2.95,692,0,false],["app-20220209224220-0005",33,2.95,898,0,false],["app-20220209224220-0005",45,2.8,0,0,true],["app-20220209224220-0005",46,4.84,12730,0,false],["app-20220209224220-0005",39,6.88,73927,0,false],["app-20220209224220-0005",35,2.8,0,0,true],["app-20220209224220-0005",42,6.43,24713,0,false],["app-20220209224220-0005",40,2.8,0,0,true],["app-20220209232531-0068",44,3.0,353,0,false],["app-20220209232531-0068",37,3.33,32522,0,false],["app-20220209232531-0068",42,5.87,716505,0,false],["app-20220209232531-0068",31,2.95,817,0,false],["app-20220209232531-0068",35,2.95,985,0,false],["app-20220209232531-0068",38,5.87,2346453,0,false],["app-20220209232531-0068",32,2.95,1101,0,false],["app-20220209232531-0068",36,3.67,988849,0,false],["app-20220209232531-0068",43,3.54,125,0,false],["app-20220209232531-0068",39,4.34,77,0,false],["app-20220209232531-0068",34,2.95,22737,0,false],["app-20220209232531-0068",33,2.95,5981,0,false],["app-20220209232531-0068",41,2.82,0,0,true],["app-20220209232531-0068",40,3.69,259935,0,false],["app-20220209234611-0088",41,3.33,42782,0,false],["app-20220209234611-0088",40,3.33,49031,0,false],["app-20220209234611-0088",44,3.0,289,0,false],["app-20220209234611-0088",32,3.33,45314,0,false],["app-20220209234611-0088",35,3.61,1416368,0,false],["app-20220209234611-0088",36,6.45,1079908,0,false],["app-20220209234611-0088",38,4.3,959653,0,false],["app-20220209234611-0088",34,6.45,3784569,0,false],["app-20220209234611-0088",37,4.01,552872,0,false],["app-20220209234611-0088",33,3.61,813372,0,false],["app-20220209234611-0088",43,6.71,479127,0,false],["app-20220209234611-0088",42,6.91,584929,0,false],["app-20220209234611-0088",39,6.33,224600,24955,false],["app-20220209234611-0088",31,2.95,712,0,false],["app-20220209233802-0080",33,2.95,907,0,false],["app-20220209233802-0080",39,2.71,0,0,true],["app-20220209233802-0080",36,4.01,709516,0,false],["app-20220209233802-0080",38,2.71,0,0,true],["app-20220209233802-0080",32,2.95,1154,0,false],["app-20220209233802-0080",41,6.91,176406,0,false],["app-20220209233802-0080",34,3.33,265848,0,false],["app-20220209233802-0080",42,6.1,86051,0,false],["app-20220209233802-0080",40,2.71,0,0,true],["app-20220209233802-0080",35,3.72,1422775,0,false],["app-20220209233802-0080",31,2.95,712,0,false],["app-20220209233802-0080",37,7.45,422932,0,false],["app-20220209232701-0071",67,2.75,0,0,true],["app-20220209232701-0071",39,2.9,969,0,false],["app-20220209232701-0071",81,6.91,165236,0,false],["app-20220209232701-0071",79,2.75,0,0,true],["app-20220209232701-0071",80,2.75,0,0,true],["app-20220209232701-0071",73,2.75,0,0,true],["app-20220209232701-0071",41,3.37,807694,0,false],["app-20220209232701-0071",74,2.75,0,0,true],["app-20220209232701-0071",32,2.9,721,0,false],["app-20220209232701-0071",50,6.91,1940780,0,false],["app-20220209232701-0071",36,2.9,2302,0,false],["app-20220209232701-0071",35,2.9,753,0,false],["app-20220209232701-0071",68,2.75,0,0,true],["app-20220209232701-0071",42,3.37,4629150,0,false],["app-20220209232701-0071",64,2.75,0,0,true],["app-20220209232701-0071",60,7.45,206857,0,false],["app-20220209232701-0071",66,2.75,0,0,true],["app-20220209232701-0071",61,2.75,0,0,true],["app-20220209232701-0071",40,3.33,1520003,0,false],["app-20220209232701-0071",49,5.63,1258640,0,false],["app-20220209232701-0071",70,2.75,0,0,true],["app-20220209232701-0071",63,2.75,0,0,true],["app-20220209232701-0071",34,2.9,1135,0,false],["app-20220209232701-0071",54,6.91,2001958,0,false],["app-20220209232701-0071",76,2.75,0,0,true],["app-20220209232701-0071",58,5.78,592364,0,false],["app-20220209232701-0071",37,2.9,945,0,false],["app-20220209232701-0071",38,2.9,903,0,false],["app-20220209232701-0071",45,6.91,2252840,0,false],["app-20220209232701-0071",55,5.14,1223245,174748,false],["app-20220209232701-0071",47,3.33,49419,0,false],["app-20220209232701-0071",33,2.9,1148,0,false],["app-20220209232701-0071",44,6.25,7791216,973902,false],["app-20220209232701-0071",78,2.75,0,0,true],["app-20220209232701-0071",69,2.75,0,0,true],["app-20220209232701-0071",57,6.91,1172228,0,false],["app-20220209232701-0071",53,3.33,1303138,0,false],["app-20220209232701-0071",71,2.75,0,0,true],["app-20220209232701-0071",52,4.3,137115,0,false],["app-20220209232701-0071",65,2.75,0,0,true],["app-20220209232701-0071",77,2.75,0,0,true],["app-20220209232701-0071",48,3.33,50653,0,false],["app-20220209232701-0071",31,2.95,5912,0,false],["app-20220209232701-0071",59,4.3,175767,0,false],["app-20220209232701-0071",62,2.75,0,0,true],["app-20220209232701-0071",75,2.75,0,0,true],["app-20220209232701-0071",46,5.14,1258887,179840,false],["app-20220209232701-0071",82,6.1,436097,0,false],["app-20220209232701-0071",51,5.78,1058976,0,false],["app-20220209232701-0071",56,5.63,1080510,0,false],["app-20220209232701-0071",43,3.37,724796,0,false],["app-20220209232701-0071",72,2.75,0,0,true],["app-20220209225233-0018",41,2.95,1507,0,false],["app-20220209225233-0018",53,2.6,0,0,true],["app-20220209225233-0018",46,3.67,897723,0,false],["app-20220209225233-0018",47,3.67,1164829,0,false],["app-20220209225233-0018",52,2.6,0,0,true],["app-20220209225233-0018",61,9.07,3262143,0,false],["app-20220209225233-0018",43,2.6,1358,679,false],["app-20220209225233-0018",33,2.9,5319,0,false],["app-20220209225233-0018",50,3.33,1111,0,false],["app-20220209225233-0018",34,2.95,859,0,false],["app-20220209225233-0018",57,2.6,0,0,true],["app-20220209225233-0018",58,3.67,822295,0,false],["app-20220209225233-0018",37,2.9,5205,0,false],["app-20220209225233-0018",48,9.07,6261819,0,false],["app-20220209225233-0018",49,4.24,357876,0,false],["app-20220209225233-0018",56,3.33,51156,0,false],["app-20220209225233-0018",31,2.95,1313,0,false],["app-20220209225233-0018",65,7.82,757647,68877,false],["app-20220209225233-0018",38,2.95,1355,0,false],["app-20220209225233-0018",40,2.95,926,0,false],["app-20220209225233-0018",44,2.95,225,0,false],["app-20220209225233-0018",35,2.95,732,0,false],["app-20220209225233-0018",39,2.95,1071,0,false],["app-20220209225233-0018",42,3.29,5083750,462159,false],["app-20220209225233-0018",55,2.6,0,0,true],["app-20220209225233-0018",60,3.67,1168706,0,false],["app-20220209225233-0018",54,2.6,0,0,true],["app-20220209225233-0018",62,4.24,90128,0,false],["app-20220209225233-0018",51,9.42,396848,0,false],["app-20220209225233-0018",66,5.13,378755,116540,false],["app-20220209225233-0018",63,3.33,31336,0,false],["app-20220209225233-0018",67,3.0,223,0,false],["app-20220209225233-0018",45,3.67,3608365,0,false],["app-20220209225233-0018",64,7.82,569607,51782,false],["app-20220209225233-0018",36,2.9,5406,0,false],["app-20220209225233-0018",59,3.67,2136646,0,false],["app-20220209225233-0018",32,2.95,725,0,false],["app-20220209235705-0106",35,3.72,3491837,0,false],["app-20220209235705-0106",34,2.95,944,0,false],["app-20220209235705-0106",37,3.9,1062626,0,false],["app-20220209235705-0106",33,2.9,1051,0,false],["app-20220209235705-0106",38,3.0,265,0,false],["app-20220209235705-0106",32,2.9,727,0,false],["app-20220209235705-0106",36,2.71,0,0,true],["app-20220209235705-0106",31,2.9,825,0,false],["app-20220209231707-0053",31,2.95,1123,0,false],["app-20220209231707-0053",32,2.95,849,0,false],["app-20220209231707-0053",40,3.0,244,0,false],["app-20220209231707-0053",36,3.33,258698,0,false],["app-20220209231707-0053",37,6.21,2443897,0,false],["app-20220209231707-0053",33,2.95,1117,0,false],["app-20220209231707-0053",39,6.71,465297,0,false],["app-20220209231707-0053",34,3.69,1769010,0,false],["app-20220209231707-0053",35,3.33,49296,0,false],["app-20220209231707-0053",38,6.91,1173511,0,false],["app-20220209232803-0072",37,4.11,1581051,0,false],["app-20220209232803-0072",38,6.42,803615,0,false],["app-20220209232803-0072",34,3.68,2008936,0,false],["app-20220209232803-0072",32,2.9,6598,0,false],["app-20220209232803-0072",33,2.95,1110,0,false],["app-20220209232803-0072",39,3.0,222,0,false],["app-20220209232803-0072",36,4.3,2025555,0,false],["app-20220209232803-0072",31,2.9,970,0,false],["app-20220209232803-0072",35,3.68,3736014,0,false],["app-20220209234649-0089",36,3.9,203231,0,false],["app-20220209234649-0089",37,3.0,204,0,false],["app-20220209234649-0089",32,2.95,1305,0,false],["app-20220209234649-0089",35,6.45,1635641,0,false],["app-20220209234649-0089",33,3.37,5482868,0,false],["app-20220209234649-0089",34,3.62,15909,0,false],["app-20220209234649-0089",31,2.95,5331,0,false],["app-20220209224147-0004",38,3.33,57615,0,false],["app-20220209224147-0004",37,5.59,595309,54119,false],["app-20220209224147-0004",33,3.68,1141311,0,false],["app-20220209224147-0004",36,4.01,1631076,0,false],["app-20220209224147-0004",39,6.71,379029,0,false],["app-20220209224147-0004",34,3.68,2625437,0,false],["app-20220209224147-0004",35,4.3,1166672,0,false],["app-20220209224147-0004",32,2.95,969,0,false],["app-20220209224147-0004",40,3.0,218,0,false],["app-20220209224147-0004",31,2.95,914,0,false],["app-20220209234000-0083",33,3.64,5995673,0,false],["app-20220209234000-0083",32,2.9,5985,0,false],["app-20220209234000-0083",36,3.0,229,0,false],["app-20220209234000-0083",35,3.9,261784,0,false],["app-20220209234000-0083",34,2.67,0,0,true],["app-20220209234000-0083",31,2.9,1160,0,false],["app-20220209231143-0043",33,3.37,3844378,0,false],["app-20220209231143-0043",35,6.45,1701305,0,false],["app-20220209231143-0043",37,3.0,200,0,false],["app-20220209231143-0043",32,2.95,1182,0,false],["app-20220209231143-0043",36,3.9,178586,0,false],["app-20220209231143-0043",34,3.62,23363,0,false],["app-20220209231143-0043",31,2.95,5384,0,false],["app-20220209232314-0064",44,3.0,318,0,false],["app-20220209232314-0064",42,4.83,274987,0,false],["app-20220209232314-0064",35,3.72,1150328,0,false],["app-20220209232314-0064",43,7.26,710785,0,false],["app-20220209232314-0064",31,2.9,951,0,false],["app-20220209232314-0064",38,4.3,1178782,0,false],["app-20220209232314-0064",39,4.84,756671,0,false],["app-20220209232314-0064",33,2.9,685,0,false],["app-20220209232314-0064",37,3.72,3211086,0,false],["app-20220209232314-0064",34,2.9,1110,0,false],["app-20220209232314-0064",32,2.9,5699,0,false],["app-20220209232314-0064",36,4.3,482152,0,false],["app-20220209232314-0064",41,4.83,335737,0,false],["app-20220209232314-0064",40,4.34,265132,66283,false],["app-20220209224544-0009",52,6.45,825131,0,false],["app-20220209224544-0009",39,2.43,0,0,true],["app-20220209224544-0009",49,6.91,2192839,0,false],["app-20220209224544-0009",32,4.5,62,0,false],["app-20220209224544-0009",36,4.5,312,0,false],["app-20220209224544-0009",54,3.0,192,0,false],["app-20220209224544-0009",37,2.43,0,0,true],["app-20220209224544-0009",53,3.62,156665,0,false],["app-20220209224544-0009",44,4.34,6842,0,false],["app-20220209224544-0009",46,3.33,22104,0,false],["app-20220209224544-0009",40,4.5,4586,0,false],["app-20220209224544-0009",50,6.18,1690487,0,false],["app-20220209224544-0009",43,2.43,0,0,true],["app-20220209224544-0009",41,2.43,0,0,true],["app-20220209224544-0009",45,2.95,317,0,false],["app-20220209224544-0009",33,3.62,7744,0,false],["app-20220209224544-0009",38,4.5,1073,0,false],["app-20220209224544-0009",42,4.5,7935,0,false],["app-20220209224544-0009",51,3.39,5183,863,false],["app-20220209224544-0009",48,3.33,268230,0,false],["app-20220209224544-0009",35,2.43,0,0,true],["app-20220209224544-0009",47,3.33,112881,0,false],["app-20220209224544-0009",34,4.34,1031446,0,false],["app-20220209224544-0009",31,3.54,1445,0,false],["app-20220209233444-0075",33,2.95,1074,0,false],["app-20220209233444-0075",38,6.91,778002,0,false],["app-20220209233444-0075",37,6.21,2271961,0,false],["app-20220209233444-0075",31,2.95,1107,0,false],["app-20220209233444-0075",40,3.0,273,0,false],["app-20220209233444-0075",36,3.33,231471,0,false],["app-20220209233444-0075",39,6.71,578351,0,false],["app-20220209233444-0075",32,2.95,1262,0,false],["app-20220209233444-0075",34,3.69,1204546,0,false],["app-20220209233444-0075",35,3.33,41376,0,false],["app-20220209225013-0017",46,9.07,6144499,0,false],["app-20220209225013-0017",56,3.67,1387190,0,false],["app-20220209225013-0017",49,2.73,0,0,true],["app-20220209225013-0017",66,3.9,216038,0,false],["app-20220209225013-0017",48,9.42,256002,0,false],["app-20220209225013-0017",44,3.67,1550800,0,false],["app-20220209225013-0017",34,2.95,1081,0,false],["app-20220209225013-0017",55,3.33,64300,0,false],["app-20220209225013-0017",36,2.9,5343,0,false],["app-20220209225013-0017",61,3.33,137543,0,false],["app-20220209225013-0017",40,3.29,5068417,460765,false],["app-20220209225013-0017",45,3.67,729989,0,false],["app-20220209225013-0017",42,3.33,3513,0,false],["app-20220209225013-0017",64,7.82,627397,57036,false],["app-20220209225013-0017",39,2.95,941,0,false],["app-20220209225013-0017",59,9.07,3088447,0,false],["app-20220209225013-0017",57,3.67,680022,0,false],["app-20220209225013-0017",54,3.33,122388,0,false],["app-20220209225013-0017",51,2.73,0,0,true],["app-20220209225013-0017",50,2.73,0,0,true],["app-20220209225013-0017",53,2.73,0,0,true],["app-20220209225013-0017",31,2.9,6193,0,false],["app-20220209225013-0017",41,2.6,1933,966,false],["app-20220209225013-0017",47,4.24,292333,0,false],["app-20220209225013-0017",32,2.95,1213,0,false],["app-20220209225013-0017",60,4.24,113495,0,false],["app-20220209225013-0017",38,2.95,723,0,false],["app-20220209225013-0017",67,3.0,260,0,false],["app-20220209225013-0017",52,2.73,0,0,true],["app-20220209225013-0017",58,3.67,2098697,0,false],["app-20220209225013-0017",43,3.67,3569769,0,false],["app-20220209225013-0017",35,2.9,5770,0,false],["app-20220209225013-0017",33,2.95,1280,0,false],["app-20220209225013-0017",63,7.82,600289,54571,false],["app-20220209225013-0017",65,3.2,1170316,468126,false],["app-20220209225013-0017",37,2.95,1085,0,false],["app-20220209225013-0017",62,7.82,798734,72612,false],["app-20220209231631-0052",38,5.65,1801029,120068,false],["app-20220209231631-0052",35,3.33,189778,0,false],["app-20220209231631-0052",31,2.9,5980,0,false],["app-20220209231631-0052",34,3.33,446819,0,false],["app-20220209231631-0052",37,3.33,36237,0,false],["app-20220209231631-0052",40,3.0,252,0,false],["app-20220209231631-0052",36,6.91,3115193,0,false],["app-20220209231631-0052",39,3.9,166321,0,false],["app-20220209231631-0052",33,2.95,6007,0,false],["app-20220209231631-0052",32,2.95,1141,0,false],["app-20220209231405-0047",36,7.83,4572473,326605,false],["app-20220209231405-0047",33,2.95,6243,0,false],["app-20220209231405-0047",32,2.9,1228,0,false],["app-20220209231405-0047",37,2.73,697153,232384,false],["app-20220209231405-0047",35,3.33,104650,0,false],["app-20220209231405-0047",34,3.37,2621751,0,false],["app-20220209231405-0047",31,2.9,1222,0,false],["app-20220209231405-0047",38,3.0,263,0,false],["app-20220209230713-0035",37,3.33,612498,0,false],["app-20220209230713-0035",39,3.33,2094653,0,false],["app-20220209230713-0035",36,3.33,1183721,0,false],["app-20220209230713-0035",38,6.91,2438428,0,false],["app-20220209230713-0035",40,5.67,3484873,0,false],["app-20220209230713-0035",42,3.0,208,0,false],["app-20220209230713-0035",31,2.9,985,0,false],["app-20220209230713-0035",32,2.95,712,0,false],["app-20220209230713-0035",33,2.95,751,0,false],["app-20220209230713-0035",41,3.9,198374,0,false],["app-20220209230713-0035",35,2.9,5558,0,false],["app-20220209230713-0035",34,2.95,940,0,false],["app-20220209233914-0082",36,3.67,554466,0,false],["app-20220209233914-0082",35,3.37,639443,0,false],["app-20220209233914-0082",49,6.71,221029,0,false],["app-20220209233914-0082",32,2.9,984,0,false],["app-20220209233914-0082",33,2.95,5355,0,false],["app-20220209233914-0082",42,3.67,259529,0,false],["app-20220209233914-0082",47,4.3,338737,0,false],["app-20220209233914-0082",31,2.9,877,0,false],["app-20220209233914-0082",44,3.67,260596,0,false],["app-20220209233914-0082",38,3.67,304094,0,false],["app-20220209233914-0082",50,3.0,209,0,false],["app-20220209233914-0082",46,4.3,1144032,0,false],["app-20220209233914-0082",34,3.37,2719037,0,false],["app-20220209233914-0082",40,7.95,4305956,0,false],["app-20220209233914-0082",43,3.67,361819,0,false],["app-20220209233914-0082",45,7.95,6272814,0,false],["app-20220209233914-0082",37,3.37,794815,0,false],["app-20220209233914-0082",48,4.3,239942,0,false],["app-20220209233914-0082",41,4.3,1121560,0,false],["app-20220209233914-0082",39,3.67,286184,0,false],["app-20220209231846-0056",37,6.04,1027303,0,false],["app-20220209231846-0056",36,3.37,597405,0,false],["app-20220209231846-0056",32,3.37,66392,0,false],["app-20220209231846-0056",42,4.3,145711,0,false],["app-20220209231846-0056",39,3.37,741366,0,false],["app-20220209231846-0056",40,6.04,837113,0,false],["app-20220209231846-0056",35,3.37,225251,0,false],["app-20220209231846-0056",45,3.9,230593,0,false],["app-20220209231846-0056",34,6.04,2211184,0,false],["app-20220209231846-0056",31,2.95,1231,0,false],["app-20220209231846-0056",41,4.3,265559,0,false],["app-20220209231846-0056",38,3.37,1386627,0,false],["app-20220209231846-0056",46,3.0,207,0,false],["app-20220209231846-0056",33,3.37,791067,0,false],["app-20220209231846-0056",44,5.57,1142,0,false],["app-20220209231846-0056",43,4.3,257044,0,false],["app-20220209235552-0104",33,3.8,1144512,0,false],["app-20220209235552-0104",31,2.95,827,0,false],["app-20220209235552-0104",34,7.36,7191850,0,false],["app-20220209235552-0104",35,4.34,222,0,false],["app-20220209235552-0104",32,3.8,3138200,0,false],["app-20220209234857-0093",35,4.55,559900,0,false],["app-20220209234857-0093",31,2.95,688,0,false],["app-20220209234857-0093",33,3.66,2351347,0,false],["app-20220209234857-0093",34,4.3,587982,0,false],["app-20220209234857-0093",36,3.0,211,0,false],["app-20220209234857-0093",32,2.9,5313,0,false],["app-20220209230539-0032",32,2.95,1662,0,false],["app-20220209230539-0032",37,3.0,261,0,false],["app-20220209230539-0032",33,2.95,925,0,false],["app-20220209230539-0032",31,2.9,6484,0,false],["app-20220209230539-0032",34,2.95,827,0,false],["app-20220209230539-0032",36,3.9,1274279,0,false],["app-20220209230539-0032",35,3.72,2718003,0,false],["app-20220209233627-0078",36,2.8,0,0,true],["app-20220209233627-0078",35,4.34,894667,0,false],["app-20220209233627-0078",31,2.95,993,0,false],["app-20220209233627-0078",38,6.1,949455,0,false],["app-20220209233627-0078",34,3.53,2309865,0,false],["app-20220209233627-0078",37,4.3,825504,0,false],["app-20220209233627-0078",32,2.95,6073,0,false],["app-20220209233627-0078",33,2.95,980,0,false],["app-20220209224945-0016",36,3.37,7129,0,false],["app-20220209224945-0016",31,2.9,1090,0,false],["app-20220209224945-0016",33,2.9,881,0,false],["app-20220209224945-0016",32,2.95,1136,0,false],["app-20220209224945-0016",38,4.34,232,0,false],["app-20220209224945-0016",37,5.78,2074068,0,false],["app-20220209224945-0016",34,2.9,2314,0,false],["app-20220209224945-0016",35,3.61,2179116,0,false],["app-20220209231004-0040",33,2.95,1120,0,false],["app-20220209231004-0040",37,7.45,966664,0,false],["app-20220209231004-0040",39,2.71,0,0,true],["app-20220209231004-0040",32,2.95,816,0,false],["app-20220209231004-0040",31,2.95,1074,0,false],["app-20220209231004-0040",38,2.71,0,0,true],["app-20220209231004-0040",34,3.72,2379595,0,false],["app-20220209231004-0040",41,6.91,328149,0,false],["app-20220209231004-0040",36,3.33,32048,0,false],["app-20220209231004-0040",40,2.71,0,0,true],["app-20220209231004-0040",42,6.1,561089,0,false],["app-20220209231004-0040",35,4.01,782784,0,false],["app-20220209235239-0100",37,2.67,0,0,true],["app-20220209235239-0100",38,2.67,0,0,true],["app-20220209235239-0100",31,3.4,7753940,0,false],["app-20220209235239-0100",35,2.67,0,0,true],["app-20220209235239-0100",39,2.67,0,0,true],["app-20220209235239-0100",36,6.04,19985645,0,false],["app-20220209235239-0100",41,3.0,213,0,false],["app-20220209235239-0100",32,3.37,758001,0,false],["app-20220209235239-0100",34,2.67,0,0,true],["app-20220209235239-0100",40,3.9,715052,0,false],["app-20220209235239-0100",33,2.95,205,0,false],["app-20220209233659-0079",31,2.95,2253,0,false],["app-20220209233659-0079",35,2.9,718,0,false],["app-20220209233659-0079",45,3.0,279,0,false],["app-20220209233659-0079",40,3.33,1120562,0,false],["app-20220209233659-0079",43,7.86,2378952,0,false],["app-20220209233659-0079",34,2.95,852,0,false],["app-20220209233659-0079",44,3.9,590585,0,false],["app-20220209233659-0079",37,2.9,676,0,false],["app-20220209233659-0079",38,2.9,6062,0,false],["app-20220209233659-0079",39,3.33,2480746,0,false],["app-20220209233659-0079",32,2.95,754,0,false],["app-20220209233659-0079",41,5.61,17736664,0,false],["app-20220209233659-0079",33,2.9,723,0,false],["app-20220209233659-0079",42,3.37,1113495,0,false],["app-20220209233659-0079",36,2.9,1117,0,false],["app-20220209225644-0022",34,2.95,1232,0,false],["app-20220209225644-0022",41,3.0,279,0,false],["app-20220209225644-0022",33,2.9,2111,0,false],["app-20220209225644-0022",40,3.9,1087230,0,false],["app-20220209225644-0022",39,5.8,1847474,0,false],["app-20220209225644-0022",38,3.33,4900,0,false],["app-20220209225644-0022",31,2.95,1787,0,false],["app-20220209225644-0022",36,3.61,1480774,0,false],["app-20220209225644-0022",32,2.9,4927,0,false],["app-20220209225644-0022",37,6.18,2940295,0,false],["app-20220209225644-0022",35,3.37,215661,0,false],["app-20220209231740-0054",35,3.72,3840225,0,false],["app-20220209231740-0054",38,4.3,1026295,0,false],["app-20220209231740-0054",42,4.83,182464,0,false],["app-20220209231740-0054",43,7.26,549033,0,false],["app-20220209231740-0054",34,2.9,1083,0,false],["app-20220209231740-0054",36,4.3,545739,0,false],["app-20220209231740-0054",40,4.83,291281,0,false],["app-20220209231740-0054",31,2.9,780,0,false],["app-20220209231740-0054",44,3.0,298,0,false],["app-20220209231740-0054",32,2.9,998,0,false],["app-20220209231740-0054",37,3.72,1619438,0,false],["app-20220209231740-0054",41,4.34,201197,50299,false],["app-20220209231740-0054",33,2.9,6255,0,false],["app-20220209231740-0054",39,4.84,731839,0,false],["app-20220209224833-0014",33,3.33,255030,0,false],["app-20220209224833-0014",46,8.35,1530098,0,false],["app-20220209224833-0014",39,5.93,2135067,213506,false],["app-20220209224833-0014",44,3.56,426937,85387,false],["app-20220209224833-0014",36,3.33,635557,0,false],["app-20220209224833-0014",47,3.0,230,0,false],["app-20220209224833-0014",34,3.33,655896,0,false],["app-20220209224833-0014",35,5.93,1809231,180923,false],["app-20220209224833-0014",31,2.9,1222,0,false],["app-20220209224833-0014",41,5.93,1717389,171738,false],["app-20220209224833-0014",43,3.43,556978,139244,false],["app-20220209224833-0014",38,3.33,691175,0,false],["app-20220209224833-0014",32,2.9,1130,0,false],["app-20220209224833-0014",40,3.33,2320461,0,false],["app-20220209224833-0014",42,3.13,505475,168491,false],["app-20220209224833-0014",45,3.13,451848,150616,false],["app-20220209224833-0014",37,5.93,3921401,392140,false],["app-20220209234821-0092",35,2.9,1979,0,false],["app-20220209234821-0092",36,3.33,1926531,0,false],["app-20220209234821-0092",40,5.87,588764,0,false],["app-20220209234821-0092",41,3.9,197338,0,false],["app-20220209234821-0092",38,3.37,40706,0,false],["app-20220209234821-0092",39,5.81,3747933,0,false],["app-20220209234821-0092",31,2.95,1001,0,false],["app-20220209234821-0092",32,2.9,2434,0,false],["app-20220209234821-0092",37,3.37,1175209,0,false],["app-20220209234821-0092",34,2.9,1070,0,false],["app-20220209234821-0092",42,3.0,223,0,false],["app-20220209234821-0092",33,2.9,913,0,false],["app-20220209230826-0037",72,2.63,0,0,true],["app-20220209230826-0037",53,9.24,362626,0,false],["app-20220209230826-0037",69,2.63,0,0,true],["app-20220209230826-0037",40,4.3,203101,0,false],["app-20220209230826-0037",66,2.63,0,0,true],["app-20220209230826-0037",43,4.3,197091,0,false],["app-20220209230826-0037",60,2.63,0,0,true],["app-20220209230826-0037",74,6.1,80534,0,false],["app-20220209230826-0037",52,4.3,198469,0,false],["app-20220209230826-0037",45,6.45,643496,0,false],["app-20220209230826-0037",65,2.63,0,0,true],["app-20220209230826-0037",46,4.3,223109,0,false],["app-20220209230826-0037",41,3.61,116589,0,false],["app-20220209230826-0037",37,4.3,840541,0,false],["app-20220209230826-0037",51,6.45,3493278,0,false],["app-20220209230826-0037",62,2.63,0,0,true],["app-20220209230826-0037",68,2.63,0,0,true],["app-20220209230826-0037",71,2.63,0,0,true],["app-20220209230826-0037",47,3.61,272711,0,false],["app-20220209230826-0037",63,2.63,0,0,true],["app-20220209230826-0037",34,3.61,687256,0,false],["app-20220209230826-0037",31,2.9,1119,0,false],["app-20220209230826-0037",39,6.45,675946,0,false],["app-20220209230826-0037",36,6.45,1436474,0,false],["app-20220209230826-0037",73,8.96,125170,0,false],["app-20220209230826-0037",56,2.63,0,0,true],["app-20220209230826-0037",48,6.45,683716,0,false],["app-20220209230826-0037",57,2.63,0,0,true],["app-20220209230826-0037",67,2.63,0,0,true],["app-20220209230826-0037",61,2.63,0,0,true],["app-20220209230826-0037",35,3.33,46570,0,false],["app-20220209230826-0037",64,2.63,0,0,true],["app-20220209230826-0037",54,2.63,0,0,true],["app-20220209230826-0037",49,4.3,125628,0,false],["app-20220209230826-0037",33,2.9,1088,0,false],["app-20220209230826-0037",55,2.63,0,0,true],["app-20220209230826-0037",44,3.61,180299,0,false],["app-20220209230826-0037",38,3.61,1070835,0,false],["app-20220209230826-0037",58,2.63,0,0,true],["app-20220209230826-0037",59,2.63,0,0,true],["app-20220209230826-0037",32,2.9,1171,0,false],["app-20220209230826-0037",42,6.45,624473,0,false],["app-20220209230826-0037",70,2.63,0,0,true],["app-20220209230826-0037",50,3.61,326380,0,false],["app-20220209232008-0058",34,3.68,2867068,0,false],["app-20220209232008-0058",33,4.3,865584,0,false],["app-20220209232008-0058",32,3.68,1035427,0,false],["app-20220209232008-0058",40,3.0,437,0,false],["app-20220209232008-0058",36,4.84,2160465,0,false],["app-20220209232008-0058",39,4.5,1161360,0,false],["app-20220209232008-0058",38,7.76,1816580,0,false],["app-20220209232008-0058",35,4.3,1588280,0,false],["app-20220209232008-0058",37,4.84,782649,0,false],["app-20220209232008-0058",31,2.95,1089,0,false],["app-20220209235212-0099",33,3.61,522036,0,false],["app-20220209235212-0099",34,3.68,540303,0,false],["app-20220209235212-0099",31,2.95,6529,0,false],["app-20220209235212-0099",32,2.95,1404,0,false],["app-20220209235212-0099",35,5.46,1025034,85419,false],["app-20220209235212-0099",36,4.69,295,0,false],["app-20220209232605-0069",32,2.9,1119,0,false],["app-20220209232605-0069",33,2.95,1170,0,false],["app-20220209232605-0069",31,2.9,1161,0,false],["app-20220209232605-0069",38,3.0,458,0,false],["app-20220209232605-0069",37,3.9,644589,0,false],["app-20220209232605-0069",34,2.9,641,0,false],["app-20220209232605-0069",36,2.71,0,0,true],["app-20220209232605-0069",35,3.72,3569683,0,false],["app-20220209232111-0060",33,2.95,6016,0,false],["app-20220209232111-0060",31,2.95,734,0,false],["app-20220209232111-0060",37,3.0,236,0,false],["app-20220209232111-0060",34,3.72,2227526,0,false],["app-20220209232111-0060",36,4.3,643976,128795,false],["app-20220209232111-0060",35,4.3,999877,0,false],["app-20220209232111-0060",32,2.9,1131,0,false],["app-20220209224619-0010",35,3.72,2770017,0,false],["app-20220209224619-0010",37,3.0,274,0,false],["app-20220209224619-0010",32,2.9,5308,0,false],["app-20220209224619-0010",33,2.95,1088,0,false],["app-20220209224619-0010",36,3.9,1242297,0,false],["app-20220209224619-0010",31,2.95,1088,0,false],["app-20220209224619-0010",34,2.95,2094,0,false],["app-20220209231559-0051",34,2.45,0,0,true],["app-20220209231559-0051",33,3.54,999547,0,false],["app-20220209231559-0051",42,2.45,0,0,true],["app-20220209231559-0051",40,2.45,0,0,true],["app-20220209231559-0051",38,3.74,458556,91711,false],["app-20220209231559-0051",36,2.45,0,0,true],["app-20220209231559-0051",37,3.74,1535005,307001,false],["app-20220209231559-0051",44,4.74,485,0,false],["app-20220209231559-0051",31,3.54,4179191,0,false],["app-20220209231559-0051",45,3.0,258,0,false],["app-20220209231559-0051",43,2.45,0,0,true],["app-20220209231559-0051",39,2.45,0,0,true],["app-20220209231559-0051",41,5.03,342,0,false],["app-20220209231559-0051",32,2.9,2247,0,false],["app-20220209231559-0051",35,4.34,306,0,false],["app-20220209230348-0030",65,2.74,0,0,true],["app-20220209230348-0030",69,2.74,0,0,true],["app-20220209230348-0030",75,2.74,0,0,true],["app-20220209230348-0030",80,2.74,0,0,true],["app-20220209230348-0030",66,2.74,0,0,true],["app-20220209230348-0030",34,2.95,160,0,false],["app-20220209230348-0030",81,2.74,0,0,true],["app-20220209230348-0030",59,2.74,0,0,true],["app-20220209230348-0030",39,5.93,9488711,0,false],["app-20220209230348-0030",83,2.74,0,0,true],["app-20220209230348-0030",32,3.37,679259,0,false],["app-20220209230348-0030",70,6.45,965311,0,false],["app-20220209230348-0030",74,2.74,0,0,true],["app-20220209230348-0030",89,2.74,0,0,true],["app-20220209230348-0030",53,2.74,0,0,true],["app-20220209230348-0030",45,4.15,136445,0,false],["app-20220209230348-0030",52,2.74,0,0,true],["app-20220209230348-0030",78,4.3,171200,0,false],["app-20220209230348-0030",86,2.74,0,0,true],["app-20220209230348-0030",93,3.52,103993,25998,false],["app-20220209230348-0030",82,2.74,0,0,true],["app-20220209230348-0030",57,2.74,0,0,true],["app-20220209230348-0030",43,4.2,74861,0,false],["app-20220209230348-0030",54,4.3,178583,0,false],["app-20220209230348-0030",64,2.74,0,0,true],["app-20220209230348-0030",72,2.74,0,0,true],["app-20220209230348-0030",41,2.74,0,0,true],["app-20220209230348-0030",37,2.74,0,0,true],["app-20220209230348-0030",40,2.74,0,0,true],["app-20220209230348-0030",77,2.74,0,0,true],["app-20220209230348-0030",79,2.74,0,0,true],["app-20220209230348-0030",47,2.74,0,0,true],["app-20220209230348-0030",44,2.74,0,0,true],["app-20220209230348-0030",55,2.9,522,0,false],["app-20220209230348-0030",63,6.91,1233672,0,false],["app-20220209230348-0030",56,2.74,0,0,true],["app-20220209230348-0030",33,3.33,38096,0,false],["app-20220209230348-0030",73,2.74,0,0,true],["app-20220209230348-0030",88,2.74,0,0,true],["app-20220209230348-0030",42,2.74,0,0,true],["app-20220209230348-0030",71,2.74,0,0,true],["app-20220209230348-0030",84,2.74,0,0,true],["app-20220209230348-0030",76,2.74,0,0,true],["app-20220209230348-0030",35,2.9,1077,0,false],["app-20220209230348-0030",68,2.74,0,0,true],["app-20220209230348-0030",36,3.33,10660,0,false],["app-20220209230348-0030",92,2.74,0,0,true],["app-20220209230348-0030",48,2.74,0,0,true],["app-20220209230348-0030",49,6.45,518124,0,false],["app-20220209230348-0030",91,2.74,0,0,true],["app-20220209230348-0030",67,2.74,0,0,true]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"App ID","type":"\"string\"","metadata":"{}"},{"name":"Stage ID","type":"\"long\"","metadata":"{}"},{"name":"Average Speedup Factor","type":"\"double\"","metadata":"{}"},{"name":"Stage Task Duration","type":"\"long\"","metadata":"{}"},{"name":"Unsupported Task Duration","type":"\"long\"","metadata":"{}"},{"name":"Stage Estimated","type":"\"boolean\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
App IDStage IDAverage Speedup FactorStage Task DurationUnsupported Task DurationStage Estimated
app-20220209224509-0008312.9511840false
app-20220209224509-0008332.910860false
app-20220209224509-0008353.3723215230false
app-20220209224509-0008413.91726480false
app-20220209224509-0008395.7245868240false
app-20220209224509-0008383.366943370false
app-20220209224509-0008404.266568350false
app-20220209224509-0008373.365241900false
app-20220209224509-0008322.96410false
app-20220209224509-0008362.7370650false
app-20220209224509-0008423.02180false
app-20220209224509-0008342.910800false
app-20220209235114-0097392.7100true
app-20220209235114-0097403.544130false
app-20220209235114-0097342.959640false
app-20220209235114-0097372.7100true
app-20220209235114-0097413.03650false
app-20220209235114-0097312.9510580false
app-20220209235114-0097322.956940false
app-20220209235114-0097353.6821421470false
app-20220209235114-0097384.342710false
app-20220209235114-0097363.684578640false
app-20220209235114-0097332.959000false
app-20220209230506-0031353.33933940false
app-20220209230506-0031363.332398630false
app-20220209230506-0031386.9126961720false
app-20220209230506-0031373.3316844940false
app-20220209230506-0031403.92050180false
app-20220209230506-0031322.975300false
app-20220209230506-0031413.02100false
app-20220209230506-0031395.6721297750false
app-20220209230506-0031342.9511980false
app-20220209230506-0031312.9512840false
app-20220209230506-0031332.912580false
app-20220209232634-0070322.910460false
app-20220209232634-0070343.7222260560false
app-20220209232634-0070312.9566770false
app-20220209232634-0070332.956720false
app-20220209232634-0070373.02100false
app-20220209232634-0070354.36888940false
app-20220209232634-0070364.3566592113318false
app-20220209225845-0026363.03030false
app-20220209225845-0026322.956900false
app-20220209225845-0026312.9511810false
app-20220209225845-0026343.686217360false
app-20220209225845-0026332.98940false
app-20220209225845-0026353.911062600false
app-20220209235526-0103343.6823012050false
app-20220209235526-0103312.9510510false
app-20220209235526-0103332.958750false
app-20220209235526-0103322.956760false
app-20220209235526-0103364.696210false
app-20220209235526-0103352.600true
app-20220209231919-0057353.3366556240false
app-20220209231919-0057365.7892970720false
app-20220209231919-0057383.02280false
app-20220209231919-0057312.97110false
app-20220209231919-0057373.93548480false
app-20220209231919-0057343.331341430false
app-20220209231919-0057322.957240false
app-20220209231919-0057332.96950false
app-20220209231533-0050333.7124899600false
app-20220209231533-0050343.97656140false
app-20220209231533-0050353.02460false
app-20220209231533-0050322.9510240false
app-20220209231533-0050312.9510960false
application_1665146417445_000244.52330false
application_1665146417445_000234.3428932070false
application_1665146417445_000222.6145710217285510false
application_1665146417445_000212.05197202725986013false
application_1665146417445_000274.52440false
application_1665146417445_000263.9819181090false
application_1665146417445_000252.645408262270413false
application_1665146417445_000201.045054505false
app-20220209230053-0028403.7149793000false
app-20220209230053-0028423.945178980false
app-20220209230053-0028384.34530false
app-20220209230053-0028447.767306440false
app-20220209230053-0028543.02210false
app-20220209230053-0028353.3346187180false
app-20220209230053-0028363.33592060false
app-20220209230053-0028507.766611050false
app-20220209230053-0028433.33250520false
app-20220209230053-0028375.7386970221449502false
app-20220209230053-0028392.95770false
app-20220209230053-0028532.68456328182530false
app-20220209230053-0028453.33349000false
app-20220209230053-0028518.28137011102997113false
app-20220209230053-0028312.957010false
app-20220209230053-0028463.3723664040false
app-20220209230053-0028528.28173096493786482false
app-20220209230053-0028322.953510false
app-20220209230053-0028342.957640false
app-20220209230053-0028332.9511530false
app-20220209230053-0028483.33287290false
app-20220209230053-0028493.945098370false
app-20220209230053-0028413.33238240false
app-20220209230053-0028473.7150718110false
app-20220209230750-0036425.986004220false
app-20220209230750-0036343.617434620false
app-20220209230750-0036416.3321991524435false
app-20220209230750-0036322.9510260false
app-20220209230750-0036403.332169770false
app-20220209230750-0036333.33315650false
app-20220209230750-0036312.95223330false
app-20220209230750-0036384.017968700false
app-20220209230750-0036394.35799410false
app-20220209230750-0036356.4510953790false
app-20220209230750-0036376.4533909120false
app-20220209230750-0036433.03170false
app-20220209230750-0036363.617486340false
app-20220209224725-0012601.0600true
app-20220209224725-0012481.0600true
app-20220209224725-0012674.341160false
app-20220209224725-0012393.543210100false
app-20220209224725-0012574.343550false
app-20220209224725-0012474.344030false
app-20220209224725-0012701.0600true
app-20220209224725-0012534.343190false
app-20220209224725-0012383.544177450false
app-20220209224725-0012521.0600true
app-20220209224725-0012323.544590020false
app-20220209224725-0012741.0600true
app-20220209224725-0012614.343510false
app-20220209224725-0012762.953450false
app-20220209224725-0012443.547157300false
app-20220209224725-0012453.543016720false
app-20220209224725-0012333.542700460false
app-20220209224725-0012581.0600true
app-20220209224725-0012634.344930false
app-20220209224725-0012661.0600true
app-20220209224725-0012694.34600false
app-20220209224725-0012754.342380false
app-20220209224725-0012621.0600true
app-20220209224725-0012734.342290false
app-20220209224725-0012641.0600true
app-20220209224725-0012461.0600true
app-20220209224725-0012714.342300false
app-20220209224725-0012654.343910false
app-20220209224725-0012313.5422847660false
app-20220209224725-0012554.343590false
app-20220209224725-0012403.544448910false
app-20220209224725-0012501.0600true
app-20220209224725-0012541.0600true
app-20220209224725-0012363.545915570false
app-20220209224725-0012343.543127890false
app-20220209224725-0012494.343920false
app-20220209224725-0012423.544933570false
app-20220209224725-0012721.0600true
app-20220209224725-0012373.544355680false
app-20220209224725-0012514.344070false
app-20220209224725-0012681.0600true
app-20220209224725-0012594.344080false
app-20220209224725-0012561.0600true
app-20220209224725-0012413.543187520false
app-20220209224725-0012353.544154930false
app-20220209224725-0012433.542770690false
app-20220209233831-0081443.944176610false
app-20220209233831-0081434.34419310false
app-20220209233831-0081473.03150false
app-20220209233831-0081403.3321960100false
app-20220209233831-0081333.332546520false
app-20220209233831-0081454.34877010false
app-20220209233831-0081322.97340false
app-20220209233831-0081343.335802290false
app-20220209233831-0081312.97200false
app-20220209233831-0081396.0420476170false
app-20220209233831-0081383.336080340false
app-20220209233831-0081424.014392840false
app-20220209233831-0081468.3515602600false
app-20220209233831-0081416.0416303410false
app-20220209233831-0081356.0418072280false
app-20220209233831-0081376.0436592310false
app-20220209233831-0081363.335602920false
app-20220209231114-0042312.959220false
app-20220209231114-0042364.555115280false
app-20220209231114-0042373.02100false
app-20220209231114-0042354.36099160false
app-20220209231114-0042332.958040false
app-20220209231114-0042343.6825133130false
app-20220209231114-0042322.9510570false
app-20220209235046-0096373.02590false
app-20220209235046-0096354.39650750false
app-20220209235046-0096322.964050false
app-20220209235046-0096332.9511820false
app-20220209235046-0096343.7224070800false
app-20220209235046-0096364.3648825129765false
app-20220209235046-0096312.99140false
app-20220209231505-0049322.9555160false
app-20220209231505-0049343.96414270false
app-20220209231505-0049353.02480false
app-20220209231505-0049312.959760false
app-20220209231505-0049333.7120785920false
app-20220209225818-0025332.9560130false
app-20220209225818-0025363.05440false
app-20220209225818-0025312.913610false
app-20220209225818-0025322.912400false
app-20220209225818-0025353.6210159640false
app-20220209225818-0025343.72478040false
app-20220209225607-0021383.333876720false
app-20220209225607-0021342.961570false
app-20220209225607-0021353.3313781140false
app-20220209225607-0021376.9132720730false
app-20220209225607-0021312.957140false
app-20220209225607-0021403.92018930false
app-20220209225607-0021395.6719469560false
app-20220209225607-0021332.912140false
app-20220209225607-0021363.336225160false
app-20220209225607-0021322.957000false
app-20220209225607-0021413.02690false
app-20220209225749-0024322.960360false
app-20220209225749-0024333.713593830false
app-20220209225749-0024312.9513150false
app-20220209225749-0024354.557154820false
app-20220209225749-0024344.39582270false
app-20220209225749-0024363.05310false
app-20220209231439-0048313.5481090false
app-20220209231439-0048363.9659090false
app-20220209231439-0048373.06830false
app-20220209231439-0048322.600true
app-20220209231439-0048333.82834220false
app-20220209231439-0048352.600true
app-20220209231439-0048343.6334410false
app-20220209232045-0059312.9510170false
app-20220209232045-0059322.9553910false
app-20220209232045-0059353.02690false
app-20220209232045-0059333.7119860940false
app-20220209232045-0059343.96903190false
app-20220209224648-0011322.912410false
app-20220209224648-0011403.6711557310false
app-20220209224648-0011312.9510050false
app-20220209224648-0011373.9411801070false
app-20220209224648-0011416.453569150false
app-20220209224648-0011333.372173260false
app-20220209224648-0011433.01990false
app-20220209224648-0011423.91398460false
app-20220209224648-0011363.33371910false
app-20220209224648-0011387.864492200false
app-20220209224648-0011394.31101540false
app-20220209224648-0011343.33393480false
app-20220209224648-0011356.4530050410false
app-20220209224756-0013386.275393922567780false
app-20220209224756-0013403.02470false
app-20220209224756-0013363.751544890false
app-20220209224756-0013343.7514067000false
app-20220209224756-0013312.925480false
app-20220209224756-0013322.958520false
app-20220209224756-0013353.33652570false
app-20220209224756-0013332.95221230false
app-20220209224756-0013393.95495880false
app-20220209224756-0013373.751500720false
app-20220209235141-0098394.343144080false
app-20220209235141-0098422.7800true
app-20220209235141-0098342.911040false
app-20220209235141-0098373.331238450false
app-20220209235141-0098385.7824292500false
app-20220209235141-0098312.9512420false
app-20220209235141-0098434.31452100false
app-20220209235141-0098363.67547390false
app-20220209235141-0098402.7800true
app-20220209235141-0098322.95206110false
app-20220209235141-0098332.959570false
app-20220209235141-0098412.7800true
app-20220209235141-0098446.1126460false
app-20220209235141-0098352.921860false
app-20220209231256-0045322.98380false
app-20220209231256-0045332.962170false
app-20220209231256-0045412.6400true
app-20220209231256-0045353.72339550false
app-20220209231256-0045422.6400true
app-20220209231256-0045373.72331540false
app-20220209231256-0045312.957000false
app-20220209231256-0045446.915061400false
app-20220209231256-0045363.943931700false
app-20220209231256-0045342.959450false
app-20220209231256-0045402.6400true
app-20220209231256-0045432.6400true
app-20220209231256-0045383.9417448130false
app-20220209231256-0045456.110505730false
app-20220209231256-0045397.4510237210false
app-20220209224316-0007484.34877560false
app-20220209224316-0007343.332793850false
app-20220209224316-0007363.338056800false
app-20220209224316-0007383.3311277860false
app-20220209224316-0007473.944310550false
app-20220209224316-0007456.04133492860false
app-20220209224316-0007356.04195730460false
app-20220209224316-0007312.911860false
app-20220209224316-0007416.0498503010false
app-20220209224316-0007533.02410false
app-20220209224316-0007396.04184024460false
app-20220209224316-0007423.333934560false
app-20220209224316-0007504.35126400false
app-20220209224316-0007443.3324787970false
app-20220209224316-0007436.0450181140false
app-20220209224316-0007403.337332100false
app-20220209224316-0007514.35153690false
app-20220209224316-0007463.947709470false
app-20220209224316-0007322.97070false
app-20220209224316-0007528.3527475850false
app-20220209224316-0007333.3318303060false
app-20220209224316-0007376.0454483780false
app-20220209224316-0007494.015670230false
app-20220209234754-0091313.3727924030false
app-20220209234754-0091363.7551080false
app-20220209234754-0091384.22173270false
app-20220209234754-0091342.955200false
app-20220209234754-0091352.95122400false
app-20220209234754-0091392.7800true
app-20220209234754-0091372.7800true
app-20220209234754-0091332.98600false
app-20220209234754-0091403.757349010false
app-20220209234754-0091413.03460false
app-20220209234754-0091322.93550false
app-20220209232242-0063322.95225110false
app-20220209232242-0063353.724740530false
app-20220209232242-0063373.721781660false
app-20220209232242-0063393.92771810false
app-20220209232242-0063384.3424185700false
app-20220209232242-0063403.02790false
app-20220209232242-0063312.957600false
app-20220209232242-0063363.723481490false
app-20220209232242-0063343.4843010false
app-20220209232242-0063332.9554960false
app-20220209232500-0067363.728504790false
app-20220209232500-0067353.729347630false
app-20220209232500-0067373.72632710false
app-20220209232500-0067403.02430false
app-20220209232500-0067312.9510000false
app-20220209232500-0067343.4838410false
app-20220209232500-0067332.9558170false
app-20220209232500-0067322.95230020false
app-20220209232500-0067384.3417064370false
app-20220209232500-0067393.92458230false
app-20220209234532-0087312.9513780false
app-20220209234532-0087447.852042645127665false
app-20220209234532-0087413.3311542730false
app-20220209234532-0087423.377613690false
app-20220209234532-0087473.91671440false
app-20220209234532-0087342.97300false
app-20220209234532-0087403.378530200false
app-20220209234532-0087332.99140false
app-20220209234532-0087383.33898630false
app-20220209234532-0087437.851710173106885false
app-20220209234532-0087483.02200false
app-20220209234532-0087457.853459742216233false
app-20220209234532-0087393.334942660false
app-20220209234532-0087462.94652694217563false
app-20220209234532-0087352.910360false
app-20220209234532-0087322.9513830false
app-20220209234532-0087362.9556700false
app-20220209234532-0087373.3712336060false
app-20220209232841-0073353.613266643272220false
app-20220209232841-0073342.911040false
app-20220209232841-0073373.18831509277168false
app-20220209232841-0073363.6192751177292false
app-20220209232841-0073312.959840false
app-20220209232841-0073322.958820false
app-20220209232841-0073332.97090false
app-20220209232841-0073393.02640false
app-20220209232841-0073383.92577770false
app-20220209234412-0085387.8546604600false
app-20220209234412-0085373.375005400false
app-20220209234412-0085423.02730false
app-20220209234412-0085397.8511637820false
app-20220209234412-0085417.7967667500false
app-20220209234412-0085362.7330658040false
app-20220209234412-0085407.8553262780false
app-20220209234412-0085323.3312066080false
app-20220209234412-0085312.911280false
app-20220209234412-0085353.374803420false
app-20220209234412-0085333.3710443340false
app-20220209234412-0085343.335376120false
app-20220209224220-0005364.2894360false
app-20220209224220-0005312.97360false
app-20220209224220-0005442.800true
app-20220209224220-0005412.800true
app-20220209224220-0005382.800true
app-20220209224220-0005372.800true
app-20220209224220-0005432.800true
app-20220209224220-0005343.445209140false
app-20220209224220-0005322.956920false
app-20220209224220-0005332.958980false
app-20220209224220-0005452.800true
app-20220209224220-0005464.84127300false
app-20220209224220-0005396.88739270false
app-20220209224220-0005352.800true
app-20220209224220-0005426.43247130false
app-20220209224220-0005402.800true
app-20220209232531-0068443.03530false
app-20220209232531-0068373.33325220false
app-20220209232531-0068425.877165050false
app-20220209232531-0068312.958170false
app-20220209232531-0068352.959850false
app-20220209232531-0068385.8723464530false
app-20220209232531-0068322.9511010false
app-20220209232531-0068363.679888490false
app-20220209232531-0068433.541250false
app-20220209232531-0068394.34770false
app-20220209232531-0068342.95227370false
app-20220209232531-0068332.9559810false
app-20220209232531-0068412.8200true
app-20220209232531-0068403.692599350false
app-20220209234611-0088413.33427820false
app-20220209234611-0088403.33490310false
app-20220209234611-0088443.02890false
app-20220209234611-0088323.33453140false
app-20220209234611-0088353.6114163680false
app-20220209234611-0088366.4510799080false
app-20220209234611-0088384.39596530false
app-20220209234611-0088346.4537845690false
app-20220209234611-0088374.015528720false
app-20220209234611-0088333.618133720false
app-20220209234611-0088436.714791270false
app-20220209234611-0088426.915849290false
app-20220209234611-0088396.3322460024955false
app-20220209234611-0088312.957120false
app-20220209233802-0080332.959070false
app-20220209233802-0080392.7100true
app-20220209233802-0080364.017095160false
app-20220209233802-0080382.7100true
app-20220209233802-0080322.9511540false
app-20220209233802-0080416.911764060false
app-20220209233802-0080343.332658480false
app-20220209233802-0080426.1860510false
app-20220209233802-0080402.7100true
app-20220209233802-0080353.7214227750false
app-20220209233802-0080312.957120false
app-20220209233802-0080377.454229320false
app-20220209232701-0071672.7500true
app-20220209232701-0071392.99690false
app-20220209232701-0071816.911652360false
app-20220209232701-0071792.7500true
app-20220209232701-0071802.7500true
app-20220209232701-0071732.7500true
app-20220209232701-0071413.378076940false
app-20220209232701-0071742.7500true
app-20220209232701-0071322.97210false
app-20220209232701-0071506.9119407800false
app-20220209232701-0071362.923020false
app-20220209232701-0071352.97530false
app-20220209232701-0071682.7500true
app-20220209232701-0071423.3746291500false
app-20220209232701-0071642.7500true
app-20220209232701-0071607.452068570false
app-20220209232701-0071662.7500true
app-20220209232701-0071612.7500true
app-20220209232701-0071403.3315200030false
app-20220209232701-0071495.6312586400false
app-20220209232701-0071702.7500true
app-20220209232701-0071632.7500true
app-20220209232701-0071342.911350false
app-20220209232701-0071546.9120019580false
app-20220209232701-0071762.7500true
app-20220209232701-0071585.785923640false
app-20220209232701-0071372.99450false
app-20220209232701-0071382.99030false
app-20220209232701-0071456.9122528400false
app-20220209232701-0071555.141223245174748false
app-20220209232701-0071473.33494190false
app-20220209232701-0071332.911480false
app-20220209232701-0071446.257791216973902false
app-20220209232701-0071782.7500true
app-20220209232701-0071692.7500true
app-20220209232701-0071576.9111722280false
app-20220209232701-0071533.3313031380false
app-20220209232701-0071712.7500true
app-20220209232701-0071524.31371150false
app-20220209232701-0071652.7500true
app-20220209232701-0071772.7500true
app-20220209232701-0071483.33506530false
app-20220209232701-0071312.9559120false
app-20220209232701-0071594.31757670false
app-20220209232701-0071622.7500true
app-20220209232701-0071752.7500true
app-20220209232701-0071465.141258887179840false
app-20220209232701-0071826.14360970false
app-20220209232701-0071515.7810589760false
app-20220209232701-0071565.6310805100false
app-20220209232701-0071433.377247960false
app-20220209232701-0071722.7500true
app-20220209225233-0018412.9515070false
app-20220209225233-0018532.600true
app-20220209225233-0018463.678977230false
app-20220209225233-0018473.6711648290false
app-20220209225233-0018522.600true
app-20220209225233-0018619.0732621430false
app-20220209225233-0018432.61358679false
app-20220209225233-0018332.953190false
app-20220209225233-0018503.3311110false
app-20220209225233-0018342.958590false
app-20220209225233-0018572.600true
app-20220209225233-0018583.678222950false
app-20220209225233-0018372.952050false
app-20220209225233-0018489.0762618190false
app-20220209225233-0018494.243578760false
app-20220209225233-0018563.33511560false
app-20220209225233-0018312.9513130false
app-20220209225233-0018657.8275764768877false
app-20220209225233-0018382.9513550false
app-20220209225233-0018402.959260false
app-20220209225233-0018442.952250false
app-20220209225233-0018352.957320false
app-20220209225233-0018392.9510710false
app-20220209225233-0018423.295083750462159false
app-20220209225233-0018552.600true
app-20220209225233-0018603.6711687060false
app-20220209225233-0018542.600true
app-20220209225233-0018624.24901280false
app-20220209225233-0018519.423968480false
app-20220209225233-0018665.13378755116540false
app-20220209225233-0018633.33313360false
app-20220209225233-0018673.02230false
app-20220209225233-0018453.6736083650false
app-20220209225233-0018647.8256960751782false
app-20220209225233-0018362.954060false
app-20220209225233-0018593.6721366460false
app-20220209225233-0018322.957250false
app-20220209235705-0106353.7234918370false
app-20220209235705-0106342.959440false
app-20220209235705-0106373.910626260false
app-20220209235705-0106332.910510false
app-20220209235705-0106383.02650false
app-20220209235705-0106322.97270false
app-20220209235705-0106362.7100true
app-20220209235705-0106312.98250false
app-20220209231707-0053312.9511230false
app-20220209231707-0053322.958490false
app-20220209231707-0053403.02440false
app-20220209231707-0053363.332586980false
app-20220209231707-0053376.2124438970false
app-20220209231707-0053332.9511170false
app-20220209231707-0053396.714652970false
app-20220209231707-0053343.6917690100false
app-20220209231707-0053353.33492960false
app-20220209231707-0053386.9111735110false
app-20220209232803-0072374.1115810510false
app-20220209232803-0072386.428036150false
app-20220209232803-0072343.6820089360false
app-20220209232803-0072322.965980false
app-20220209232803-0072332.9511100false
app-20220209232803-0072393.02220false
app-20220209232803-0072364.320255550false
app-20220209232803-0072312.99700false
app-20220209232803-0072353.6837360140false
app-20220209234649-0089363.92032310false
app-20220209234649-0089373.02040false
app-20220209234649-0089322.9513050false
app-20220209234649-0089356.4516356410false
app-20220209234649-0089333.3754828680false
app-20220209234649-0089343.62159090false
app-20220209234649-0089312.9553310false
app-20220209224147-0004383.33576150false
app-20220209224147-0004375.5959530954119false
app-20220209224147-0004333.6811413110false
app-20220209224147-0004364.0116310760false
app-20220209224147-0004396.713790290false
app-20220209224147-0004343.6826254370false
app-20220209224147-0004354.311666720false
app-20220209224147-0004322.959690false
app-20220209224147-0004403.02180false
app-20220209224147-0004312.959140false
app-20220209234000-0083333.6459956730false
app-20220209234000-0083322.959850false
app-20220209234000-0083363.02290false
app-20220209234000-0083353.92617840false
app-20220209234000-0083342.6700true
app-20220209234000-0083312.911600false
app-20220209231143-0043333.3738443780false
app-20220209231143-0043356.4517013050false
app-20220209231143-0043373.02000false
app-20220209231143-0043322.9511820false
app-20220209231143-0043363.91785860false
app-20220209231143-0043343.62233630false
app-20220209231143-0043312.9553840false
app-20220209232314-0064443.03180false
app-20220209232314-0064424.832749870false
app-20220209232314-0064353.7211503280false
app-20220209232314-0064437.267107850false
app-20220209232314-0064312.99510false
app-20220209232314-0064384.311787820false
app-20220209232314-0064394.847566710false
app-20220209232314-0064332.96850false
app-20220209232314-0064373.7232110860false
app-20220209232314-0064342.911100false
app-20220209232314-0064322.956990false
app-20220209232314-0064364.34821520false
app-20220209232314-0064414.833357370false
app-20220209232314-0064404.3426513266283false
app-20220209224544-0009526.458251310false
app-20220209224544-0009392.4300true
app-20220209224544-0009496.9121928390false
app-20220209224544-0009324.5620false
app-20220209224544-0009364.53120false
app-20220209224544-0009543.01920false
app-20220209224544-0009372.4300true
app-20220209224544-0009533.621566650false
app-20220209224544-0009444.3468420false
app-20220209224544-0009463.33221040false
app-20220209224544-0009404.545860false
app-20220209224544-0009506.1816904870false
app-20220209224544-0009432.4300true
app-20220209224544-0009412.4300true
app-20220209224544-0009452.953170false
app-20220209224544-0009333.6277440false
app-20220209224544-0009384.510730false
app-20220209224544-0009424.579350false
app-20220209224544-0009513.395183863false
app-20220209224544-0009483.332682300false
app-20220209224544-0009352.4300true
app-20220209224544-0009473.331128810false
app-20220209224544-0009344.3410314460false
app-20220209224544-0009313.5414450false
app-20220209233444-0075332.9510740false
app-20220209233444-0075386.917780020false
app-20220209233444-0075376.2122719610false
app-20220209233444-0075312.9511070false
app-20220209233444-0075403.02730false
app-20220209233444-0075363.332314710false
app-20220209233444-0075396.715783510false
app-20220209233444-0075322.9512620false
app-20220209233444-0075343.6912045460false
app-20220209233444-0075353.33413760false
app-20220209225013-0017469.0761444990false
app-20220209225013-0017563.6713871900false
app-20220209225013-0017492.7300true
app-20220209225013-0017663.92160380false
app-20220209225013-0017489.422560020false
app-20220209225013-0017443.6715508000false
app-20220209225013-0017342.9510810false
app-20220209225013-0017553.33643000false
app-20220209225013-0017362.953430false
app-20220209225013-0017613.331375430false
app-20220209225013-0017403.295068417460765false
app-20220209225013-0017453.677299890false
app-20220209225013-0017423.3335130false
app-20220209225013-0017647.8262739757036false
app-20220209225013-0017392.959410false
app-20220209225013-0017599.0730884470false
app-20220209225013-0017573.676800220false
app-20220209225013-0017543.331223880false
app-20220209225013-0017512.7300true
app-20220209225013-0017502.7300true
app-20220209225013-0017532.7300true
app-20220209225013-0017312.961930false
app-20220209225013-0017412.61933966false
app-20220209225013-0017474.242923330false
app-20220209225013-0017322.9512130false
app-20220209225013-0017604.241134950false
app-20220209225013-0017382.957230false
app-20220209225013-0017673.02600false
app-20220209225013-0017522.7300true
app-20220209225013-0017583.6720986970false
app-20220209225013-0017433.6735697690false
app-20220209225013-0017352.957700false
app-20220209225013-0017332.9512800false
app-20220209225013-0017637.8260028954571false
app-20220209225013-0017653.21170316468126false
app-20220209225013-0017372.9510850false
app-20220209225013-0017627.8279873472612false
app-20220209231631-0052385.651801029120068false
app-20220209231631-0052353.331897780false
app-20220209231631-0052312.959800false
app-20220209231631-0052343.334468190false
app-20220209231631-0052373.33362370false
app-20220209231631-0052403.02520false
app-20220209231631-0052366.9131151930false
app-20220209231631-0052393.91663210false
app-20220209231631-0052332.9560070false
app-20220209231631-0052322.9511410false
app-20220209231405-0047367.834572473326605false
app-20220209231405-0047332.9562430false
app-20220209231405-0047322.912280false
app-20220209231405-0047372.73697153232384false
app-20220209231405-0047353.331046500false
app-20220209231405-0047343.3726217510false
app-20220209231405-0047312.912220false
app-20220209231405-0047383.02630false
app-20220209230713-0035373.336124980false
app-20220209230713-0035393.3320946530false
app-20220209230713-0035363.3311837210false
app-20220209230713-0035386.9124384280false
app-20220209230713-0035405.6734848730false
app-20220209230713-0035423.02080false
app-20220209230713-0035312.99850false
app-20220209230713-0035322.957120false
app-20220209230713-0035332.957510false
app-20220209230713-0035413.91983740false
app-20220209230713-0035352.955580false
app-20220209230713-0035342.959400false
app-20220209233914-0082363.675544660false
app-20220209233914-0082353.376394430false
app-20220209233914-0082496.712210290false
app-20220209233914-0082322.99840false
app-20220209233914-0082332.9553550false
app-20220209233914-0082423.672595290false
app-20220209233914-0082474.33387370false
app-20220209233914-0082312.98770false
app-20220209233914-0082443.672605960false
app-20220209233914-0082383.673040940false
app-20220209233914-0082503.02090false
app-20220209233914-0082464.311440320false
app-20220209233914-0082343.3727190370false
app-20220209233914-0082407.9543059560false
app-20220209233914-0082433.673618190false
app-20220209233914-0082457.9562728140false
app-20220209233914-0082373.377948150false
app-20220209233914-0082484.32399420false
app-20220209233914-0082414.311215600false
app-20220209233914-0082393.672861840false
app-20220209231846-0056376.0410273030false
app-20220209231846-0056363.375974050false
app-20220209231846-0056323.37663920false
app-20220209231846-0056424.31457110false
app-20220209231846-0056393.377413660false
app-20220209231846-0056406.048371130false
app-20220209231846-0056353.372252510false
app-20220209231846-0056453.92305930false
app-20220209231846-0056346.0422111840false
app-20220209231846-0056312.9512310false
app-20220209231846-0056414.32655590false
app-20220209231846-0056383.3713866270false
app-20220209231846-0056463.02070false
app-20220209231846-0056333.377910670false
app-20220209231846-0056445.5711420false
app-20220209231846-0056434.32570440false
app-20220209235552-0104333.811445120false
app-20220209235552-0104312.958270false
app-20220209235552-0104347.3671918500false
app-20220209235552-0104354.342220false
app-20220209235552-0104323.831382000false
app-20220209234857-0093354.555599000false
app-20220209234857-0093312.956880false
app-20220209234857-0093333.6623513470false
app-20220209234857-0093344.35879820false
app-20220209234857-0093363.02110false
app-20220209234857-0093322.953130false
app-20220209230539-0032322.9516620false
app-20220209230539-0032373.02610false
app-20220209230539-0032332.959250false
app-20220209230539-0032312.964840false
app-20220209230539-0032342.958270false
app-20220209230539-0032363.912742790false
app-20220209230539-0032353.7227180030false
app-20220209233627-0078362.800true
app-20220209233627-0078354.348946670false
app-20220209233627-0078312.959930false
app-20220209233627-0078386.19494550false
app-20220209233627-0078343.5323098650false
app-20220209233627-0078374.38255040false
app-20220209233627-0078322.9560730false
app-20220209233627-0078332.959800false
app-20220209224945-0016363.3771290false
app-20220209224945-0016312.910900false
app-20220209224945-0016332.98810false
app-20220209224945-0016322.9511360false
app-20220209224945-0016384.342320false
app-20220209224945-0016375.7820740680false
app-20220209224945-0016342.923140false
app-20220209224945-0016353.6121791160false
app-20220209231004-0040332.9511200false
app-20220209231004-0040377.459666640false
app-20220209231004-0040392.7100true
app-20220209231004-0040322.958160false
app-20220209231004-0040312.9510740false
app-20220209231004-0040382.7100true
app-20220209231004-0040343.7223795950false
app-20220209231004-0040416.913281490false
app-20220209231004-0040363.33320480false
app-20220209231004-0040402.7100true
app-20220209231004-0040426.15610890false
app-20220209231004-0040354.017827840false
app-20220209235239-0100372.6700true
app-20220209235239-0100382.6700true
app-20220209235239-0100313.477539400false
app-20220209235239-0100352.6700true
app-20220209235239-0100392.6700true
app-20220209235239-0100366.04199856450false
app-20220209235239-0100413.02130false
app-20220209235239-0100323.377580010false
app-20220209235239-0100342.6700true
app-20220209235239-0100403.97150520false
app-20220209235239-0100332.952050false
app-20220209233659-0079312.9522530false
app-20220209233659-0079352.97180false
app-20220209233659-0079453.02790false
app-20220209233659-0079403.3311205620false
app-20220209233659-0079437.8623789520false
app-20220209233659-0079342.958520false
app-20220209233659-0079443.95905850false
app-20220209233659-0079372.96760false
app-20220209233659-0079382.960620false
app-20220209233659-0079393.3324807460false
app-20220209233659-0079322.957540false
app-20220209233659-0079415.61177366640false
app-20220209233659-0079332.97230false
app-20220209233659-0079423.3711134950false
app-20220209233659-0079362.911170false
app-20220209225644-0022342.9512320false
app-20220209225644-0022413.02790false
app-20220209225644-0022332.921110false
app-20220209225644-0022403.910872300false
app-20220209225644-0022395.818474740false
app-20220209225644-0022383.3349000false
app-20220209225644-0022312.9517870false
app-20220209225644-0022363.6114807740false
app-20220209225644-0022322.949270false
app-20220209225644-0022376.1829402950false
app-20220209225644-0022353.372156610false
app-20220209231740-0054353.7238402250false
app-20220209231740-0054384.310262950false
app-20220209231740-0054424.831824640false
app-20220209231740-0054437.265490330false
app-20220209231740-0054342.910830false
app-20220209231740-0054364.35457390false
app-20220209231740-0054404.832912810false
app-20220209231740-0054312.97800false
app-20220209231740-0054443.02980false
app-20220209231740-0054322.99980false
app-20220209231740-0054373.7216194380false
app-20220209231740-0054414.3420119750299false
app-20220209231740-0054332.962550false
app-20220209231740-0054394.847318390false
app-20220209224833-0014333.332550300false
app-20220209224833-0014468.3515300980false
app-20220209224833-0014395.932135067213506false
app-20220209224833-0014443.5642693785387false
app-20220209224833-0014363.336355570false
app-20220209224833-0014473.02300false
app-20220209224833-0014343.336558960false
app-20220209224833-0014355.931809231180923false
app-20220209224833-0014312.912220false
app-20220209224833-0014415.931717389171738false
app-20220209224833-0014433.43556978139244false
app-20220209224833-0014383.336911750false
app-20220209224833-0014322.911300false
app-20220209224833-0014403.3323204610false
app-20220209224833-0014423.13505475168491false
app-20220209224833-0014453.13451848150616false
app-20220209224833-0014375.933921401392140false
app-20220209234821-0092352.919790false
app-20220209234821-0092363.3319265310false
app-20220209234821-0092405.875887640false
app-20220209234821-0092413.91973380false
app-20220209234821-0092383.37407060false
app-20220209234821-0092395.8137479330false
app-20220209234821-0092312.9510010false
app-20220209234821-0092322.924340false
app-20220209234821-0092373.3711752090false
app-20220209234821-0092342.910700false
app-20220209234821-0092423.02230false
app-20220209234821-0092332.99130false
app-20220209230826-0037722.6300true
app-20220209230826-0037539.243626260false
app-20220209230826-0037692.6300true
app-20220209230826-0037404.32031010false
app-20220209230826-0037662.6300true
app-20220209230826-0037434.31970910false
app-20220209230826-0037602.6300true
app-20220209230826-0037746.1805340false
app-20220209230826-0037524.31984690false
app-20220209230826-0037456.456434960false
app-20220209230826-0037652.6300true
app-20220209230826-0037464.32231090false
app-20220209230826-0037413.611165890false
app-20220209230826-0037374.38405410false
app-20220209230826-0037516.4534932780false
app-20220209230826-0037622.6300true
app-20220209230826-0037682.6300true
app-20220209230826-0037712.6300true
app-20220209230826-0037473.612727110false
app-20220209230826-0037632.6300true
app-20220209230826-0037343.616872560false
app-20220209230826-0037312.911190false
app-20220209230826-0037396.456759460false
app-20220209230826-0037366.4514364740false
app-20220209230826-0037738.961251700false
app-20220209230826-0037562.6300true
app-20220209230826-0037486.456837160false
app-20220209230826-0037572.6300true
app-20220209230826-0037672.6300true
app-20220209230826-0037612.6300true
app-20220209230826-0037353.33465700false
app-20220209230826-0037642.6300true
app-20220209230826-0037542.6300true
app-20220209230826-0037494.31256280false
app-20220209230826-0037332.910880false
app-20220209230826-0037552.6300true
app-20220209230826-0037443.611802990false
app-20220209230826-0037383.6110708350false
app-20220209230826-0037582.6300true
app-20220209230826-0037592.6300true
app-20220209230826-0037322.911710false
app-20220209230826-0037426.456244730false
app-20220209230826-0037702.6300true
app-20220209230826-0037503.613263800false
app-20220209232008-0058343.6828670680false
app-20220209232008-0058334.38655840false
app-20220209232008-0058323.6810354270false
app-20220209232008-0058403.04370false
app-20220209232008-0058364.8421604650false
app-20220209232008-0058394.511613600false
app-20220209232008-0058387.7618165800false
app-20220209232008-0058354.315882800false
app-20220209232008-0058374.847826490false
app-20220209232008-0058312.9510890false
app-20220209235212-0099333.615220360false
app-20220209235212-0099343.685403030false
app-20220209235212-0099312.9565290false
app-20220209235212-0099322.9514040false
app-20220209235212-0099355.46102503485419false
app-20220209235212-0099364.692950false
app-20220209232605-0069322.911190false
app-20220209232605-0069332.9511700false
app-20220209232605-0069312.911610false
app-20220209232605-0069383.04580false
app-20220209232605-0069373.96445890false
app-20220209232605-0069342.96410false
app-20220209232605-0069362.7100true
app-20220209232605-0069353.7235696830false
app-20220209232111-0060332.9560160false
app-20220209232111-0060312.957340false
app-20220209232111-0060373.02360false
app-20220209232111-0060343.7222275260false
app-20220209232111-0060364.3643976128795false
app-20220209232111-0060354.39998770false
app-20220209232111-0060322.911310false
app-20220209224619-0010353.7227700170false
app-20220209224619-0010373.02740false
app-20220209224619-0010322.953080false
app-20220209224619-0010332.9510880false
app-20220209224619-0010363.912422970false
app-20220209224619-0010312.9510880false
app-20220209224619-0010342.9520940false
app-20220209231559-0051342.4500true
app-20220209231559-0051333.549995470false
app-20220209231559-0051422.4500true
app-20220209231559-0051402.4500true
app-20220209231559-0051383.7445855691711false
app-20220209231559-0051362.4500true
app-20220209231559-0051373.741535005307001false
app-20220209231559-0051444.744850false
app-20220209231559-0051313.5441791910false
app-20220209231559-0051453.02580false
app-20220209231559-0051432.4500true
app-20220209231559-0051392.4500true
app-20220209231559-0051415.033420false
app-20220209231559-0051322.922470false
app-20220209231559-0051354.343060false
app-20220209230348-0030652.7400true
app-20220209230348-0030692.7400true
app-20220209230348-0030752.7400true
app-20220209230348-0030802.7400true
app-20220209230348-0030662.7400true
app-20220209230348-0030342.951600false
app-20220209230348-0030812.7400true
app-20220209230348-0030592.7400true
app-20220209230348-0030395.9394887110false
app-20220209230348-0030832.7400true
app-20220209230348-0030323.376792590false
app-20220209230348-0030706.459653110false
app-20220209230348-0030742.7400true
app-20220209230348-0030892.7400true
app-20220209230348-0030532.7400true
app-20220209230348-0030454.151364450false
app-20220209230348-0030522.7400true
app-20220209230348-0030784.31712000false
app-20220209230348-0030862.7400true
app-20220209230348-0030933.5210399325998false
app-20220209230348-0030822.7400true
app-20220209230348-0030572.7400true
app-20220209230348-0030434.2748610false
app-20220209230348-0030544.31785830false
app-20220209230348-0030642.7400true
app-20220209230348-0030722.7400true
app-20220209230348-0030412.7400true
app-20220209230348-0030372.7400true
app-20220209230348-0030402.7400true
app-20220209230348-0030772.7400true
app-20220209230348-0030792.7400true
app-20220209230348-0030472.7400true
app-20220209230348-0030442.7400true
app-20220209230348-0030552.95220false
app-20220209230348-0030636.9112336720false
app-20220209230348-0030562.7400true
app-20220209230348-0030333.33380960false
app-20220209230348-0030732.7400true
app-20220209230348-0030882.7400true
app-20220209230348-0030422.7400true
app-20220209230348-0030712.7400true
app-20220209230348-0030842.7400true
app-20220209230348-0030762.7400true
app-20220209230348-0030352.910770false
app-20220209230348-0030682.7400true
app-20220209230348-0030363.33106600false
app-20220209230348-0030922.7400true
app-20220209230348-0030482.7400true
app-20220209230348-0030496.455181240false
app-20220209230348-0030912.7400true
app-20220209230348-0030672.7400true
Showing the first 1000 rows.
"]}}],"execution_count":0},{"cell_type":"markdown","source":["## Execs Output"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"4d7ce219-ae75-4a0c-a78c-4e7f25b8cd6f","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["execs_output=pd.read_csv(outputpath_string + \"/rapids_4_spark_qualification_output/rapids_4_spark_qualification_output_execs.csv\")\ndisplay(execs_output)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"998b0c51-0cb6-408e-a01a-d1f5b1a61e1f","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":true,"datasetInfos":[],"data":[["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,30,false,"31",null,null,true],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,89,false,"39",null,null,true],["app-20220209224509-0008",24,"WholeStageCodegen (15)","WholeStageCodegen (15)",8.0,4234050,95,true,"39","Sort","96",false],["app-20220209224509-0008",24,"Exchange",null,4.2,584,97,true,"36:39",null,null,false],["app-20220209224509-0008",0,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (8)","WholeStageCodegen (8)",2.9,23059,65,true,"37","Project:Filter:ColumnarToRow","66:67:68",false],["app-20220209224509-0008",24,"Union",null,3.0,0,85,true,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (22)","WholeStageCodegen (22)",4.5,18839,76,true,"40","HashAggregate","77",false],["app-20220209224509-0008",24,"Project",null,3.0,0,60,true,null,null,null,false],["app-20220209224509-0008",24,"Exchange",null,4.2,80029,104,true,"35:39",null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,40,true,null,null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,54,true,null,null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,81,true,null,null,null,false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,536,114,true,"34",null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (6)","WholeStageCodegen (6)",4.5,187988,9,true,"40","HashAggregate","10",false],["app-20220209224509-0008",24,"Project",null,3.0,0,56,true,null,null,null,false],["app-20220209224509-0008",24,"SubqueryBroadcast",null,3.0,1736,70,true,null,null,null,false],["app-20220209224509-0008",14,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,33,true,null,null,null,false],["app-20220209224509-0008",24,"HashAggregate",null,4.5,0,77,true,"40",null,null,false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,750661,109,true,"35",null,null,false],["app-20220209224509-0008",24,"HashAggregate",null,4.5,0,6,true,"40",null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,87,true,null,null,null,false],["app-20220209224509-0008",10,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,35,false,"38",null,null,true],["app-20220209224509-0008",24,"BroadcastExchange",null,3.0,1712,38,true,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",4.13,315026,12,true,"38","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin","13:14:15:16:17",false],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,113,false,"34",null,null,true],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,42,false,"31",null,null,true],["app-20220209224509-0008",22,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.9,760,27,true,"31","Project:Filter:ColumnarToRow","28:29:30",false],["app-20220209224509-0008",1,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"BroadcastExchange",null,3.0,1567,71,true,null,null,null,false],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,62,false,"37",null,null,true],["app-20220209224509-0008",24,"WholeStageCodegen (13)","WholeStageCodegen (13)",2.9,17055,86,true,"39","Project:Filter:ColumnarToRow","87:88:89",false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,283,48,true,"32",null,null,false],["app-20220209224509-0008",24,"Sort",null,8.0,0,103,true,"39",null,null,false],["app-20220209224509-0008",23,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,106,true,null,null,null,false],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,22,false,"38",null,null,true],["app-20220209224509-0008",24,"Union",null,3.0,0,8,true,null,null,null,false],["app-20220209224509-0008",12,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"HashAggregate",null,4.5,0,10,true,"40",null,null,false],["app-20220209224509-0008",24,"Filter",null,2.8,0,73,true,"33",null,null,false],["app-20220209224509-0008",24,"BroadcastExchange",null,3.0,1537,110,true,null,null,null,false],["app-20220209224509-0008",24,"SortMergeJoin",null,22.7,0,94,true,"39",null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,14,true,null,null,null,false],["app-20220209224509-0008",24,"SubqueryBroadcast",null,3.0,1736,101,true,null,null,null,false],["app-20220209224509-0008",24,"BroadcastExchange",null,3.0,1128,44,true,null,null,null,false],["app-20220209224509-0008",16,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"Filter",null,2.8,0,61,true,"37",null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (16)","WholeStageCodegen (16)",2.9,1506623,105,true,"35","Project:Filter:ColumnarToRow","106:107:108",false],["app-20220209224509-0008",24,"Filter",null,2.8,0,34,true,"38",null,null,false],["app-20220209224509-0008",24,"Execute InsertIntoHadoopFsRelationCommand parquet",null,3.0,0,0,true,null,null,null,false],["app-20220209224509-0008",5,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (20)","WholeStageCodegen (20)",2.8,540,111,true,"34","Filter:ColumnarToRow","112:113",false],["app-20220209224509-0008",24,"SubqueryBroadcast",null,3.0,1736,37,true,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (14)","WholeStageCodegen (14)",1.0,4090,98,false,"36","ColumnarToRow","99",false],["app-20220209224509-0008",9,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,12454,69,true,"37",null,null,false],["app-20220209224509-0008",6,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,68,false,"37",null,null,true],["app-20220209224509-0008",24,"Filter",null,2.8,0,21,true,"38",null,null,false],["app-20220209224509-0008",24,"TakeOrderedAndProject",null,3.0,0,1,true,"41:42",null,null,false],["app-20220209224509-0008",24,"BroadcastHashJoin",null,5.09,0,15,true,"38",null,null,false],["app-20220209224509-0008",24,"BroadcastHashJoin",null,5.09,0,57,true,"37",null,null,false],["app-20220209224509-0008",24,"Union",null,3.0,0,18,true,null,null,null,false],["app-20220209224509-0008",2,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (7)","WholeStageCodegen (7)",2.9,247099,59,true,"37","Project:Filter:ColumnarToRow","60:61:62",false],["app-20220209224509-0008",7,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",19,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",4,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (21)","WholeStageCodegen (21)",4.13,3230425,79,true,"39","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin","80:81:82:83:84",false],["app-20220209224509-0008",24,"Exchange",null,4.2,768,78,true,"39:40",null,null,false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,173035,23,true,"38",null,null,false],["app-20220209224509-0008",15,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,47,false,"32",null,null,true],["app-20220209224509-0008",24,"BroadcastHashJoin",null,5.09,0,82,true,"39",null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,66,true,null,null,null,false],["app-20220209224509-0008",24,"SubqueryBroadcast",null,3.0,1736,91,true,null,null,null,false],["app-20220209224509-0008",24,"BroadcastHashJoin",null,5.09,0,84,true,"39",null,null,false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,19562,36,true,"38",null,null,false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,515,75,true,"33",null,null,false],["app-20220209224509-0008",24,"Exchange",null,4.2,206,4,true,"40:41",null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,20,true,null,null,null,false],["app-20220209224509-0008",24,"HashAggregate",null,4.5,0,13,true,"38",null,null,false],["app-20220209224509-0008",24,"BroadcastHashJoin",null,5.09,0,55,true,"37",null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (24)","WholeStageCodegen (24)",4.5,30834,2,true,"41","HashAggregate","3",false],["app-20220209224509-0008",24,"Union",null,3.0,0,58,true,null,null,null,false],["app-20220209224509-0008",24,"Filter",null,2.8,0,29,true,"31",null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (12)","WholeStageCodegen (12)",4.5,34686,49,true,"40","HashAggregate","50",false],["app-20220209224509-0008",24,"HashAggregate",null,4.5,0,50,true,"40",null,null,false],["app-20220209224509-0008",24,"SubqueryBroadcast",null,3.0,1736,64,true,null,null,null,false],["app-20220209224509-0008",24,"Exchange",null,4.2,4425,51,true,"37:40",null,null,false],["app-20220209224509-0008",13,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"Filter",null,2.8,0,88,true,"39",null,null,false],["app-20220209224509-0008",24,"Filter",null,2.8,0,46,true,"32",null,null,false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,743,31,true,"31",null,null,false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,2399,100,true,"36",null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",2.8,291,45,true,"32","Filter:ColumnarToRow","46:47",false],["app-20220209224509-0008",24,"Filter",null,2.8,0,41,true,"31",null,null,false],["app-20220209224509-0008",24,"BroadcastHashJoin",null,5.09,0,17,true,"38",null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,93,true,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.9,325673,19,true,"38","Project:Filter:ColumnarToRow","20:21:22",false],["app-20220209224509-0008",24,"Expand",null,3.0,0,7,true,"40",null,null,false],["app-20220209224509-0008",24,"Exchange",null,4.2,6179,11,true,"38:40",null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,28,true,null,null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,16,true,null,null,null,false],["app-20220209224509-0008",24,"Filter",null,2.8,0,67,true,"37",null,null,false],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,108,false,"35",null,null,true],["app-20220209224509-0008",24,"Filter",null,2.8,0,107,true,"35",null,null,false],["app-20220209224509-0008",24,"SubqueryBroadcast",null,3.0,1736,24,true,null,null,null,false],["app-20220209224509-0008",24,"Filter",null,2.8,0,112,true,"34",null,null,false],["app-20220209224509-0008",24,"Project",null,3.0,0,83,true,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (11)","WholeStageCodegen (11)",4.13,235109,52,true,"37","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin","53:54:55:56:57",false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,132149,63,true,"37",null,null,false],["app-20220209224509-0008",20,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",17,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",3,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",18,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.9,760,39,true,"31","Project:Filter:ColumnarToRow","40:41:42",false],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,99,false,"36",null,null,true],["app-20220209224509-0008",8,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (10)","WholeStageCodegen (10)",2.8,538,72,true,"33","Filter:ColumnarToRow","73:74",false],["app-20220209224509-0008",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",2.9,36275,32,true,"38","Project:Filter:ColumnarToRow","33:34:35",false],["app-20220209224509-0008",24,"HashAggregate",null,4.5,0,53,true,"37",null,null,false],["app-20220209224509-0008",24,"HashAggregate",null,4.5,0,3,true,"41",null,null,false],["app-20220209224509-0008",21,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (23)","WholeStageCodegen (23)",3.75,201149,5,true,"40","HashAggregate:Expand","6:7",false],["app-20220209224509-0008",24,"BroadcastExchange",null,3.0,1712,26,true,null,null,null,false],["app-20220209224509-0008",11,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209224509-0008",24,"WholeStageCodegen (18)","WholeStageCodegen (18)",12.85,3376529,92,true,"39","Project:SortMergeJoin","93:94",false],["app-20220209224509-0008",24,"WholeStageCodegen (17)","WholeStageCodegen (17)",8.0,0,102,true,"39","Sort","103",false],["app-20220209224509-0008",24,"HashAggregate",null,4.5,0,80,true,"39",null,null,false],["app-20220209224509-0008",24,"ReusedExchange",null,1.0,0,25,false,null,null,null,false],["app-20220209224509-0008",24,"ColumnarToRow",null,1.0,0,74,false,"33",null,null,true],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,8648,90,true,"39",null,null,false],["app-20220209224509-0008",24,"Sort",null,8.0,0,96,true,"39",null,null,false],["app-20220209224509-0008",24,"Scan parquet ",null,3.0,743,43,true,"31",null,null,false],["app-20220209235114-0097",24,"Project",null,3.0,0,35,true,null,null,null,false],["app-20220209235114-0097",24,"Filter",null,2.8,0,52,true,"36",null,null,false],["app-20220209235114-0097",24,"Project",null,3.0,0,49,true,null,null,null,false],["app-20220209235114-0097",24,"Project",null,3.0,0,23,true,null,null,null,false],["app-20220209235114-0097",17,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"BroadcastHashJoin",null,5.09,0,16,true,"35",null,null,false],["app-20220209235114-0097",24,"Project",null,3.0,0,13,true,null,null,null,false],["app-20220209235114-0097",9,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"Scan parquet ",null,3.0,913605,20,true,"35",null,null,false],["app-20220209235114-0097",24,"Exchange",null,4.2,969,42,true,"36:38",null,null,false],["app-20220209235114-0097",24,"Scan parquet ",null,3.0,511,38,true,"33",null,null,false],["app-20220209235114-0097",24,"BroadcastHashJoin",null,5.09,0,46,true,"36",null,null,false],["app-20220209235114-0097",24,"Project",null,3.0,0,15,true,null,null,null,false],["app-20220209235114-0097",24,"WholeStageCodegen (6)","WholeStageCodegen (6)",3.84,418053,43,true,"36","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:Filter:ColumnarToRow","44:45:46:47:48:49:50:51:52:53",false],["app-20220209235114-0097",24,"HashAggregate",null,4.5,0,7,true,"40",null,null,false],["app-20220209235114-0097",24,"BroadcastExchange",null,3.0,1401,55,true,null,null,null,false],["app-20220209235114-0097",24,"Execute InsertIntoHadoopFsRelationCommand parquet",null,3.0,0,0,true,null,null,null,false],["app-20220209235114-0097",21,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",20,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"Project",null,3.0,0,17,true,null,null,null,false],["app-20220209235114-0097",24,"Project",null,3.0,0,57,true,null,null,null,false],["app-20220209235114-0097",14,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"Project",null,3.0,0,47,true,null,null,null,false],["app-20220209235114-0097",3,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",22,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"WholeStageCodegen (8)","WholeStageCodegen (8)",4.5,172,6,true,"40","HashAggregate","7",false],["app-20220209235114-0097",8,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"TakeOrderedAndProject",null,3.0,0,2,true,"40:41",null,null,false],["app-20220209235114-0097",24,"Filter",null,2.8,0,36,true,"33",null,null,false],["app-20220209235114-0097",24,"HashAggregate",null,4.5,0,44,true,"36",null,null,false],["app-20220209235114-0097",24,"Scan parquet ",null,3.0,508,60,true,"34",null,null,false],["app-20220209235114-0097",24,"WholeStageCodegen (7)","WholeStageCodegen (7)",4.5,42,40,true,"38","HashAggregate","41",false],["app-20220209235114-0097",24,"Project",null,3.0,0,4,true,null,null,null,false],["app-20220209235114-0097",13,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",3.84,1443692,9,true,"35","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:Filter:ColumnarToRow","10:11:12:13:14:15:16:17:18:19",false],["app-20220209235114-0097",23,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"Project",null,3.0,0,45,true,null,null,null,false],["app-20220209235114-0097",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.9,519,22,true,"31","Project:Filter:ColumnarToRow","23:24:25",false],["app-20220209235114-0097",24,"Project",null,3.0,0,11,true,null,null,null,false],["app-20220209235114-0097",24,"Filter",null,2.8,0,24,true,"31",null,null,false],["app-20220209235114-0097",24,"AdaptiveSparkPlan",null,1.0,0,1,false,null,null,null,false],["app-20220209235114-0097",24,"ColumnarToRow",null,1.0,0,31,false,"32",null,null,true],["app-20220209235114-0097",24,"BroadcastHashJoin",null,5.09,0,14,true,"35",null,null,false],["app-20220209235114-0097",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.9,515,34,true,"33","Project:Filter:ColumnarToRow","35:36:37",false],["app-20220209235114-0097",24,"HashAggregate",null,4.5,0,41,true,"38",null,null,false],["app-20220209235114-0097",4,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"Project",null,3.0,0,29,true,null,null,null,false],["app-20220209235114-0097",24,"WholeStageCodegen (9)","WholeStageCodegen (9)",3.0,96,3,true,"40","Project","4",false],["app-20220209235114-0097",7,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",12,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"Filter",null,2.8,0,58,true,"34",null,null,false],["app-20220209235114-0097",15,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",16,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",1,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"BroadcastHashJoin",null,5.09,0,50,true,"36",null,null,false],["app-20220209235114-0097",19,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",5,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"BroadcastHashJoin",null,5.09,0,48,true,"36",null,null,false],["app-20220209235114-0097",24,"BroadcastNestedLoopJoin",null,3.0,0,5,true,"40",null,null,false],["app-20220209235114-0097",24,"BroadcastExchange",null,3.0,1331,33,true,null,null,null,false],["app-20220209235114-0097",24,"Exchange",null,4.2,2539,8,true,"35:40",null,null,false],["app-20220209235114-0097",24,"BroadcastHashJoin",null,5.09,0,12,true,"35",null,null,false],["app-20220209235114-0097",24,"ColumnarToRow",null,1.0,0,19,false,"35",null,null,true],["app-20220209235114-0097",24,"Scan parquet ",null,3.0,298,32,true,"32",null,null,false],["app-20220209235114-0097",24,"BroadcastExchange",null,3.0,1490,21,true,null,null,null,false],["app-20220209235114-0097",11,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",0,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"BroadcastExchange",null,3.0,1175,27,true,null,null,null,false],["app-20220209235114-0097",24,"ColumnarToRow",null,1.0,0,37,false,"33",null,null,true],["app-20220209235114-0097",24,"Project",null,3.0,0,51,true,null,null,null,false],["app-20220209235114-0097",24,"ColumnarToRow",null,1.0,0,53,false,"36",null,null,true],["app-20220209235114-0097",24,"Scan parquet ",null,3.0,512,26,true,"31",null,null,false],["app-20220209235114-0097",24,"ColumnarToRow",null,1.0,0,59,false,"34",null,null,true],["app-20220209235114-0097",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",2.9,532,56,true,"34","Project:Filter:ColumnarToRow","57:58:59",false],["app-20220209235114-0097",18,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",10,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"Filter",null,2.8,0,30,true,"32",null,null,false],["app-20220209235114-0097",2,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"Scan parquet ",null,3.0,187093,54,true,"36",null,null,false],["app-20220209235114-0097",24,"BroadcastExchange",null,3.0,315,39,true,null,null,null,false],["app-20220209235114-0097",6,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235114-0097",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",2.9,317,28,true,"32","Project:Filter:ColumnarToRow","29:30:31",false],["app-20220209235114-0097",24,"Filter",null,2.8,0,18,true,"35",null,null,false],["app-20220209235114-0097",24,"ColumnarToRow",null,1.0,0,25,false,"31",null,null,true],["app-20220209235114-0097",24,"HashAggregate",null,4.5,0,10,true,"35",null,null,false],["app-20220209230506-0031",24,"BroadcastExchange",null,3.0,1704,49,true,null,null,null,false],["app-20220209230506-0031",24,"Exchange",null,4.2,9,4,true,"39:40",null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (10)","WholeStageCodegen (10)",2.9,635,70,true,"31","Project:Filter:ColumnarToRow","71:72:73",false],["app-20220209230506-0031",24,"WholeStageCodegen (13)","WholeStageCodegen (13)",2.8,4513,81,true,"32","Filter:ColumnarToRow","82:83",false],["app-20220209230506-0031",11,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Project",null,3.0,0,9,true,null,null,null,false],["app-20220209230506-0031",24,"BroadcastExchange",null,3.0,1704,69,true,null,null,null,false],["app-20220209230506-0031",24,"Project",null,3.0,0,23,true,null,null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (8)","WholeStageCodegen (8)",8.0,35213,55,true,"39","Sort","56",false],["app-20220209230506-0031",24,"WholeStageCodegen (7)","WholeStageCodegen (7)",2.8,884757,58,true,"37","Filter:ColumnarToRow","59:60",false],["app-20220209230506-0031",18,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Exchange",null,4.2,6119,42,true,"36:38",null,null,false],["app-20220209230506-0031",13,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (12)","WholeStageCodegen (12)",2.8,817,76,true,"33","Filter:ColumnarToRow","77:78",false],["app-20220209230506-0031",24,"Filter",null,2.8,0,52,true,"31",null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (15)","WholeStageCodegen (15)",4.5,33476,2,true,"40","HashAggregate","3",false],["app-20220209230506-0031",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.8,145646,43,true,"36","Filter:ColumnarToRow","44:45",false],["app-20220209230506-0031",24,"HashAggregate",null,4.5,0,3,true,"40",null,null,false],["app-20220209230506-0031",24,"Filter",null,2.8,0,77,true,"33",null,null,false],["app-20220209230506-0031",24,"Sort",null,8.0,0,20,true,"39",null,null,false],["app-20220209230506-0031",24,"Project",null,3.0,0,36,true,null,null,null,false],["app-20220209230506-0031",24,"Sort",null,8.0,0,26,true,"38",null,null,false],["app-20220209230506-0031",22,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"ColumnarToRow",null,1.0,0,53,false,"31",null,null,true],["app-20220209230506-0031",24,"Project",null,3.0,0,15,true,null,null,null,false],["app-20220209230506-0031",20,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Scan parquet ",null,3.0,59127,46,true,"36",null,null,false],["app-20220209230506-0031",24,"SortMergeJoin",null,22.7,0,18,true,"39",null,null,false],["app-20220209230506-0031",24,"Filter",null,2.8,0,29,true,"35",null,null,false],["app-20220209230506-0031",24,"ColumnarToRow",null,1.0,0,73,false,"31",null,null,true],["app-20220209230506-0031",12,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"ColumnarToRow",null,1.0,0,83,false,"32",null,null,true],["app-20220209230506-0031",9,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (6)","WholeStageCodegen (6)",8.0,1675058,19,true,"39","Sort","20",false],["app-20220209230506-0031",24,"BroadcastHashJoin",null,5.09,0,16,true,"39",null,null,false],["app-20220209230506-0031",6,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",17,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",8,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",21,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Execute InsertIntoHadoopFsRelationCommand parquet",null,3.0,0,0,true,null,null,null,false],["app-20220209230506-0031",24,"Project",null,3.0,0,51,true,null,null,null,false],["app-20220209230506-0031",24,"BroadcastHashJoin",null,5.09,0,8,true,"39",null,null,false],["app-20220209230506-0031",24,"BroadcastHashJoin",null,5.09,0,10,true,"39",null,null,false],["app-20220209230506-0031",15,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Filter",null,2.8,0,37,true,"34",null,null,false],["app-20220209230506-0031",24,"Scan parquet ",null,3.0,610,74,true,"31",null,null,false],["app-20220209230506-0031",16,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Scan parquet ",null,3.0,4268,84,true,"32",null,null,false],["app-20220209230506-0031",10,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",19,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Scan parquet ",null,3.0,610,54,true,"31",null,null,false],["app-20220209230506-0031",24,"Scan parquet ",null,3.0,559865,61,true,"37",null,null,false],["app-20220209230506-0031",24,"Exchange",null,4.2,7697,27,true,"35:38",null,null,false],["app-20220209230506-0031",24,"Project",null,3.0,0,11,true,null,null,null,false],["app-20220209230506-0031",24,"Sort",null,8.0,0,56,true,"39",null,null,false],["app-20220209230506-0031",2,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"BroadcastHashJoin",null,5.09,0,14,true,"39",null,null,false],["app-20220209230506-0031",1,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (9)","WholeStageCodegen (9)",2.9,637,64,true,"34","Project:Filter:ColumnarToRow","65:66:67",false],["app-20220209230506-0031",24,"ColumnarToRow",null,1.0,0,38,false,"34",null,null,true],["app-20220209230506-0031",24,"ColumnarToRow",null,1.0,0,30,false,"35",null,null,true],["app-20220209230506-0031",24,"Exchange",null,4.2,4960,57,true,"37:39",null,null,false],["app-20220209230506-0031",24,"SortMergeJoin",null,22.7,0,24,true,"38",null,null,false],["app-20220209230506-0031",24,"BroadcastExchange",null,3.0,2462,80,true,null,null,null,false],["app-20220209230506-0031",24,"Filter",null,2.8,0,59,true,"37",null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",8.0,968634,40,true,"38","Sort","41",false],["app-20220209230506-0031",24,"BroadcastHashJoin",null,5.09,0,12,true,"39",null,null,false],["app-20220209230506-0031",0,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Filter",null,2.8,0,44,true,"36",null,null,false],["app-20220209230506-0031",7,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"HashAggregate",null,4.5,0,6,true,"39",null,null,false],["app-20220209230506-0031",4,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Project",null,3.0,0,17,true,null,null,null,false],["app-20220209230506-0031",24,"ColumnarToRow",null,1.0,0,67,false,"34",null,null,true],["app-20220209230506-0031",24,"Scan parquet ",null,3.0,618,68,true,"34",null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",12.85,1581047,22,true,"38","Project:SortMergeJoin","23:24",false],["app-20220209230506-0031",24,"Scan parquet ",null,3.0,28231,31,true,"35",null,null,false],["app-20220209230506-0031",24,"Filter",null,2.8,0,72,true,"31",null,null,false],["app-20220209230506-0031",24,"ColumnarToRow",null,1.0,0,45,false,"36",null,null,true],["app-20220209230506-0031",3,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Project",null,3.0,0,71,true,null,null,null,false],["app-20220209230506-0031",24,"Project",null,3.0,0,7,true,null,null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (14)","WholeStageCodegen (14)",5.44,1222545,5,true,"39","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:SortMergeJoin","6:7:8:9:10:11:12:13:14:15:16:17:18",false],["app-20220209230506-0031",24,"WholeStageCodegen (10)","WholeStageCodegen (10)",2.9,635,50,true,"31","Project:Filter:ColumnarToRow","51:52:53",false],["app-20220209230506-0031",24,"Scan parquet ",null,3.0,618,39,true,"34",null,null,false],["app-20220209230506-0031",24,"Filter",null,2.8,0,82,true,"32",null,null,false],["app-20220209230506-0031",24,"BroadcastExchange",null,3.0,1696,75,true,null,null,null,false],["app-20220209230506-0031",24,"Scan parquet ",null,3.0,807,79,true,"33",null,null,false],["app-20220209230506-0031",24,"SubqueryBroadcast",null,3.0,1710,47,true,null,null,null,false],["app-20220209230506-0031",24,"Project",null,3.0,0,13,true,null,null,null,false],["app-20220209230506-0031",24,"BroadcastExchange",null,3.0,1661,34,true,null,null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",8.0,1044148,25,true,"38","Sort","26",false],["app-20220209230506-0031",24,"BroadcastExchange",null,3.0,1661,63,true,null,null,null,false],["app-20220209230506-0031",23,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (9)","WholeStageCodegen (9)",2.9,637,35,true,"34","Project:Filter:ColumnarToRow","36:37:38",false],["app-20220209230506-0031",24,"SubqueryBroadcast",null,3.0,1710,62,true,null,null,null,false],["app-20220209230506-0031",24,"Project",null,3.0,0,65,true,null,null,null,false],["app-20220209230506-0031",24,"TakeOrderedAndProject",null,3.0,0,1,true,"40:41",null,null,false],["app-20220209230506-0031",24,"Filter",null,2.8,0,66,true,"34",null,null,false],["app-20220209230506-0031",24,"ColumnarToRow",null,1.0,0,60,false,"37",null,null,true],["app-20220209230506-0031",24,"ReusedExchange",null,1.0,0,33,false,null,null,null,false],["app-20220209230506-0031",24,"Exchange",null,4.2,9973,21,true,"38:39",null,null,false],["app-20220209230506-0031",24,"ColumnarToRow",null,1.0,0,78,false,"33",null,null,true],["app-20220209230506-0031",24,"SubqueryBroadcast",null,3.0,1680,32,true,null,null,null,false],["app-20220209230506-0031",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.8,61763,28,true,"35","Filter:ColumnarToRow","29:30",false],["app-20220209230506-0031",14,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"Sort",null,8.0,0,41,true,"38",null,null,false],["app-20220209230506-0031",5,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230506-0031",24,"ReusedExchange",null,1.0,0,48,false,null,null,null,false],["app-20220209232634-0070",24,"Window",null,3.0,0,5,true,null,null,null,false],["app-20220209232634-0070",24,"Execute InsertIntoHadoopFsRelationCommand parquet",null,3.0,0,0,true,null,null,null,false],["app-20220209232634-0070",24,"HashAggregate",null,4.5,0,10,true,"35",null,null,false],["app-20220209232634-0070",5,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"Project",null,3.0,0,22,true,null,null,null,false],["app-20220209232634-0070",7,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",2,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"Scan parquet ",null,3.0,297,42,true,"33",null,null,false],["app-20220209232634-0070",24,"Scan parquet ",null,3.0,496,47,true,"32",null,null,false],["app-20220209232634-0070",14,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",1,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",3,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",4.5,170171,9,true,"35","HashAggregate","10",false],["app-20220209232634-0070",24,"Filter",null,2.8,0,26,true,"34",null,null,false],["app-20220209232634-0070",24,"Sort",null,8.0,0,7,true,"36",null,null,false],["app-20220209232634-0070",24,"ColumnarToRow",null,1.0,0,35,false,"33",null,null,true],["app-20220209232634-0070",20,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"Project",null,3.0,0,39,true,null,null,null,false],["app-20220209232634-0070",24,"Project",null,3.0,0,33,true,null,null,null,false],["app-20220209232634-0070",16,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"ColumnarToRow",null,1.0,0,46,false,"32",null,null,true],["app-20220209232634-0070",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",3.95,1233966,12,true,"34","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Filter:ColumnarToRow","13:14:15:16:17:18:19:26:27",false],["app-20220209232634-0070",24,"Exchange",null,4.2,84261,11,true,"34:35",null,null,false],["app-20220209232634-0070",8,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.9,3044,21,true,"31","Project:Filter:ColumnarToRow","22:23:24",false],["app-20220209232634-0070",24,"BroadcastExchange",null,3.0,1460,43,true,null,null,null,false],["app-20220209232634-0070",24,"SubqueryBroadcast",null,3.0,1121,29,true,null,null,null,false],["app-20220209232634-0070",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.8,502,44,true,"32","Filter:ColumnarToRow","45:46",false],["app-20220209232634-0070",24,"WholeStageCodegen (6)","WholeStageCodegen (6)",8.0,134574,6,true,"36","Sort","7",false],["app-20220209232634-0070",10,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"BroadcastExchange",null,3.0,1110,31,true,null,null,null,false],["app-20220209232634-0070",24,"BroadcastHashJoin",null,5.09,0,17,true,"34",null,null,false],["app-20220209232634-0070",12,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",15,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",19,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"ColumnarToRow",null,1.0,0,41,false,"33",null,null,true],["app-20220209232634-0070",24,"TakeOrderedAndProject",null,3.0,0,1,true,"36:37",null,null,false],["app-20220209232634-0070",24,"Filter",null,2.8,0,40,true,"33",null,null,false],["app-20220209232634-0070",4,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"Exchange",null,4.2,32,8,true,"35:36",null,null,false],["app-20220209232634-0070",24,"Project",null,3.0,0,3,true,null,null,null,false],["app-20220209232634-0070",21,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",9,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",2.9,316,38,true,"33","Project:Filter:ColumnarToRow","39:40:41",false],["app-20220209232634-0070",24,"ReusedExchange",null,1.0,0,30,false,null,null,null,false],["app-20220209232634-0070",24,"BroadcastHashJoin",null,5.09,0,15,true,"34",null,null,false],["app-20220209232634-0070",24,"BroadcastHashJoin",null,5.09,0,19,true,"34",null,null,false],["app-20220209232634-0070",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",2.9,316,32,true,"33","Project:Filter:ColumnarToRow","33:34:35",false],["app-20220209232634-0070",24,"Filter",null,2.8,0,23,true,"31",null,null,false],["app-20220209232634-0070",22,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"ColumnarToRow",null,1.0,0,27,false,"34",null,null,true],["app-20220209232634-0070",24,"Scan parquet ",null,3.0,297,36,true,"33",null,null,false],["app-20220209232634-0070",24,"Filter",null,2.8,0,45,true,"32",null,null,false],["app-20220209232634-0070",24,"Project",null,3.0,0,16,true,null,null,null,false],["app-20220209232634-0070",17,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"BroadcastExchange",null,3.0,1726,20,true,null,null,null,false],["app-20220209232634-0070",18,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",13,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"ColumnarToRow",null,1.0,0,24,false,"31",null,null,true],["app-20220209232634-0070",24,"Project",null,3.0,0,14,true,null,null,null,false],["app-20220209232634-0070",6,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"Project",null,3.0,0,18,true,null,null,null,false],["app-20220209232634-0070",24,"Filter",null,1.0,0,4,false,"36",null,null,false],["app-20220209232634-0070",24,"Scan parquet ",null,3.0,651253,28,true,"34",null,null,false],["app-20220209232634-0070",11,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",0,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209232634-0070",24,"HashAggregate",null,4.5,0,13,true,"34",null,null,false],["app-20220209232634-0070",24,"WholeStageCodegen (7)","WholeStageCodegen (7)",2.0,5621,2,true,"36","Project:Filter","3:4",false],["app-20220209232634-0070",24,"BroadcastExchange",null,3.0,1110,37,true,null,null,null,false],["app-20220209232634-0070",24,"Scan parquet ",null,3.0,2913,25,true,"31",null,null,false],["app-20220209232634-0070",24,"Filter",null,2.8,0,34,true,"33",null,null,false],["app-20220209232634-0070",23,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",2,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.8,465,37,true,"33","Filter:ColumnarToRow","38:39",false],["app-20220209225845-0026",24,"SubqueryBroadcast",null,3.0,1608,17,true,null,null,null,false],["app-20220209225845-0026",24,"BroadcastHashJoin",null,5.09,0,13,true,"34",null,null,false],["app-20220209225845-0026",17,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"Exchange",null,4.2,4241,4,true,"34:35",null,null,false],["app-20220209225845-0026",24,"ColumnarToRow",null,1.0,0,39,false,"33",null,null,true],["app-20220209225845-0026",14,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"Scan parquet ",null,3.0,687,24,true,"31",null,null,false],["app-20220209225845-0026",24,"BroadcastHashJoin",null,5.09,0,11,true,"34",null,null,false],["app-20220209225845-0026",13,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",22,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"Scan parquet ",null,3.0,70247,16,true,"34",null,null,false],["app-20220209225845-0026",24,"Project",null,3.0,0,8,true,null,null,null,false],["app-20220209225845-0026",8,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",10,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",3.84,443046,5,true,"34","HashAggregate:Expand:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Filter:ColumnarToRow","6:7:8:9:10:11:12:13:14:15",false],["app-20220209225845-0026",24,"Project",null,3.0,0,10,true,null,null,null,false],["app-20220209225845-0026",24,"HashAggregate",null,4.5,0,6,true,"34",null,null,false],["app-20220209225845-0026",24,"Filter",null,2.8,0,28,true,"31",null,null,false],["app-20220209225845-0026",6,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"Project",null,3.0,0,12,true,null,null,null,false],["app-20220209225845-0026",3,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",16,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"Filter",null,2.8,0,38,true,"33",null,null,false],["app-20220209225845-0026",24,"Project",null,3.0,0,21,true,null,null,null,false],["app-20220209225845-0026",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",2.8,2544,32,true,"32","Filter:ColumnarToRow","33:34",false],["app-20220209225845-0026",24,"Filter",null,2.8,0,14,true,"34",null,null,false],["app-20220209225845-0026",7,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",5,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",9,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"BroadcastHashJoin",null,5.09,0,9,true,"34",null,null,false],["app-20220209225845-0026",23,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"ColumnarToRow",null,1.0,0,29,false,"31",null,null,true],["app-20220209225845-0026",19,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"Scan parquet ",null,3.0,687,30,true,"31",null,null,false],["app-20220209225845-0026",24,"Scan parquet ",null,3.0,2329,35,true,"32",null,null,false],["app-20220209225845-0026",24,"ReusedExchange",null,1.0,0,18,false,null,null,null,false],["app-20220209225845-0026",18,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"Expand",null,3.0,0,7,true,"34",null,null,false],["app-20220209225845-0026",24,"BroadcastExchange",null,3.0,1587,19,true,null,null,null,false],["app-20220209225845-0026",20,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"BroadcastExchange",null,3.0,1326,36,true,null,null,null,false],["app-20220209225845-0026",24,"Filter",null,2.8,0,22,true,"31",null,null,false],["app-20220209225845-0026",24,"Project",null,3.0,0,27,true,null,null,null,false],["app-20220209225845-0026",24,"ColumnarToRow",null,1.0,0,23,false,"31",null,null,true],["app-20220209225845-0026",24,"Filter",null,2.8,0,33,true,"32",null,null,false],["app-20220209225845-0026",24,"BroadcastExchange",null,3.0,1587,25,true,null,null,null,false],["app-20220209225845-0026",24,"TakeOrderedAndProject",null,3.0,0,1,true,"35:36",null,null,false],["app-20220209225845-0026",24,"HashAggregate",null,4.5,0,3,true,"35",null,null,false],["app-20220209225845-0026",21,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"ColumnarToRow",null,1.0,0,34,false,"32",null,null,true],["app-20220209225845-0026",1,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",11,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",4.5,472310,2,true,"35","HashAggregate","3",false],["app-20220209225845-0026",24,"BroadcastExchange",null,3.0,1905,31,true,null,null,null,false],["app-20220209225845-0026",15,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",12,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",0,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209225845-0026",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.9,707,26,true,"31","Project:Filter:ColumnarToRow","27:28:29",false],["app-20220209225845-0026",24,"ColumnarToRow",null,1.0,0,15,false,"34",null,null,true],["app-20220209225845-0026",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.9,707,20,true,"31","Project:Filter:ColumnarToRow","21:22:23",false],["app-20220209225845-0026",24,"Scan parquet ",null,3.0,462,40,true,"33",null,null,false],["app-20220209225845-0026",24,"Execute InsertIntoHadoopFsRelationCommand parquet",null,3.0,0,0,true,null,null,null,false],["app-20220209225845-0026",4,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",1,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",14,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",13,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",5.17,215,2,true,"36","Project:Sort:HashAggregate","3:4:5",false],["app-20220209235526-0103",19,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"BroadcastHashJoin",null,5.09,0,10,true,"34",null,null,false],["app-20220209235526-0103",10,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",9,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",0,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",3,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"Project",null,3.0,0,11,true,null,null,null,false],["app-20220209235526-0103",6,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"Project",null,3.0,0,9,true,null,null,null,false],["app-20220209235526-0103",7,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"BroadcastHashJoin",null,5.09,0,12,true,"34",null,null,false],["app-20220209235526-0103",24,"ColumnarToRow",null,1.0,0,35,false,"31",null,null,true],["app-20220209235526-0103",24,"BroadcastExchange",null,3.0,1307,19,true,null,null,null,false],["app-20220209235526-0103",24,"ColumnarToRow",null,1.0,0,23,false,"33",null,null,true],["app-20220209235526-0103",4,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"ColumnarToRow",null,1.0,0,17,false,"34",null,null,true],["app-20220209235526-0103",22,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",12,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"Scan parquet ",null,3.0,1051436,18,true,"34",null,null,false],["app-20220209235526-0103",15,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"Project",null,3.0,0,27,true,null,null,null,false],["app-20220209235526-0103",24,"HashAggregate",null,4.5,0,8,true,"34",null,null,false],["app-20220209235526-0103",24,"BroadcastExchange",null,3.0,1470,31,true,null,null,null,false],["app-20220209235526-0103",16,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"Scan parquet ",null,3.0,605,36,true,"31",null,null,false],["app-20220209235526-0103",24,"Filter",null,2.8,0,16,true,"34",null,null,false],["app-20220209235526-0103",24,"BroadcastExchange",null,3.0,1146,25,true,null,null,null,false],["app-20220209235526-0103",2,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"Scan parquet ",null,3.0,283,30,true,"32",null,null,false],["app-20220209235526-0103",21,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"Project",null,3.0,0,21,true,null,null,null,false],["app-20220209235526-0103",24,"Execute InsertIntoHadoopFsRelationCommand parquet",null,3.0,0,0,true,null,null,null,false],["app-20220209235526-0103",24,"ColumnarToRow",null,1.0,0,29,false,"32",null,null,true],["app-20220209235526-0103",18,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"Project",null,3.0,0,15,true,null,null,null,false],["app-20220209235526-0103",24,"Filter",null,2.8,0,34,true,"31",null,null,false],["app-20220209235526-0103",24,"Filter",null,2.8,0,28,true,"32",null,null,false],["app-20220209235526-0103",11,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",23,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"AdaptiveSparkPlan",null,1.0,0,1,false,null,null,null,false],["app-20220209235526-0103",24,"Sort",null,8.0,0,4,true,"36",null,null,false],["app-20220209235526-0103",17,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",20,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"BroadcastHashJoin",null,5.09,0,14,true,"34",null,null,false],["app-20220209235526-0103",24,"Scan parquet ",null,3.0,492,24,true,"33",null,null,false],["app-20220209235526-0103",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.9,498,20,true,"33","Project:Filter:ColumnarToRow","21:22:23",false],["app-20220209235526-0103",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",3.84,1577328,7,true,"34","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:Filter:ColumnarToRow","8:9:10:11:12:13:14:15:16:17",false],["app-20220209235526-0103",24,"Project",null,3.0,0,13,true,null,null,null,false],["app-20220209235526-0103",24,"Project",null,3.0,0,33,true,null,null,null,false],["app-20220209235526-0103",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",2.9,303,26,true,"32","Project:Filter:ColumnarToRow","27:28:29",false],["app-20220209235526-0103",5,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"Filter",null,2.8,0,22,true,"33",null,null,false],["app-20220209235526-0103",24,"HashAggregate",null,4.5,0,5,true,"36",null,null,false],["app-20220209235526-0103",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.9,610,32,true,"31","Project:Filter:ColumnarToRow","33:34:35",false],["app-20220209235526-0103",8,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209235526-0103",24,"Exchange",null,4.2,2298,6,true,"34:36",null,null,false],["app-20220209235526-0103",24,"Project",null,3.0,0,3,true,null,null,null,false],["app-20220209231919-0057",16,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",9,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"Execute InsertIntoHadoopFsRelationCommand parquet",null,3.0,0,0,true,null,null,null,false],["app-20220209231919-0057",24,"Exchange",null,4.2,511,24,true,"34:36",null,null,false],["app-20220209231919-0057",14,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"Scan parquet ",null,3.0,298,36,true,"32",null,null,false],["app-20220209231919-0057",24,"Project",null,3.0,0,33,true,null,null,null,false],["app-20220209231919-0057",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",8.0,13538935,22,true,"36","Sort","23",false],["app-20220209231919-0057",0,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"Filter",null,2.8,0,19,true,"35",null,null,false],["app-20220209231919-0057",24,"WholeStageCodegen (7)","WholeStageCodegen (7)",2.9,316,48,true,"32","Project:Filter:ColumnarToRow","49:50:51",false],["app-20220209231919-0057",4,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"Filter",null,2.8,0,44,true,"31",null,null,false],["app-20220209231919-0057",24,"Scan parquet ",null,3.0,285,46,true,"31",null,null,false],["app-20220209231919-0057",24,"ColumnarToRow",null,1.0,0,45,false,"31",null,null,true],["app-20220209231919-0057",24,"BroadcastExchange",null,3.0,1208,31,true,null,null,null,false],["app-20220209231919-0057",3,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"SortMergeJoin",null,22.7,0,14,true,"36",null,null,false],["app-20220209231919-0057",24,"Project",null,3.0,0,13,true,null,null,null,false],["app-20220209231919-0057",17,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",15,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"Filter",null,2.8,0,34,true,"32",null,null,false],["app-20220209231919-0057",24,"ColumnarToRow",null,1.0,0,40,false,"33",null,null,true],["app-20220209231919-0057",24,"Exchange",null,4.2,146476,17,true,"35:36",null,null,false],["app-20220209231919-0057",24,"ColumnarToRow",null,1.0,0,27,false,"34",null,null,true],["app-20220209231919-0057",24,"Scan parquet ",null,3.0,298,52,true,"32",null,null,false],["app-20220209231919-0057",24,"SubqueryBroadcast",null,3.0,1234,29,true,null,null,null,false],["app-20220209231919-0057",1,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",12,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"WholeStageCodegen (8)","WholeStageCodegen (8)",6.06,7555734,5,true,"36","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:SortMergeJoin","6:7:8:9:10:11:12:13:14",false],["app-20220209231919-0057",21,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"Project",null,3.0,0,9,true,null,null,null,false],["app-20220209231919-0057",24,"Filter",null,2.8,0,26,true,"34",null,null,false],["app-20220209231919-0057",13,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.8,76352,25,true,"34","Filter:ColumnarToRow","26:27",false],["app-20220209231919-0057",7,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"TakeOrderedAndProject",null,3.0,0,1,true,"37:38",null,null,false],["app-20220209231919-0057",24,"Filter",null,2.8,0,39,true,"33",null,null,false],["app-20220209231919-0057",24,"Project",null,3.0,0,11,true,null,null,null,false],["app-20220209231919-0057",24,"ColumnarToRow",null,1.0,0,35,false,"32",null,null,true],["app-20220209231919-0057",24,"Scan parquet ",null,3.0,289,41,true,"33",null,null,false],["app-20220209231919-0057",24,"Exchange",null,4.2,1492,4,true,"36:37",null,null,false],["app-20220209231919-0057",18,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"HashAggregate",null,4.5,0,3,true,"37",null,null,false],["app-20220209231919-0057",5,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"WholeStageCodegen (6)","WholeStageCodegen (6)",2.8,313,43,true,"31","Filter:ColumnarToRow","44:45",false],["app-20220209231919-0057",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",8.0,21803,15,true,"36","Sort","16",false],["app-20220209231919-0057",11,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",2.8,302,38,true,"33","Filter:ColumnarToRow","39:40",false],["app-20220209231919-0057",24,"ColumnarToRow",null,1.0,0,20,false,"35",null,null,true],["app-20220209231919-0057",24,"Sort",null,8.0,0,16,true,"36",null,null,false],["app-20220209231919-0057",24,"BroadcastHashJoin",null,5.09,0,10,true,"36",null,null,false],["app-20220209231919-0057",23,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"Scan parquet ",null,3.0,47653,28,true,"34",null,null,false],["app-20220209231919-0057",24,"BroadcastExchange",null,3.0,1208,47,true,null,null,null,false],["app-20220209231919-0057",24,"HashAggregate",null,4.5,0,6,true,"36",null,null,false],["app-20220209231919-0057",24,"BroadcastExchange",null,3.0,1214,37,true,null,null,null,false],["app-20220209231919-0057",24,"Scan parquet ",null,3.0,1472681,21,true,"35",null,null,false],["app-20220209231919-0057",24,"Sort",null,8.0,0,23,true,"36",null,null,false],["app-20220209231919-0057",24,"ReusedExchange",null,1.0,0,30,false,null,null,null,false],["app-20220209231919-0057",24,"BroadcastHashJoin",null,5.09,0,12,true,"36",null,null,false],["app-20220209231919-0057",24,"WholeStageCodegen (7)","WholeStageCodegen (7)",2.9,316,32,true,"32","Project:Filter:ColumnarToRow","33:34:35",false],["app-20220209231919-0057",6,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",10,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"ColumnarToRow",null,1.0,0,51,false,"32",null,null,true],["app-20220209231919-0057",24,"BroadcastHashJoin",null,5.09,0,8,true,"36",null,null,false],["app-20220209231919-0057",24,"Project",null,3.0,0,49,true,null,null,null,false],["app-20220209231919-0057",22,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",2,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"BroadcastExchange",null,3.0,1258,42,true,null,null,null,false],["app-20220209231919-0057",24,"Project",null,3.0,0,7,true,null,null,null,false],["app-20220209231919-0057",24,"WholeStageCodegen (9)","WholeStageCodegen (9)",4.5,84122,2,true,"37","HashAggregate","3",false],["app-20220209231919-0057",8,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",19,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"Filter",null,2.8,0,50,true,"32",null,null,false],["app-20220209231919-0057",20,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231919-0057",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.8,4414001,18,true,"35","Filter:ColumnarToRow","19:20",false],["app-20220209231533-0050",9,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"Filter",null,2.8,0,14,true,"32",null,null,false],["app-20220209231533-0050",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",4.5,80450,2,true,"34","HashAggregate","3",false],["app-20220209231533-0050",24,"BroadcastHashJoin",null,5.09,0,10,true,"33",null,null,false],["app-20220209231533-0050",24,"BroadcastExchange",null,3.0,1432,11,true,null,null,null,false],["app-20220209231533-0050",24,"SubqueryBroadcast",null,3.0,1442,20,true,null,null,null,false],["app-20220209231533-0050",18,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"BroadcastExchange",null,3.0,1461,21,true,null,null,null,false],["app-20220209231533-0050",24,"Project",null,3.0,0,23,true,null,null,null,false],["app-20220209231533-0050",7,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",23,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"Filter",null,2.8,0,17,true,"33",null,null,false],["app-20220209231533-0050",14,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"Filter",null,2.8,0,24,true,"31",null,null,false],["app-20220209231533-0050",24,"HashAggregate",null,4.5,0,6,true,"33",null,null,false],["app-20220209231533-0050",2,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"ColumnarToRow",null,1.0,0,25,false,"31",null,null,true],["app-20220209231533-0050",6,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"Scan parquet ",null,3.0,546,16,true,"32",null,null,false],["app-20220209231533-0050",10,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"Scan parquet ",null,3.0,720290,19,true,"33",null,null,false],["app-20220209231533-0050",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",2.9,661,22,true,"31","Project:Filter:ColumnarToRow","23:24:25",false],["app-20220209231533-0050",17,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"HashAggregate",null,4.5,0,3,true,"34",null,null,false],["app-20220209231533-0050",24,"TakeOrderedAndProject",null,3.0,0,1,true,"34:35",null,null,false],["app-20220209231533-0050",19,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"ColumnarToRow",null,1.0,0,18,false,"33",null,null,true],["app-20220209231533-0050",24,"BroadcastHashJoin",null,5.09,0,8,true,"33",null,null,false],["app-20220209231533-0050",13,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",12,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"Project",null,3.0,0,13,true,null,null,null,false],["app-20220209231533-0050",21,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"ColumnarToRow",null,1.0,0,15,false,"32",null,null,true],["app-20220209231533-0050",8,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"Scan parquet ",null,3.0,652,26,true,"31",null,null,false],["app-20220209231533-0050",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",3.92,1409729,5,true,"33","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Filter:ColumnarToRow","6:7:8:9:10:17:18",false],["app-20220209231533-0050",24,"Project",null,3.0,0,9,true,null,null,null,false],["app-20220209231533-0050",4,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",16,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",22,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",15,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",20,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",1,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",0,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",5,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.9,566,12,true,"32","Project:Filter:ColumnarToRow","13:14:15",false],["app-20220209231533-0050",3,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209231533-0050",24,"Execute InsertIntoHadoopFsRelationCommand parquet",null,3.0,0,0,true,null,null,null,false],["app-20220209231533-0050",24,"Project",null,3.0,0,7,true,null,null,null,false],["app-20220209231533-0050",24,"Exchange",null,4.2,11542,4,true,"33:34",null,null,false],["app-20220209231533-0050",11,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["application_1665146417445_0002",3,"WholeStageCodegen","WholeStageCodegen",3.75,0,3,true,"6","HashAggregate:Project","4:5",false],["application_1665146417445_0002",0,"CollectLimit",null,1.0,0,0,false,null,null,null,false],["application_1665146417445_0002",3,"WholeStageCodegen","WholeStageCodegen",4.5,0,0,true,"7","HashAggregate","1",false],["application_1665146417445_0002",1,"Project",null,3.0,0,1,true,null,null,null,false],["application_1665146417445_0002",0,"WholeStageCodegen","WholeStageCodegen",3.0,0,1,true,null,"Project","2",false],["application_1665146417445_0002",1,"WholeStageCodegen","WholeStageCodegen",3.0,0,0,true,"1","Project","1",false],["application_1665146417445_0002",3,"Exchange",null,4.2,0,6,true,"5",null,null,false],["application_1665146417445_0002",2,"HashAggregate",null,4.5,0,1,true,"4",null,null,false],["application_1665146417445_0002",2,"HashAggregate",null,4.5,0,6,true,"3",null,null,false],["application_1665146417445_0002",2,"HashAggregate",null,4.5,0,4,true,"3",null,null,false],["application_1665146417445_0002",1,"Scan hive ecomm_ops_tables.s0s0jzb_browse_shelf_cat_map",null,1.0,0,2,false,"1",null,null,false],["application_1665146417445_0002",2,"Scan hive ecomm_ops_tables.zzz_dart_browse_ads_prod_mod",null,1.0,0,8,false,"2",null,null,false],["application_1665146417445_0002",0,"Project",null,3.0,0,2,true,null,null,null,false],["application_1665146417445_0002",3,"HashAggregate",null,4.5,0,4,true,"6",null,null,false],["application_1665146417445_0002",3,"HashAggregate",null,4.5,0,1,true,"7",null,null,false],["application_1665146417445_0002",3,"Scan hive ecomm_ops_tables.zzz_dart_browse_ads_prod_mod",null,1.0,0,7,false,"5",null,null,false],["application_1665146417445_0002",2,"HashAggregate",null,4.5,0,5,true,"3",null,null,false],["application_1665146417445_0002",0,"Scan hive ecomm_ops_tables.zzz_dart_browse_ads_prod_mod",null,1.0,0,3,false,"0",null,null,false],["application_1665146417445_0002",2,"WholeStageCodegen","WholeStageCodegen",4.5,0,0,true,"4","HashAggregate","1",false],["application_1665146417445_0002",3,"Project",null,3.0,0,5,true,null,null,null,false],["application_1665146417445_0002",2,"Exchange",null,4.2,0,2,true,"3",null,null,false],["application_1665146417445_0002",2,"WholeStageCodegen","WholeStageCodegen",4.5,0,3,true,"3","HashAggregate:HashAggregate:HashAggregate","4:5:6",false],["application_1665146417445_0002",2,"Exchange",null,4.2,0,7,true,"2",null,null,false],["application_1665146417445_0002",3,"Exchange",null,4.2,0,2,true,"6",null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,36304,36,true,"49:50",null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,1648,96,true,"37:38",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (35)","WholeStageCodegen (35)",8.0,9740356,227,true,"52","Sort","228",false],["app-20220209230053-0028",24,"Project",null,3.0,0,155,true,null,null,null,false],["app-20220209230053-0028",4,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,204,true,null,null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,143,true,null,null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,72,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (6)","WholeStageCodegen (6)",3.43,332556,37,true,"49","Project:Filter:HashAggregate","38:39:40",false],["app-20220209230053-0028",24,"WholeStageCodegen (32)","WholeStageCodegen (32)",3.0,334418,172,true,"44","Project","173",false],["app-20220209230053-0028",24,"SubqueryBroadcast",null,3.0,1605,51,true,null,null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,4.5,0,43,true,"47",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,30,true,null,null,null,false],["app-20220209230053-0028",7,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,17,true,null,null,null,false],["app-20220209230053-0028",24,"BroadcastExchange",null,3.0,108,202,true,null,null,null,false],["app-20220209230053-0028",15,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",3,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,8779,181,true,"41",null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,62,true,"33",null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,224,false,"52",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",8.0,570738,19,true,"50","Sort","20",false],["app-20220209230053-0028",24,"Project",null,3.0,0,225,true,null,null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,223,false,"52",null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,309,177,true,"41:44",null,null,false],["app-20220209230053-0028",24,"TakeOrderedAndProject",null,3.0,0,1,true,"53:54",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (15)","WholeStageCodegen (15)",2.8,21724,137,true,"45","Filter:ColumnarToRow","138:139",false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,12,true,"51",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (23)","WholeStageCodegen (23)",6.96,29347,6,true,"51","HashAggregate:Project:BroadcastHashJoin:Project:SortMergeJoin","7:8:9:10:11",false],["app-20220209230053-0028",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",2.8,2258,215,true,"32","Filter:ColumnarToRow","216:217",false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,241,true,"52",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,228,true,"52",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,236,true,null,null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,189,true,"42",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,287,33,true,"31",null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,157,false,"31",null,null,true],["app-20220209230053-0028",24,"HashAggregate",null,4.5,0,193,true,"40",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,46,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.8,15333,22,true,"48","Filter:ColumnarToRow","23:24",false],["app-20220209230053-0028",6,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",12,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (42)","WholeStageCodegen (42)",8.0,7107509,242,true,"52","Sort","243",false],["app-20220209230053-0028",24,"Sort",null,8.0,0,233,true,"52",null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,49,false,"47",null,null,true],["app-20220209230053-0028",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",8.0,7271900,120,true,"37","Sort","121",false],["app-20220209230053-0028",24,"Filter",null,2.8,0,48,true,"47",null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,8368,15,true,"50:51",null,null,false],["app-20220209230053-0028",24,"BroadcastExchange",null,3.0,1206,127,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (26)","WholeStageCodegen (26)",8.0,616179,175,true,"44","Sort","176",false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,163,false,"52",null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,239,false,"52",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,235,true,"52",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (21)","WholeStageCodegen (21)",5.67,1192790,141,true,"51","Sort:Project:Filter:HashAggregate:HashAggregate:Project:SortMergeJoin","142:143:144:145:146:147:148",false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,226,true,"52",null,null,false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,104,true,"37",null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,118,false,"34",null,null,true],["app-20220209230053-0028",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.9,548,60,true,"33","Project:Filter:ColumnarToRow","61:62:63",false],["app-20220209230053-0028",24,"BroadcastHashJoin",null,5.09,0,165,true,"52",null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,67,true,"32",null,null,false],["app-20220209230053-0028",24,"BroadcastExchange",null,3.0,1152,28,true,null,null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,146,false,"51",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,20,true,"50",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.9,48,203,true,"39","Project:Filter:ColumnarToRow","204:205:206",false],["app-20220209230053-0028",24,"Exchange",null,4.2,106,5,true,"51:53",null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,6954,171,true,"44:52",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,2038,69,true,"32",null,null,false],["app-20220209230053-0028",24,"BroadcastExchange",null,3.0,1925,214,true,null,null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,173,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (47)","WholeStageCodegen (47)",6.96,58082,162,true,"52","HashAggregate:Project:BroadcastHashJoin:Project:SortMergeJoin","163:164:165:166:167",false],["app-20220209230053-0028",24,"WholeStageCodegen (13)","WholeStageCodegen (13)",8.0,7684689,86,true,"51","Sort","87",false],["app-20220209230053-0028",24,"Sort",null,8.0,0,176,true,"44",null,null,false],["app-20220209230053-0028",11,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,4.5,0,190,true,"42",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,152,true,"51",null,null,false],["app-20220209230053-0028",24,"BroadcastExchange",null,3.0,1596,53,true,null,null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,55,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",3.92,4787686,192,true,"40","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Filter:ColumnarToRow","193:194:195:196:197:198:199",false],["app-20220209230053-0028",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",2.9,341,115,true,"34","Project:Filter:ColumnarToRow","116:117:118",false],["app-20220209230053-0028",24,"Project",null,3.0,0,221,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (38)","WholeStageCodegen (38)",5.67,15748975,219,true,"52","Sort:Project:Filter:HashAggregate:HashAggregate:Project:SortMergeJoin","220:221:222:223:224:225:226",false],["app-20220209230053-0028",2,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",9,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,167,true,"52",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (10)","WholeStageCodegen (10)",2.9,1629090,81,true,"46","Project:Filter:ColumnarToRow","82:83:84",false],["app-20220209230053-0028",24,"Filter",null,2.8,0,31,true,"31",null,null,false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,133,true,"51",null,null,false],["app-20220209230053-0028",8,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,2038,218,true,"32",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (8)","WholeStageCodegen (8)",3.0,317013,16,true,"50","Project","17",false],["app-20220209230053-0028",10,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"BroadcastHashJoin",null,5.09,0,102,true,"37",null,null,false],["app-20220209230053-0028",24,"Union",null,3.0,0,2,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (45)","WholeStageCodegen (45)",5.67,579620,234,true,"52","Sort:Project:Filter:HashAggregate:HashAggregate:Project:SortMergeJoin","235:236:237:238:239:240:241",false],["app-20220209230053-0028",24,"HashAggregate",null,4.5,0,95,true,"38",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,230,true,"52",null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,57306,107,true,"35:37",null,null,false],["app-20220209230053-0028",1,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"BroadcastExchange",null,3.0,1152,153,true,null,null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,75,false,"51",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,525,64,true,"33",null,null,false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,231,true,"52",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,142,true,"51",null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,212,false,"33",null,null,true],["app-20220209230053-0028",24,"BroadcastExchange",null,3.0,1596,208,true,null,null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,210,true,null,null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,91,false,"43",null,null,true],["app-20220209230053-0028",24,"WholeStageCodegen (4)","WholeStageCodegen (4)",2.8,2258,66,true,"32","Filter:ColumnarToRow","67:68",false],["app-20220209230053-0028",24,"Filter",null,2.8,0,179,true,"41",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,79,true,"51",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,1128383,111,true,"35",null,null,false],["app-20220209230053-0028",24,"Filter",null,1.0,0,73,false,"51",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",2.9,341,128,true,"34","Project:Filter:ColumnarToRow","129:130:131",false],["app-20220209230053-0028",24,"Sort",null,8.0,0,245,true,"52",null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,24,false,"48",null,null,true],["app-20220209230053-0028",24,"BroadcastHashJoin",null,5.09,0,195,true,"40",null,null,false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,18,true,"50",null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,4,false,"53",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,196,true,null,null,null,false],["app-20220209230053-0028",24,"SubqueryBroadcast",null,3.0,1212,112,true,null,null,null,false],["app-20220209230053-0028",24,"Filter",null,1.0,0,144,false,"51",null,null,false],["app-20220209230053-0028",23,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,374,136,true,"45:52:51",null,null,false],["app-20220209230053-0028",17,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,4.5,0,98,true,"37",null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,216,true,"32",null,null,false],["app-20220209230053-0028",24,"Execute InsertIntoHadoopFsRelationCommand parquet",null,3.0,0,0,true,null,null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,74225,80,true,"46:52:51",null,null,false],["app-20220209230053-0028",24,"BroadcastExchange",null,3.0,1596,59,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (7)","WholeStageCodegen (7)",8.0,265322,34,true,"50","Sort","35",false],["app-20220209230053-0028",24,"Exchange",null,4.2,64,161,true,"52:53",null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,84,false,"46",null,null,true],["app-20220209230053-0028",24,"Project",null,3.0,0,166,true,null,null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,138,true,"45",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,76,true,null,null,null,false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,148,true,"51",null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,36854,186,true,"42:44",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (1)","WholeStageCodegen (1)",2.8,3141204,108,true,"35","Filter:ColumnarToRow","109:110",false],["app-20220209230053-0028",13,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,168,true,"52",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (11)","WholeStageCodegen (11)",8.0,7736910,78,true,"51","Sort","79",false],["app-20220209230053-0028",24,"ReusedExchange",null,1.0,0,27,false,null,null,null,false],["app-20220209230053-0028",24,"SubqueryBroadcast",null,3.0,1183,26,true,null,null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,125,false,"36",null,null,true],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,20580,126,true,"36",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,525,213,true,"33",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (48)","WholeStageCodegen (48)",1.0,3979,159,false,"53","HashAggregate","160",false],["app-20220209230053-0028",24,"Sort",null,8.0,0,106,true,"37",null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,205,true,"39",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,8,true,null,null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,7,false,"51",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (14)","WholeStageCodegen (14)",5.67,13085436,70,true,"51","Sort:Project:Filter:HashAggregate:HashAggregate:Project:SortMergeJoin","71:72:73:74:75:76:77",false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,145,false,"51",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,129,true,null,null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,110,false,"35",null,null,true],["app-20220209230053-0028",24,"WholeStageCodegen (33)","WholeStageCodegen (33)",8.0,1156186,169,true,"52","Sort","170",false],["app-20220209230053-0028",24,"Exchange",null,4.2,34850,41,true,"47:49",null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,32,false,"31",null,null,true],["app-20220209230053-0028",24,"Filter",null,2.8,0,124,true,"36",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,10,true,null,null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,238,false,"52",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,101,true,null,null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,71,true,"51",null,null,false],["app-20220209230053-0028",24,"BroadcastExchange",null,3.0,1925,65,true,null,null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,23,true,"48",null,null,false],["app-20220209230053-0028",18,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"SubqueryBroadcast",null,3.0,1183,182,true,null,null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,170,true,"52",null,null,false],["app-20220209230053-0028",24,"BroadcastHashJoin",null,5.09,0,45,true,"47",null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,180,false,"41",null,null,true],["app-20220209230053-0028",24,"HashAggregate",null,4.5,0,40,true,"49",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,73193,50,true,"47",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (40)","WholeStageCodegen (40)",8.0,0,232,true,"52","Sort","233",false],["app-20220209230053-0028",16,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,198,true,"40",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,7362,25,true,"48",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,240,true,null,null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,211,true,"33",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,121,true,"37",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (18)","WholeStageCodegen (18)",8.0,5641193,149,true,"51","Sort","150",false],["app-20220209230053-0028",24,"Filter",null,2.8,0,117,true,"34",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (22)","WholeStageCodegen (22)",2.9,305,154,true,"31","Project:Filter:ColumnarToRow","155:156:157",false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,11173,140,true,"45",null,null,false],["app-20220209230053-0028",24,"BroadcastExchange",null,3.0,1206,114,true,null,null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,68,false,"32",null,null,true],["app-20220209230053-0028",24,"Filter",null,2.8,0,156,true,"31",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,525,58,true,"33",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,220,true,"52",null,null,false],["app-20220209230053-0028",21,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,174,true,"44",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,361088,85,true,"46",null,null,false],["app-20220209230053-0028",14,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (9)","WholeStageCodegen (9)",8.0,319031,13,true,"51","Sort","14",false],["app-20220209230053-0028",24,"Sort",null,8.0,0,35,true,"50",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,87,true,"51",null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,99,false,"37",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,9723,92,true,"43",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (6)","WholeStageCodegen (6)",5.76,7077480,97,true,"37","HashAggregate:HashAggregate:HashAggregate:Project:BroadcastHashJoin:Project:SortMergeJoin","98:99:100:101:102:103:104",false],["app-20220209230053-0028",24,"WholeStageCodegen (22)","WholeStageCodegen (22)",2.9,305,29,true,"31","Project:Filter:ColumnarToRow","30:31:32",false],["app-20220209230053-0028",24,"BroadcastHashJoin",null,5.09,0,47,true,"47",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,188,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (12)","WholeStageCodegen (12)",2.8,14372,89,true,"43","Filter:ColumnarToRow","90:91",false],["app-20220209230053-0028",24,"SubqueryBroadcast",null,3.0,108,201,true,null,null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,82,true,null,null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,217,false,"32",null,null,true],["app-20220209230053-0028",24,"Filter",null,1.0,0,222,false,"52",null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,130,true,"34",null,null,false],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,11,true,"51",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,116,true,null,null,null,false],["app-20220209230053-0028",24,"ReusedExchange",null,1.0,0,52,false,null,null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,39,true,"49",null,null,false],["app-20220209230053-0028",5,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,194,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.8,27817,123,true,"36","Filter:ColumnarToRow","124:125",false],["app-20220209230053-0028",24,"Filter",null,2.8,0,83,true,"46",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,164,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",8.0,7610479,105,true,"37","Sort","106",false],["app-20220209230053-0028",24,"Exchange",null,4.2,24920,191,true,"40:42",null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,109,true,"35",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,103,true,null,null,null,false],["app-20220209230053-0028",20,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Filter",null,1.0,0,237,false,"52",null,null,false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,57,false,"33",null,null,true],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,139,false,"45",null,null,true],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,131,false,"34",null,null,true],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,63,false,"33",null,null,true],["app-20220209230053-0028",24,"WholeStageCodegen (25)","WholeStageCodegen (25)",2.8,15032,178,true,"41","Filter:ColumnarToRow","179:180",false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,206,false,"39",null,null,true],["app-20220209230053-0028",24,"SortMergeJoin",null,22.7,0,77,true,"51",null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,124,122,true,"36:37",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (37)","WholeStageCodegen (37)",8.0,9684161,229,true,"52","Sort","230",false],["app-20220209230053-0028",24,"ColumnarToRow",null,1.0,0,199,false,"40",null,null,true],["app-20220209230053-0028",24,"Sort",null,8.0,0,150,true,"51",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,147,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (24)","WholeStageCodegen (24)",1.0,15386,3,false,"53","HashAggregate","4",false],["app-20220209230053-0028",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.9,548,209,true,"33","Project:Filter:ColumnarToRow","210:211:212",false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,287,158,true,"31",null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,74,false,"51",null,null,false],["app-20220209230053-0028",24,"ReusedExchange",null,1.0,0,113,false,null,null,null,false],["app-20220209230053-0028",24,"Subquery",null,1.0,0,93,false,null,null,null,false],["app-20220209230053-0028",24,"Exchange",null,4.2,152,88,true,"43:52:51",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,135,true,"51",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,38,true,null,null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,160,false,"53",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,324,132,true,"34",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (20)","WholeStageCodegen (20)",8.0,5632344,151,true,"51","Sort","152",false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,104034,200,true,"40",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (31)","WholeStageCodegen (31)",8.0,280275,183,true,"44","Sort","184",false],["app-20220209230053-0028",24,"Exchange",null,4.2,819,21,true,"48:50",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (3)","WholeStageCodegen (3)",2.9,548,54,true,"33","Project:Filter:ColumnarToRow","55:56:57",false],["app-20220209230053-0028",24,"WholeStageCodegen (7)","WholeStageCodegen (7)",4.5,9,94,true,"38","HashAggregate","95",false],["app-20220209230053-0028",0,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,90,true,"43",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,31,207,true,"39",null,null,false],["app-20220209230053-0028",24,"ReusedExchange",null,1.0,0,185,false,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",3.92,4849898,42,true,"47","HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Filter:ColumnarToRow","43:44:45:46:47:48:49",false],["app-20220209230053-0028",24,"Sort",null,8.0,0,243,true,"52",null,null,false],["app-20220209230053-0028",24,"HashAggregate",null,1.0,0,100,false,"37",null,null,false],["app-20220209230053-0028",24,"BroadcastHashJoin",null,5.09,0,197,true,"40",null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (6)","WholeStageCodegen (6)",3.43,329696,187,true,"42","Project:Filter:HashAggregate","188:189:190",false],["app-20220209230053-0028",24,"Sort",null,8.0,0,184,true,"44",null,null,false],["app-20220209230053-0028",24,"Scan parquet ",null,3.0,324,119,true,"34",null,null,false],["app-20220209230053-0028",22,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Filter",null,2.8,0,56,true,"33",null,null,false],["app-20220209230053-0028",24,"Sort",null,8.0,0,14,true,"51",null,null,false],["app-20220209230053-0028",24,"BroadcastHashJoin",null,5.09,0,9,true,"51",null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,61,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (16)","WholeStageCodegen (16)",8.0,0,134,true,"51","Sort","135",false],["app-20220209230053-0028",19,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230053-0028",24,"Project",null,3.0,0,44,true,null,null,null,false],["app-20220209230053-0028",24,"WholeStageCodegen (44)","WholeStageCodegen (44)",8.0,7091464,244,true,"52","Sort","245",false],["app-20220209230750-0036",24,"WholeStageCodegen (19)","WholeStageCodegen (19)",2.8,113485,82,true,"40","Filter:ColumnarToRow","83:84",false],["app-20220209230750-0036",24,"Project",null,3.0,0,5,true,null,null,null,false],["app-20220209230750-0036",24,"SortMergeJoin",null,22.7,0,23,true,"37",null,null,false],["app-20220209230750-0036",24,"ColumnarToRow",null,1.0,0,39,false,"32",null,null,true],["app-20220209230750-0036",24,"HashAggregate",null,4.5,0,57,true,"41",null,null,false],["app-20220209230750-0036",24,"ColumnarToRow",null,1.0,0,90,false,"31",null,null,true],["app-20220209230750-0036",24,"Filter",null,2.8,0,17,true,"38",null,null,false],["app-20220209230750-0036",24,"Scan parquet ",null,3.0,9398,53,true,"33",null,null,false],["app-20220209230750-0036",24,"Scan parquet ",null,3.0,8927,91,true,"31",null,null,false],["app-20220209230750-0036",24,"ReusedExchange",null,1.0,0,34,false,null,null,null,false],["app-20220209230750-0036",24,"BroadcastHashJoin",null,5.09,0,4,true,"42",null,null,false],["app-20220209230750-0036",24,"BroadcastExchange",null,3.0,1494,35,true,null,null,null,false],["app-20220209230750-0036",14,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230750-0036",24,"Sort",null,8.0,0,55,true,"41",null,null,false],["app-20220209230750-0036",24,"Project",null,3.0,0,71,true,null,null,null,false],["app-20220209230750-0036",24,"WholeStageCodegen (11)","WholeStageCodegen (11)",8.0,625159,67,true,"35","Sort","68",false],["app-20220209230750-0036",24,"Scan parquet ",null,3.0,62819,85,true,"40",null,null,false],["app-20220209230750-0036",11,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230750-0036",24,"WholeStageCodegen (6)","WholeStageCodegen (6)",10.07,1910905,20,true,"37","HashAggregate:Project:SortMergeJoin","21:22:23",false],["app-20220209230750-0036",24,"Filter",null,1.0,0,56,false,"41",null,null,false],["app-20220209230750-0036",24,"SortMergeJoin",null,22.7,0,66,true,"35",null,null,false],["app-20220209230750-0036",24,"Sort",null,8.0,0,14,true,"41",null,null,false],["app-20220209230750-0036",24,"HashAggregate",null,4.5,0,61,true,"39",null,null,false],["app-20220209230750-0036",24,"Sort",null,8.0,0,25,true,"37",null,null,false],["app-20220209230750-0036",24,"Sort",null,8.0,0,8,true,"42",null,null,false],["app-20220209230750-0036",3,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230750-0036",24,"WholeStageCodegen (14)","WholeStageCodegen (14)",10.07,541305,63,true,"35","HashAggregate:Project:SortMergeJoin","64:65:66",false],["app-20220209230750-0036",24,"Project",null,3.0,0,22,true,null,null,null,false],["app-20220209230750-0036",24,"ColumnarToRow",null,1.0,0,52,false,"33",null,null,true],["app-20220209230750-0036",24,"WholeStageCodegen (7)","WholeStageCodegen (7)",3.65,356825,16,true,"38","Filter:HashAggregate","17:18",false],["app-20220209230750-0036",24,"Filter",null,2.8,0,89,true,"31",null,null,false],["app-20220209230750-0036",15,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230750-0036",5,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230750-0036",16,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230750-0036",24,"WholeStageCodegen (2)","WholeStageCodegen (2)",3.63,404429,27,true,"36","Project:BroadcastHashJoin:Filter:ColumnarToRow","28:29:30:31",false],["app-20220209230750-0036",24,"BroadcastExchange",null,3.0,1494,41,true,null,null,null,false],["app-20220209230750-0036",24,"Project",null,3.0,0,65,true,null,null,null,false],["app-20220209230750-0036",24,"HashAggregate",null,4.5,0,21,true,"37",null,null,false],["app-20220209230750-0036",2,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230750-0036",24,"Project",null,3.0,0,37,true,null,null,null,false],["app-20220209230750-0036",4,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230750-0036",7,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230750-0036",24,"WholeStageCodegen (18)","WholeStageCodegen (18)",8.0,438264,7,true,"42","Sort","8",false],["app-20220209230750-0036",0,"Execute CreateViewCommand",null,1.0,0,0,false,null,null,null,false],["app-20220209230750-0036",24,"Exchange",null,4.2,91525,69,true,"34:35",null,null,false],["app-20220209230750-0036",24,"HashAggregate",null,4.5,0,64,true,"35",null,null,false],["app-20220209230750-0036",24,"WholeStageCodegen (5)","WholeStageCodegen (5)",8.0,1769290,47,true,"37","Sort","48",false]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"App ID","type":"\"string\"","metadata":"{}"},{"name":"SQL ID","type":"\"long\"","metadata":"{}"},{"name":"Exec Name","type":"\"string\"","metadata":"{}"},{"name":"Expression Name","type":"\"string\"","metadata":"{}"},{"name":"Task Speedup Factor","type":"\"double\"","metadata":"{}"},{"name":"Exec Duration","type":"\"long\"","metadata":"{}"},{"name":"SQL Node Id","type":"\"long\"","metadata":"{}"},{"name":"Exec Is Supported","type":"\"boolean\"","metadata":"{}"},{"name":"Exec Stages","type":"\"string\"","metadata":"{}"},{"name":"Exec Children","type":"\"string\"","metadata":"{}"},{"name":"Exec Children Node Ids","type":"\"string\"","metadata":"{}"},{"name":"Exec Should Remove","type":"\"boolean\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
App IDSQL IDExec NameExpression NameTask Speedup FactorExec DurationSQL Node IdExec Is SupportedExec StagesExec ChildrenExec Children Node IdsExec Should Remove
app-20220209224509-000824ColumnarToRownull1.0030false31nullnulltrue
app-20220209224509-000824ColumnarToRownull1.0089false39nullnulltrue
app-20220209224509-000824WholeStageCodegen (15)WholeStageCodegen (15)8.0423405095true39Sort96false
app-20220209224509-000824Exchangenull4.258497true36:39nullnullfalse
app-20220209224509-00080Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (8)WholeStageCodegen (8)2.92305965true37Project:Filter:ColumnarToRow66:67:68false
app-20220209224509-000824Unionnull3.0085truenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (22)WholeStageCodegen (22)4.51883976true40HashAggregate77false
app-20220209224509-000824Projectnull3.0060truenullnullnullfalse
app-20220209224509-000824Exchangenull4.280029104true35:39nullnullfalse
app-20220209224509-000824Projectnull3.0040truenullnullnullfalse
app-20220209224509-000824Projectnull3.0054truenullnullnullfalse
app-20220209224509-000824Projectnull3.0081truenullnullnullfalse
app-20220209224509-000824Scan parquet null3.0536114true34nullnullfalse
app-20220209224509-000824WholeStageCodegen (6)WholeStageCodegen (6)4.51879889true40HashAggregate10false
app-20220209224509-000824Projectnull3.0056truenullnullnullfalse
app-20220209224509-000824SubqueryBroadcastnull3.0173670truenullnullnullfalse
app-20220209224509-000814Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824Projectnull3.0033truenullnullnullfalse
app-20220209224509-000824HashAggregatenull4.5077true40nullnullfalse
app-20220209224509-000824Scan parquet null3.0750661109true35nullnullfalse
app-20220209224509-000824HashAggregatenull4.506true40nullnullfalse
app-20220209224509-000824Projectnull3.0087truenullnullnullfalse
app-20220209224509-000810Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824ColumnarToRownull1.0035false38nullnulltrue
app-20220209224509-000824BroadcastExchangenull3.0171238truenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (5)WholeStageCodegen (5)4.1331502612true38HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin13:14:15:16:17false
app-20220209224509-000824ColumnarToRownull1.00113false34nullnulltrue
app-20220209224509-000824ColumnarToRownull1.0042false31nullnulltrue
app-20220209224509-000822Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (3)WholeStageCodegen (3)2.976027true31Project:Filter:ColumnarToRow28:29:30false
app-20220209224509-00081Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824BroadcastExchangenull3.0156771truenullnullnullfalse
app-20220209224509-000824ColumnarToRownull1.0062false37nullnulltrue
app-20220209224509-000824WholeStageCodegen (13)WholeStageCodegen (13)2.91705586true39Project:Filter:ColumnarToRow87:88:89false
app-20220209224509-000824Scan parquet null3.028348true32nullnullfalse
app-20220209224509-000824Sortnull8.00103true39nullnullfalse
app-20220209224509-000823Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824Projectnull3.00106truenullnullnullfalse
app-20220209224509-000824ColumnarToRownull1.0022false38nullnulltrue
app-20220209224509-000824Unionnull3.008truenullnullnullfalse
app-20220209224509-000812Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824HashAggregatenull4.5010true40nullnullfalse
app-20220209224509-000824Filternull2.8073true33nullnullfalse
app-20220209224509-000824BroadcastExchangenull3.01537110truenullnullnullfalse
app-20220209224509-000824SortMergeJoinnull22.7094true39nullnullfalse
app-20220209224509-000824Projectnull3.0014truenullnullnullfalse
app-20220209224509-000824SubqueryBroadcastnull3.01736101truenullnullnullfalse
app-20220209224509-000824BroadcastExchangenull3.0112844truenullnullnullfalse
app-20220209224509-000816Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824Filternull2.8061true37nullnullfalse
app-20220209224509-000824WholeStageCodegen (16)WholeStageCodegen (16)2.91506623105true35Project:Filter:ColumnarToRow106:107:108false
app-20220209224509-000824Filternull2.8034true38nullnullfalse
app-20220209224509-000824Execute InsertIntoHadoopFsRelationCommand parquetnull3.000truenullnullnullfalse
app-20220209224509-00085Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (20)WholeStageCodegen (20)2.8540111true34Filter:ColumnarToRow112:113false
app-20220209224509-000824SubqueryBroadcastnull3.0173637truenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (14)WholeStageCodegen (14)1.0409098false36ColumnarToRow99false
app-20220209224509-00089Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824Scan parquet null3.01245469true37nullnullfalse
app-20220209224509-00086Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824ColumnarToRownull1.0068false37nullnulltrue
app-20220209224509-000824Filternull2.8021true38nullnullfalse
app-20220209224509-000824TakeOrderedAndProjectnull3.001true41:42nullnullfalse
app-20220209224509-000824BroadcastHashJoinnull5.09015true38nullnullfalse
app-20220209224509-000824BroadcastHashJoinnull5.09057true37nullnullfalse
app-20220209224509-000824Unionnull3.0018truenullnullnullfalse
app-20220209224509-00082Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (7)WholeStageCodegen (7)2.924709959true37Project:Filter:ColumnarToRow60:61:62false
app-20220209224509-00087Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000819Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-00084Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (21)WholeStageCodegen (21)4.13323042579true39HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin80:81:82:83:84false
app-20220209224509-000824Exchangenull4.276878true39:40nullnullfalse
app-20220209224509-000824Scan parquet null3.017303523true38nullnullfalse
app-20220209224509-000815Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824ColumnarToRownull1.0047false32nullnulltrue
app-20220209224509-000824BroadcastHashJoinnull5.09082true39nullnullfalse
app-20220209224509-000824Projectnull3.0066truenullnullnullfalse
app-20220209224509-000824SubqueryBroadcastnull3.0173691truenullnullnullfalse
app-20220209224509-000824BroadcastHashJoinnull5.09084true39nullnullfalse
app-20220209224509-000824Scan parquet null3.01956236true38nullnullfalse
app-20220209224509-000824Scan parquet null3.051575true33nullnullfalse
app-20220209224509-000824Exchangenull4.22064true40:41nullnullfalse
app-20220209224509-000824Projectnull3.0020truenullnullnullfalse
app-20220209224509-000824HashAggregatenull4.5013true38nullnullfalse
app-20220209224509-000824BroadcastHashJoinnull5.09055true37nullnullfalse
app-20220209224509-000824WholeStageCodegen (24)WholeStageCodegen (24)4.5308342true41HashAggregate3false
app-20220209224509-000824Unionnull3.0058truenullnullnullfalse
app-20220209224509-000824Filternull2.8029true31nullnullfalse
app-20220209224509-000824WholeStageCodegen (12)WholeStageCodegen (12)4.53468649true40HashAggregate50false
app-20220209224509-000824HashAggregatenull4.5050true40nullnullfalse
app-20220209224509-000824SubqueryBroadcastnull3.0173664truenullnullnullfalse
app-20220209224509-000824Exchangenull4.2442551true37:40nullnullfalse
app-20220209224509-000813Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824Filternull2.8088true39nullnullfalse
app-20220209224509-000824Filternull2.8046true32nullnullfalse
app-20220209224509-000824Scan parquet null3.074331true31nullnullfalse
app-20220209224509-000824Scan parquet null3.02399100true36nullnullfalse
app-20220209224509-000824WholeStageCodegen (4)WholeStageCodegen (4)2.829145true32Filter:ColumnarToRow46:47false
app-20220209224509-000824Filternull2.8041true31nullnullfalse
app-20220209224509-000824BroadcastHashJoinnull5.09017true38nullnullfalse
app-20220209224509-000824Projectnull3.0093truenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (1)WholeStageCodegen (1)2.932567319true38Project:Filter:ColumnarToRow20:21:22false
app-20220209224509-000824Expandnull3.007true40nullnullfalse
app-20220209224509-000824Exchangenull4.2617911true38:40nullnullfalse
app-20220209224509-000824Projectnull3.0028truenullnullnullfalse
app-20220209224509-000824Projectnull3.0016truenullnullnullfalse
app-20220209224509-000824Filternull2.8067true37nullnullfalse
app-20220209224509-000824ColumnarToRownull1.00108false35nullnulltrue
app-20220209224509-000824Filternull2.80107true35nullnullfalse
app-20220209224509-000824SubqueryBroadcastnull3.0173624truenullnullnullfalse
app-20220209224509-000824Filternull2.80112true34nullnullfalse
app-20220209224509-000824Projectnull3.0083truenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (11)WholeStageCodegen (11)4.1323510952true37HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin53:54:55:56:57false
app-20220209224509-000824Scan parquet null3.013214963true37nullnullfalse
app-20220209224509-000820Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000817Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-00083Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000818Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (3)WholeStageCodegen (3)2.976039true31Project:Filter:ColumnarToRow40:41:42false
app-20220209224509-000824ColumnarToRownull1.0099false36nullnulltrue
app-20220209224509-00088Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (10)WholeStageCodegen (10)2.853872true33Filter:ColumnarToRow73:74false
app-20220209224509-000824WholeStageCodegen (2)WholeStageCodegen (2)2.93627532true38Project:Filter:ColumnarToRow33:34:35false
app-20220209224509-000824HashAggregatenull4.5053true37nullnullfalse
app-20220209224509-000824HashAggregatenull4.503true41nullnullfalse
app-20220209224509-000821Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (23)WholeStageCodegen (23)3.752011495true40HashAggregate:Expand6:7false
app-20220209224509-000824BroadcastExchangenull3.0171226truenullnullnullfalse
app-20220209224509-000811Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209224509-000824WholeStageCodegen (18)WholeStageCodegen (18)12.85337652992true39Project:SortMergeJoin93:94false
app-20220209224509-000824WholeStageCodegen (17)WholeStageCodegen (17)8.00102true39Sort103false
app-20220209224509-000824HashAggregatenull4.5080true39nullnullfalse
app-20220209224509-000824ReusedExchangenull1.0025falsenullnullnullfalse
app-20220209224509-000824ColumnarToRownull1.0074false33nullnulltrue
app-20220209224509-000824Scan parquet null3.0864890true39nullnullfalse
app-20220209224509-000824Sortnull8.0096true39nullnullfalse
app-20220209224509-000824Scan parquet null3.074343true31nullnullfalse
app-20220209235114-009724Projectnull3.0035truenullnullnullfalse
app-20220209235114-009724Filternull2.8052true36nullnullfalse
app-20220209235114-009724Projectnull3.0049truenullnullnullfalse
app-20220209235114-009724Projectnull3.0023truenullnullnullfalse
app-20220209235114-009717Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724BroadcastHashJoinnull5.09016true35nullnullfalse
app-20220209235114-009724Projectnull3.0013truenullnullnullfalse
app-20220209235114-00979Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724Scan parquet null3.091360520true35nullnullfalse
app-20220209235114-009724Exchangenull4.296942true36:38nullnullfalse
app-20220209235114-009724Scan parquet null3.051138true33nullnullfalse
app-20220209235114-009724BroadcastHashJoinnull5.09046true36nullnullfalse
app-20220209235114-009724Projectnull3.0015truenullnullnullfalse
app-20220209235114-009724WholeStageCodegen (6)WholeStageCodegen (6)3.8441805343true36HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:Filter:ColumnarToRow44:45:46:47:48:49:50:51:52:53false
app-20220209235114-009724HashAggregatenull4.507true40nullnullfalse
app-20220209235114-009724BroadcastExchangenull3.0140155truenullnullnullfalse
app-20220209235114-009724Execute InsertIntoHadoopFsRelationCommand parquetnull3.000truenullnullnullfalse
app-20220209235114-009721Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009720Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724Projectnull3.0017truenullnullnullfalse
app-20220209235114-009724Projectnull3.0057truenullnullnullfalse
app-20220209235114-009714Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724Projectnull3.0047truenullnullnullfalse
app-20220209235114-00973Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009722Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724WholeStageCodegen (8)WholeStageCodegen (8)4.51726true40HashAggregate7false
app-20220209235114-00978Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724TakeOrderedAndProjectnull3.002true40:41nullnullfalse
app-20220209235114-009724Filternull2.8036true33nullnullfalse
app-20220209235114-009724HashAggregatenull4.5044true36nullnullfalse
app-20220209235114-009724Scan parquet null3.050860true34nullnullfalse
app-20220209235114-009724WholeStageCodegen (7)WholeStageCodegen (7)4.54240true38HashAggregate41false
app-20220209235114-009724Projectnull3.004truenullnullnullfalse
app-20220209235114-009713Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724WholeStageCodegen (5)WholeStageCodegen (5)3.8414436929true35HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:Filter:ColumnarToRow10:11:12:13:14:15:16:17:18:19false
app-20220209235114-009723Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724Projectnull3.0045truenullnullnullfalse
app-20220209235114-009724WholeStageCodegen (1)WholeStageCodegen (1)2.951922true31Project:Filter:ColumnarToRow23:24:25false
app-20220209235114-009724Projectnull3.0011truenullnullnullfalse
app-20220209235114-009724Filternull2.8024true31nullnullfalse
app-20220209235114-009724AdaptiveSparkPlannull1.001falsenullnullnullfalse
app-20220209235114-009724ColumnarToRownull1.0031false32nullnulltrue
app-20220209235114-009724BroadcastHashJoinnull5.09014true35nullnullfalse
app-20220209235114-009724WholeStageCodegen (3)WholeStageCodegen (3)2.951534true33Project:Filter:ColumnarToRow35:36:37false
app-20220209235114-009724HashAggregatenull4.5041true38nullnullfalse
app-20220209235114-00974Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724Projectnull3.0029truenullnullnullfalse
app-20220209235114-009724WholeStageCodegen (9)WholeStageCodegen (9)3.0963true40Project4false
app-20220209235114-00977Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009712Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724Filternull2.8058true34nullnullfalse
app-20220209235114-009715Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009716Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-00971Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724BroadcastHashJoinnull5.09050true36nullnullfalse
app-20220209235114-009719Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-00975Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724BroadcastHashJoinnull5.09048true36nullnullfalse
app-20220209235114-009724BroadcastNestedLoopJoinnull3.005true40nullnullfalse
app-20220209235114-009724BroadcastExchangenull3.0133133truenullnullnullfalse
app-20220209235114-009724Exchangenull4.225398true35:40nullnullfalse
app-20220209235114-009724BroadcastHashJoinnull5.09012true35nullnullfalse
app-20220209235114-009724ColumnarToRownull1.0019false35nullnulltrue
app-20220209235114-009724Scan parquet null3.029832true32nullnullfalse
app-20220209235114-009724BroadcastExchangenull3.0149021truenullnullnullfalse
app-20220209235114-009711Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-00970Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724BroadcastExchangenull3.0117527truenullnullnullfalse
app-20220209235114-009724ColumnarToRownull1.0037false33nullnulltrue
app-20220209235114-009724Projectnull3.0051truenullnullnullfalse
app-20220209235114-009724ColumnarToRownull1.0053false36nullnulltrue
app-20220209235114-009724Scan parquet null3.051226true31nullnullfalse
app-20220209235114-009724ColumnarToRownull1.0059false34nullnulltrue
app-20220209235114-009724WholeStageCodegen (4)WholeStageCodegen (4)2.953256true34Project:Filter:ColumnarToRow57:58:59false
app-20220209235114-009718Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009710Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724Filternull2.8030true32nullnullfalse
app-20220209235114-00972Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724Scan parquet null3.018709354true36nullnullfalse
app-20220209235114-009724BroadcastExchangenull3.031539truenullnullnullfalse
app-20220209235114-00976Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235114-009724WholeStageCodegen (2)WholeStageCodegen (2)2.931728true32Project:Filter:ColumnarToRow29:30:31false
app-20220209235114-009724Filternull2.8018true35nullnullfalse
app-20220209235114-009724ColumnarToRownull1.0025false31nullnulltrue
app-20220209235114-009724HashAggregatenull4.5010true35nullnullfalse
app-20220209230506-003124BroadcastExchangenull3.0170449truenullnullnullfalse
app-20220209230506-003124Exchangenull4.294true39:40nullnullfalse
app-20220209230506-003124WholeStageCodegen (10)WholeStageCodegen (10)2.963570true31Project:Filter:ColumnarToRow71:72:73false
app-20220209230506-003124WholeStageCodegen (13)WholeStageCodegen (13)2.8451381true32Filter:ColumnarToRow82:83false
app-20220209230506-003111Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Projectnull3.009truenullnullnullfalse
app-20220209230506-003124BroadcastExchangenull3.0170469truenullnullnullfalse
app-20220209230506-003124Projectnull3.0023truenullnullnullfalse
app-20220209230506-003124WholeStageCodegen (8)WholeStageCodegen (8)8.03521355true39Sort56false
app-20220209230506-003124WholeStageCodegen (7)WholeStageCodegen (7)2.888475758true37Filter:ColumnarToRow59:60false
app-20220209230506-003118Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Exchangenull4.2611942true36:38nullnullfalse
app-20220209230506-003113Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124WholeStageCodegen (12)WholeStageCodegen (12)2.881776true33Filter:ColumnarToRow77:78false
app-20220209230506-003124Filternull2.8052true31nullnullfalse
app-20220209230506-003124WholeStageCodegen (15)WholeStageCodegen (15)4.5334762true40HashAggregate3false
app-20220209230506-003124WholeStageCodegen (3)WholeStageCodegen (3)2.814564643true36Filter:ColumnarToRow44:45false
app-20220209230506-003124HashAggregatenull4.503true40nullnullfalse
app-20220209230506-003124Filternull2.8077true33nullnullfalse
app-20220209230506-003124Sortnull8.0020true39nullnullfalse
app-20220209230506-003124Projectnull3.0036truenullnullnullfalse
app-20220209230506-003124Sortnull8.0026true38nullnullfalse
app-20220209230506-003122Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124ColumnarToRownull1.0053false31nullnulltrue
app-20220209230506-003124Projectnull3.0015truenullnullnullfalse
app-20220209230506-003120Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Scan parquet null3.05912746true36nullnullfalse
app-20220209230506-003124SortMergeJoinnull22.7018true39nullnullfalse
app-20220209230506-003124Filternull2.8029true35nullnullfalse
app-20220209230506-003124ColumnarToRownull1.0073false31nullnulltrue
app-20220209230506-003112Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124ColumnarToRownull1.0083false32nullnulltrue
app-20220209230506-00319Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124WholeStageCodegen (6)WholeStageCodegen (6)8.0167505819true39Sort20false
app-20220209230506-003124BroadcastHashJoinnull5.09016true39nullnullfalse
app-20220209230506-00316Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003117Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-00318Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003121Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Execute InsertIntoHadoopFsRelationCommand parquetnull3.000truenullnullnullfalse
app-20220209230506-003124Projectnull3.0051truenullnullnullfalse
app-20220209230506-003124BroadcastHashJoinnull5.0908true39nullnullfalse
app-20220209230506-003124BroadcastHashJoinnull5.09010true39nullnullfalse
app-20220209230506-003115Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Filternull2.8037true34nullnullfalse
app-20220209230506-003124Scan parquet null3.061074true31nullnullfalse
app-20220209230506-003116Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Scan parquet null3.0426884true32nullnullfalse
app-20220209230506-003110Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003119Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Scan parquet null3.061054true31nullnullfalse
app-20220209230506-003124Scan parquet null3.055986561true37nullnullfalse
app-20220209230506-003124Exchangenull4.2769727true35:38nullnullfalse
app-20220209230506-003124Projectnull3.0011truenullnullnullfalse
app-20220209230506-003124Sortnull8.0056true39nullnullfalse
app-20220209230506-00312Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124BroadcastHashJoinnull5.09014true39nullnullfalse
app-20220209230506-00311Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124WholeStageCodegen (9)WholeStageCodegen (9)2.963764true34Project:Filter:ColumnarToRow65:66:67false
app-20220209230506-003124ColumnarToRownull1.0038false34nullnulltrue
app-20220209230506-003124ColumnarToRownull1.0030false35nullnulltrue
app-20220209230506-003124Exchangenull4.2496057true37:39nullnullfalse
app-20220209230506-003124SortMergeJoinnull22.7024true38nullnullfalse
app-20220209230506-003124BroadcastExchangenull3.0246280truenullnullnullfalse
app-20220209230506-003124Filternull2.8059true37nullnullfalse
app-20220209230506-003124WholeStageCodegen (4)WholeStageCodegen (4)8.096863440true38Sort41false
app-20220209230506-003124BroadcastHashJoinnull5.09012true39nullnullfalse
app-20220209230506-00310Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Filternull2.8044true36nullnullfalse
app-20220209230506-00317Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124HashAggregatenull4.506true39nullnullfalse
app-20220209230506-00314Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Projectnull3.0017truenullnullnullfalse
app-20220209230506-003124ColumnarToRownull1.0067false34nullnulltrue
app-20220209230506-003124Scan parquet null3.061868true34nullnullfalse
app-20220209230506-003124WholeStageCodegen (5)WholeStageCodegen (5)12.85158104722true38Project:SortMergeJoin23:24false
app-20220209230506-003124Scan parquet null3.02823131true35nullnullfalse
app-20220209230506-003124Filternull2.8072true31nullnullfalse
app-20220209230506-003124ColumnarToRownull1.0045false36nullnulltrue
app-20220209230506-00313Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Projectnull3.0071truenullnullnullfalse
app-20220209230506-003124Projectnull3.007truenullnullnullfalse
app-20220209230506-003124WholeStageCodegen (14)WholeStageCodegen (14)5.4412225455true39HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:SortMergeJoin6:7:8:9:10:11:12:13:14:15:16:17:18false
app-20220209230506-003124WholeStageCodegen (10)WholeStageCodegen (10)2.963550true31Project:Filter:ColumnarToRow51:52:53false
app-20220209230506-003124Scan parquet null3.061839true34nullnullfalse
app-20220209230506-003124Filternull2.8082true32nullnullfalse
app-20220209230506-003124BroadcastExchangenull3.0169675truenullnullnullfalse
app-20220209230506-003124Scan parquet null3.080779true33nullnullfalse
app-20220209230506-003124SubqueryBroadcastnull3.0171047truenullnullnullfalse
app-20220209230506-003124Projectnull3.0013truenullnullnullfalse
app-20220209230506-003124BroadcastExchangenull3.0166134truenullnullnullfalse
app-20220209230506-003124WholeStageCodegen (2)WholeStageCodegen (2)8.0104414825true38Sort26false
app-20220209230506-003124BroadcastExchangenull3.0166163truenullnullnullfalse
app-20220209230506-003123Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124WholeStageCodegen (9)WholeStageCodegen (9)2.963735true34Project:Filter:ColumnarToRow36:37:38false
app-20220209230506-003124SubqueryBroadcastnull3.0171062truenullnullnullfalse
app-20220209230506-003124Projectnull3.0065truenullnullnullfalse
app-20220209230506-003124TakeOrderedAndProjectnull3.001true40:41nullnullfalse
app-20220209230506-003124Filternull2.8066true34nullnullfalse
app-20220209230506-003124ColumnarToRownull1.0060false37nullnulltrue
app-20220209230506-003124ReusedExchangenull1.0033falsenullnullnullfalse
app-20220209230506-003124Exchangenull4.2997321true38:39nullnullfalse
app-20220209230506-003124ColumnarToRownull1.0078false33nullnulltrue
app-20220209230506-003124SubqueryBroadcastnull3.0168032truenullnullnullfalse
app-20220209230506-003124WholeStageCodegen (1)WholeStageCodegen (1)2.86176328true35Filter:ColumnarToRow29:30false
app-20220209230506-003114Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124Sortnull8.0041true38nullnullfalse
app-20220209230506-00315Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230506-003124ReusedExchangenull1.0048falsenullnullnullfalse
app-20220209232634-007024Windownull3.005truenullnullnullfalse
app-20220209232634-007024Execute InsertIntoHadoopFsRelationCommand parquetnull3.000truenullnullnullfalse
app-20220209232634-007024HashAggregatenull4.5010true35nullnullfalse
app-20220209232634-00705Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024Projectnull3.0022truenullnullnullfalse
app-20220209232634-00707Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-00702Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024Scan parquet null3.029742true33nullnullfalse
app-20220209232634-007024Scan parquet null3.049647true32nullnullfalse
app-20220209232634-007014Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-00701Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-00703Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024WholeStageCodegen (5)WholeStageCodegen (5)4.51701719true35HashAggregate10false
app-20220209232634-007024Filternull2.8026true34nullnullfalse
app-20220209232634-007024Sortnull8.007true36nullnullfalse
app-20220209232634-007024ColumnarToRownull1.0035false33nullnulltrue
app-20220209232634-007020Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024Projectnull3.0039truenullnullnullfalse
app-20220209232634-007024Projectnull3.0033truenullnullnullfalse
app-20220209232634-007016Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024ColumnarToRownull1.0046false32nullnulltrue
app-20220209232634-007024WholeStageCodegen (4)WholeStageCodegen (4)3.95123396612true34HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Filter:ColumnarToRow13:14:15:16:17:18:19:26:27false
app-20220209232634-007024Exchangenull4.28426111true34:35nullnullfalse
app-20220209232634-00708Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024WholeStageCodegen (1)WholeStageCodegen (1)2.9304421true31Project:Filter:ColumnarToRow22:23:24false
app-20220209232634-007024BroadcastExchangenull3.0146043truenullnullnullfalse
app-20220209232634-007024SubqueryBroadcastnull3.0112129truenullnullnullfalse
app-20220209232634-007024WholeStageCodegen (3)WholeStageCodegen (3)2.850244true32Filter:ColumnarToRow45:46false
app-20220209232634-007024WholeStageCodegen (6)WholeStageCodegen (6)8.01345746true36Sort7false
app-20220209232634-007010Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024BroadcastExchangenull3.0111031truenullnullnullfalse
app-20220209232634-007024BroadcastHashJoinnull5.09017true34nullnullfalse
app-20220209232634-007012Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007015Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007019Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024ColumnarToRownull1.0041false33nullnulltrue
app-20220209232634-007024TakeOrderedAndProjectnull3.001true36:37nullnullfalse
app-20220209232634-007024Filternull2.8040true33nullnullfalse
app-20220209232634-00704Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024Exchangenull4.2328true35:36nullnullfalse
app-20220209232634-007024Projectnull3.003truenullnullnullfalse
app-20220209232634-007021Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-00709Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024WholeStageCodegen (2)WholeStageCodegen (2)2.931638true33Project:Filter:ColumnarToRow39:40:41false
app-20220209232634-007024ReusedExchangenull1.0030falsenullnullnullfalse
app-20220209232634-007024BroadcastHashJoinnull5.09015true34nullnullfalse
app-20220209232634-007024BroadcastHashJoinnull5.09019true34nullnullfalse
app-20220209232634-007024WholeStageCodegen (2)WholeStageCodegen (2)2.931632true33Project:Filter:ColumnarToRow33:34:35false
app-20220209232634-007024Filternull2.8023true31nullnullfalse
app-20220209232634-007022Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024ColumnarToRownull1.0027false34nullnulltrue
app-20220209232634-007024Scan parquet null3.029736true33nullnullfalse
app-20220209232634-007024Filternull2.8045true32nullnullfalse
app-20220209232634-007024Projectnull3.0016truenullnullnullfalse
app-20220209232634-007017Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024BroadcastExchangenull3.0172620truenullnullnullfalse
app-20220209232634-007018Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007013Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024ColumnarToRownull1.0024false31nullnulltrue
app-20220209232634-007024Projectnull3.0014truenullnullnullfalse
app-20220209232634-00706Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024Projectnull3.0018truenullnullnullfalse
app-20220209232634-007024Filternull1.004false36nullnullfalse
app-20220209232634-007024Scan parquet null3.065125328true34nullnullfalse
app-20220209232634-007011Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-00700Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209232634-007024HashAggregatenull4.5013true34nullnullfalse
app-20220209232634-007024WholeStageCodegen (7)WholeStageCodegen (7)2.056212true36Project:Filter3:4false
app-20220209232634-007024BroadcastExchangenull3.0111037truenullnullnullfalse
app-20220209232634-007024Scan parquet null3.0291325true31nullnullfalse
app-20220209232634-007024Filternull2.8034true33nullnullfalse
app-20220209232634-007023Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-00262Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624WholeStageCodegen (3)WholeStageCodegen (3)2.846537true33Filter:ColumnarToRow38:39false
app-20220209225845-002624SubqueryBroadcastnull3.0160817truenullnullnullfalse
app-20220209225845-002624BroadcastHashJoinnull5.09013true34nullnullfalse
app-20220209225845-002617Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624Exchangenull4.242414true34:35nullnullfalse
app-20220209225845-002624ColumnarToRownull1.0039false33nullnulltrue
app-20220209225845-002614Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624Scan parquet null3.068724true31nullnullfalse
app-20220209225845-002624BroadcastHashJoinnull5.09011true34nullnullfalse
app-20220209225845-002613Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002622Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624Scan parquet null3.07024716true34nullnullfalse
app-20220209225845-002624Projectnull3.008truenullnullnullfalse
app-20220209225845-00268Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002610Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624WholeStageCodegen (4)WholeStageCodegen (4)3.844430465true34HashAggregate:Expand:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Filter:ColumnarToRow6:7:8:9:10:11:12:13:14:15false
app-20220209225845-002624Projectnull3.0010truenullnullnullfalse
app-20220209225845-002624HashAggregatenull4.506true34nullnullfalse
app-20220209225845-002624Filternull2.8028true31nullnullfalse
app-20220209225845-00266Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624Projectnull3.0012truenullnullnullfalse
app-20220209225845-00263Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002616Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624Filternull2.8038true33nullnullfalse
app-20220209225845-002624Projectnull3.0021truenullnullnullfalse
app-20220209225845-002624WholeStageCodegen (2)WholeStageCodegen (2)2.8254432true32Filter:ColumnarToRow33:34false
app-20220209225845-002624Filternull2.8014true34nullnullfalse
app-20220209225845-00267Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-00265Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-00269Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624BroadcastHashJoinnull5.0909true34nullnullfalse
app-20220209225845-002623Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624ColumnarToRownull1.0029false31nullnulltrue
app-20220209225845-002619Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624Scan parquet null3.068730true31nullnullfalse
app-20220209225845-002624Scan parquet null3.0232935true32nullnullfalse
app-20220209225845-002624ReusedExchangenull1.0018falsenullnullnullfalse
app-20220209225845-002618Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624Expandnull3.007true34nullnullfalse
app-20220209225845-002624BroadcastExchangenull3.0158719truenullnullnullfalse
app-20220209225845-002620Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624BroadcastExchangenull3.0132636truenullnullnullfalse
app-20220209225845-002624Filternull2.8022true31nullnullfalse
app-20220209225845-002624Projectnull3.0027truenullnullnullfalse
app-20220209225845-002624ColumnarToRownull1.0023false31nullnulltrue
app-20220209225845-002624Filternull2.8033true32nullnullfalse
app-20220209225845-002624BroadcastExchangenull3.0158725truenullnullnullfalse
app-20220209225845-002624TakeOrderedAndProjectnull3.001true35:36nullnullfalse
app-20220209225845-002624HashAggregatenull4.503true35nullnullfalse
app-20220209225845-002621Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624ColumnarToRownull1.0034false32nullnulltrue
app-20220209225845-00261Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002611Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624WholeStageCodegen (5)WholeStageCodegen (5)4.54723102true35HashAggregate3false
app-20220209225845-002624BroadcastExchangenull3.0190531truenullnullnullfalse
app-20220209225845-002615Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002612Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-00260Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209225845-002624WholeStageCodegen (1)WholeStageCodegen (1)2.970726true31Project:Filter:ColumnarToRow27:28:29false
app-20220209225845-002624ColumnarToRownull1.0015false34nullnulltrue
app-20220209225845-002624WholeStageCodegen (1)WholeStageCodegen (1)2.970720true31Project:Filter:ColumnarToRow21:22:23false
app-20220209225845-002624Scan parquet null3.046240true33nullnullfalse
app-20220209225845-002624Execute InsertIntoHadoopFsRelationCommand parquetnull3.000truenullnullnullfalse
app-20220209225845-00264Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-01031Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010314Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010313Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324WholeStageCodegen (5)WholeStageCodegen (5)5.172152true36Project:Sort:HashAggregate3:4:5false
app-20220209235526-010319Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324BroadcastHashJoinnull5.09010true34nullnullfalse
app-20220209235526-010310Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-01039Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-01030Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-01033Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324Projectnull3.0011truenullnullnullfalse
app-20220209235526-01036Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324Projectnull3.009truenullnullnullfalse
app-20220209235526-01037Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324BroadcastHashJoinnull5.09012true34nullnullfalse
app-20220209235526-010324ColumnarToRownull1.0035false31nullnulltrue
app-20220209235526-010324BroadcastExchangenull3.0130719truenullnullnullfalse
app-20220209235526-010324ColumnarToRownull1.0023false33nullnulltrue
app-20220209235526-01034Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324ColumnarToRownull1.0017false34nullnulltrue
app-20220209235526-010322Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010312Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324Scan parquet null3.0105143618true34nullnullfalse
app-20220209235526-010315Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324Projectnull3.0027truenullnullnullfalse
app-20220209235526-010324HashAggregatenull4.508true34nullnullfalse
app-20220209235526-010324BroadcastExchangenull3.0147031truenullnullnullfalse
app-20220209235526-010316Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324Scan parquet null3.060536true31nullnullfalse
app-20220209235526-010324Filternull2.8016true34nullnullfalse
app-20220209235526-010324BroadcastExchangenull3.0114625truenullnullnullfalse
app-20220209235526-01032Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324Scan parquet null3.028330true32nullnullfalse
app-20220209235526-010321Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324Projectnull3.0021truenullnullnullfalse
app-20220209235526-010324Execute InsertIntoHadoopFsRelationCommand parquetnull3.000truenullnullnullfalse
app-20220209235526-010324ColumnarToRownull1.0029false32nullnulltrue
app-20220209235526-010318Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324Projectnull3.0015truenullnullnullfalse
app-20220209235526-010324Filternull2.8034true31nullnullfalse
app-20220209235526-010324Filternull2.8028true32nullnullfalse
app-20220209235526-010311Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010323Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324AdaptiveSparkPlannull1.001falsenullnullnullfalse
app-20220209235526-010324Sortnull8.004true36nullnullfalse
app-20220209235526-010317Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010320Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324BroadcastHashJoinnull5.09014true34nullnullfalse
app-20220209235526-010324Scan parquet null3.049224true33nullnullfalse
app-20220209235526-010324WholeStageCodegen (1)WholeStageCodegen (1)2.949820true33Project:Filter:ColumnarToRow21:22:23false
app-20220209235526-010324WholeStageCodegen (4)WholeStageCodegen (4)3.8415773287true34HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:Filter:ColumnarToRow8:9:10:11:12:13:14:15:16:17false
app-20220209235526-010324Projectnull3.0013truenullnullnullfalse
app-20220209235526-010324Projectnull3.0033truenullnullnullfalse
app-20220209235526-010324WholeStageCodegen (2)WholeStageCodegen (2)2.930326true32Project:Filter:ColumnarToRow27:28:29false
app-20220209235526-01035Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324Filternull2.8022true33nullnullfalse
app-20220209235526-010324HashAggregatenull4.505true36nullnullfalse
app-20220209235526-010324WholeStageCodegen (3)WholeStageCodegen (3)2.961032true31Project:Filter:ColumnarToRow33:34:35false
app-20220209235526-01038Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209235526-010324Exchangenull4.222986true34:36nullnullfalse
app-20220209235526-010324Projectnull3.003truenullnullnullfalse
app-20220209231919-005716Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-00579Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724Execute InsertIntoHadoopFsRelationCommand parquetnull3.000truenullnullnullfalse
app-20220209231919-005724Exchangenull4.251124true34:36nullnullfalse
app-20220209231919-005714Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724Scan parquet null3.029836true32nullnullfalse
app-20220209231919-005724Projectnull3.0033truenullnullnullfalse
app-20220209231919-005724WholeStageCodegen (4)WholeStageCodegen (4)8.01353893522true36Sort23false
app-20220209231919-00570Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724Filternull2.8019true35nullnullfalse
app-20220209231919-005724WholeStageCodegen (7)WholeStageCodegen (7)2.931648true32Project:Filter:ColumnarToRow49:50:51false
app-20220209231919-00574Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724Filternull2.8044true31nullnullfalse
app-20220209231919-005724Scan parquet null3.028546true31nullnullfalse
app-20220209231919-005724ColumnarToRownull1.0045false31nullnulltrue
app-20220209231919-005724BroadcastExchangenull3.0120831truenullnullnullfalse
app-20220209231919-00573Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724SortMergeJoinnull22.7014true36nullnullfalse
app-20220209231919-005724Projectnull3.0013truenullnullnullfalse
app-20220209231919-005717Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005715Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724Filternull2.8034true32nullnullfalse
app-20220209231919-005724ColumnarToRownull1.0040false33nullnulltrue
app-20220209231919-005724Exchangenull4.214647617true35:36nullnullfalse
app-20220209231919-005724ColumnarToRownull1.0027false34nullnulltrue
app-20220209231919-005724Scan parquet null3.029852true32nullnullfalse
app-20220209231919-005724SubqueryBroadcastnull3.0123429truenullnullnullfalse
app-20220209231919-00571Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005712Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724WholeStageCodegen (8)WholeStageCodegen (8)6.0675557345true36HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Project:SortMergeJoin6:7:8:9:10:11:12:13:14false
app-20220209231919-005721Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724Projectnull3.009truenullnullnullfalse
app-20220209231919-005724Filternull2.8026true34nullnullfalse
app-20220209231919-005713Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724WholeStageCodegen (3)WholeStageCodegen (3)2.87635225true34Filter:ColumnarToRow26:27false
app-20220209231919-00577Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724TakeOrderedAndProjectnull3.001true37:38nullnullfalse
app-20220209231919-005724Filternull2.8039true33nullnullfalse
app-20220209231919-005724Projectnull3.0011truenullnullnullfalse
app-20220209231919-005724ColumnarToRownull1.0035false32nullnulltrue
app-20220209231919-005724Scan parquet null3.028941true33nullnullfalse
app-20220209231919-005724Exchangenull4.214924true36:37nullnullfalse
app-20220209231919-005718Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724HashAggregatenull4.503true37nullnullfalse
app-20220209231919-00575Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724WholeStageCodegen (6)WholeStageCodegen (6)2.831343true31Filter:ColumnarToRow44:45false
app-20220209231919-005724WholeStageCodegen (2)WholeStageCodegen (2)8.02180315true36Sort16false
app-20220209231919-005711Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724WholeStageCodegen (5)WholeStageCodegen (5)2.830238true33Filter:ColumnarToRow39:40false
app-20220209231919-005724ColumnarToRownull1.0020false35nullnulltrue
app-20220209231919-005724Sortnull8.0016true36nullnullfalse
app-20220209231919-005724BroadcastHashJoinnull5.09010true36nullnullfalse
app-20220209231919-005723Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724Scan parquet null3.04765328true34nullnullfalse
app-20220209231919-005724BroadcastExchangenull3.0120847truenullnullnullfalse
app-20220209231919-005724HashAggregatenull4.506true36nullnullfalse
app-20220209231919-005724BroadcastExchangenull3.0121437truenullnullnullfalse
app-20220209231919-005724Scan parquet null3.0147268121true35nullnullfalse
app-20220209231919-005724Sortnull8.0023true36nullnullfalse
app-20220209231919-005724ReusedExchangenull1.0030falsenullnullnullfalse
app-20220209231919-005724BroadcastHashJoinnull5.09012true36nullnullfalse
app-20220209231919-005724WholeStageCodegen (7)WholeStageCodegen (7)2.931632true32Project:Filter:ColumnarToRow33:34:35false
app-20220209231919-00576Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005710Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724ColumnarToRownull1.0051false32nullnulltrue
app-20220209231919-005724BroadcastHashJoinnull5.0908true36nullnullfalse
app-20220209231919-005724Projectnull3.0049truenullnullnullfalse
app-20220209231919-005722Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-00572Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724BroadcastExchangenull3.0125842truenullnullnullfalse
app-20220209231919-005724Projectnull3.007truenullnullnullfalse
app-20220209231919-005724WholeStageCodegen (9)WholeStageCodegen (9)4.5841222true37HashAggregate3false
app-20220209231919-00578Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005719Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724Filternull2.8050true32nullnullfalse
app-20220209231919-005720Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231919-005724WholeStageCodegen (1)WholeStageCodegen (1)2.8441400118true35Filter:ColumnarToRow19:20false
app-20220209231533-00509Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024Filternull2.8014true32nullnullfalse
app-20220209231533-005024WholeStageCodegen (4)WholeStageCodegen (4)4.5804502true34HashAggregate3false
app-20220209231533-005024BroadcastHashJoinnull5.09010true33nullnullfalse
app-20220209231533-005024BroadcastExchangenull3.0143211truenullnullnullfalse
app-20220209231533-005024SubqueryBroadcastnull3.0144220truenullnullnullfalse
app-20220209231533-005018Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024BroadcastExchangenull3.0146121truenullnullnullfalse
app-20220209231533-005024Projectnull3.0023truenullnullnullfalse
app-20220209231533-00507Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005023Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024Filternull2.8017true33nullnullfalse
app-20220209231533-005014Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024Filternull2.8024true31nullnullfalse
app-20220209231533-005024HashAggregatenull4.506true33nullnullfalse
app-20220209231533-00502Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024ColumnarToRownull1.0025false31nullnulltrue
app-20220209231533-00506Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024Scan parquet null3.054616true32nullnullfalse
app-20220209231533-005010Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024Scan parquet null3.072029019true33nullnullfalse
app-20220209231533-005024WholeStageCodegen (2)WholeStageCodegen (2)2.966122true31Project:Filter:ColumnarToRow23:24:25false
app-20220209231533-005017Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024HashAggregatenull4.503true34nullnullfalse
app-20220209231533-005024TakeOrderedAndProjectnull3.001true34:35nullnullfalse
app-20220209231533-005019Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024ColumnarToRownull1.0018false33nullnulltrue
app-20220209231533-005024BroadcastHashJoinnull5.0908true33nullnullfalse
app-20220209231533-005013Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005012Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024Projectnull3.0013truenullnullnullfalse
app-20220209231533-005021Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024ColumnarToRownull1.0015false32nullnulltrue
app-20220209231533-00508Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024Scan parquet null3.065226true31nullnullfalse
app-20220209231533-005024WholeStageCodegen (3)WholeStageCodegen (3)3.9214097295true33HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Filter:ColumnarToRow6:7:8:9:10:17:18false
app-20220209231533-005024Projectnull3.009truenullnullnullfalse
app-20220209231533-00504Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005016Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005022Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005015Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005020Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-00501Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-00500Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-00505Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024WholeStageCodegen (1)WholeStageCodegen (1)2.956612true32Project:Filter:ColumnarToRow13:14:15false
app-20220209231533-00503Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209231533-005024Execute InsertIntoHadoopFsRelationCommand parquetnull3.000truenullnullnullfalse
app-20220209231533-005024Projectnull3.007truenullnullnullfalse
app-20220209231533-005024Exchangenull4.2115424true33:34nullnullfalse
app-20220209231533-005011Execute CreateViewCommandnull1.000falsenullnullnullfalse
application_1665146417445_00023WholeStageCodegenWholeStageCodegen3.7503true6HashAggregate:Project4:5false
application_1665146417445_00020CollectLimitnull1.000falsenullnullnullfalse
application_1665146417445_00023WholeStageCodegenWholeStageCodegen4.500true7HashAggregate1false
application_1665146417445_00021Projectnull3.001truenullnullnullfalse
application_1665146417445_00020WholeStageCodegenWholeStageCodegen3.001truenullProject2false
application_1665146417445_00021WholeStageCodegenWholeStageCodegen3.000true1Project1false
application_1665146417445_00023Exchangenull4.206true5nullnullfalse
application_1665146417445_00022HashAggregatenull4.501true4nullnullfalse
application_1665146417445_00022HashAggregatenull4.506true3nullnullfalse
application_1665146417445_00022HashAggregatenull4.504true3nullnullfalse
application_1665146417445_00021Scan hive ecomm_ops_tables.s0s0jzb_browse_shelf_cat_mapnull1.002false1nullnullfalse
application_1665146417445_00022Scan hive ecomm_ops_tables.zzz_dart_browse_ads_prod_modnull1.008false2nullnullfalse
application_1665146417445_00020Projectnull3.002truenullnullnullfalse
application_1665146417445_00023HashAggregatenull4.504true6nullnullfalse
application_1665146417445_00023HashAggregatenull4.501true7nullnullfalse
application_1665146417445_00023Scan hive ecomm_ops_tables.zzz_dart_browse_ads_prod_modnull1.007false5nullnullfalse
application_1665146417445_00022HashAggregatenull4.505true3nullnullfalse
application_1665146417445_00020Scan hive ecomm_ops_tables.zzz_dart_browse_ads_prod_modnull1.003false0nullnullfalse
application_1665146417445_00022WholeStageCodegenWholeStageCodegen4.500true4HashAggregate1false
application_1665146417445_00023Projectnull3.005truenullnullnullfalse
application_1665146417445_00022Exchangenull4.202true3nullnullfalse
application_1665146417445_00022WholeStageCodegenWholeStageCodegen4.503true3HashAggregate:HashAggregate:HashAggregate4:5:6false
application_1665146417445_00022Exchangenull4.207true2nullnullfalse
application_1665146417445_00023Exchangenull4.202true6nullnullfalse
app-20220209230053-002824Exchangenull4.23630436true49:50nullnullfalse
app-20220209230053-002824Exchangenull4.2164896true37:38nullnullfalse
app-20220209230053-002824WholeStageCodegen (35)WholeStageCodegen (35)8.09740356227true52Sort228false
app-20220209230053-002824Projectnull3.00155truenullnullnullfalse
app-20220209230053-00284Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Projectnull3.00204truenullnullnullfalse
app-20220209230053-002824Projectnull3.00143truenullnullnullfalse
app-20220209230053-002824Projectnull3.0072truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (6)WholeStageCodegen (6)3.4333255637true49Project:Filter:HashAggregate38:39:40false
app-20220209230053-002824WholeStageCodegen (32)WholeStageCodegen (32)3.0334418172true44Project173false
app-20220209230053-002824SubqueryBroadcastnull3.0160551truenullnullnullfalse
app-20220209230053-002824HashAggregatenull4.5043true47nullnullfalse
app-20220209230053-002824Projectnull3.0030truenullnullnullfalse
app-20220209230053-00287Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Projectnull3.0017truenullnullnullfalse
app-20220209230053-002824BroadcastExchangenull3.0108202truenullnullnullfalse
app-20220209230053-002815Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-00283Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Scan parquet null3.08779181true41nullnullfalse
app-20220209230053-002824Filternull2.8062true33nullnullfalse
app-20220209230053-002824HashAggregatenull1.00224false52nullnullfalse
app-20220209230053-002824WholeStageCodegen (2)WholeStageCodegen (2)8.057073819true50Sort20false
app-20220209230053-002824Projectnull3.00225truenullnullnullfalse
app-20220209230053-002824HashAggregatenull1.00223false52nullnullfalse
app-20220209230053-002824Exchangenull4.2309177true41:44nullnullfalse
app-20220209230053-002824TakeOrderedAndProjectnull3.001true53:54nullnullfalse
app-20220209230053-002824WholeStageCodegen (15)WholeStageCodegen (15)2.821724137true45Filter:ColumnarToRow138:139false
app-20220209230053-002824SortMergeJoinnull22.7012true51nullnullfalse
app-20220209230053-002824WholeStageCodegen (23)WholeStageCodegen (23)6.96293476true51HashAggregate:Project:BroadcastHashJoin:Project:SortMergeJoin7:8:9:10:11false
app-20220209230053-002824WholeStageCodegen (4)WholeStageCodegen (4)2.82258215true32Filter:ColumnarToRow216:217false
app-20220209230053-002824SortMergeJoinnull22.70241true52nullnullfalse
app-20220209230053-002824Sortnull8.00228true52nullnullfalse
app-20220209230053-002824Projectnull3.00236truenullnullnullfalse
app-20220209230053-002824Filternull2.80189true42nullnullfalse
app-20220209230053-002824Scan parquet null3.028733true31nullnullfalse
app-20220209230053-002824ColumnarToRownull1.00157false31nullnulltrue
app-20220209230053-002824HashAggregatenull4.50193true40nullnullfalse
app-20220209230053-002824Projectnull3.0046truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (1)WholeStageCodegen (1)2.81533322true48Filter:ColumnarToRow23:24false
app-20220209230053-00286Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002812Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (42)WholeStageCodegen (42)8.07107509242true52Sort243false
app-20220209230053-002824Sortnull8.00233true52nullnullfalse
app-20220209230053-002824ColumnarToRownull1.0049false47nullnulltrue
app-20220209230053-002824WholeStageCodegen (4)WholeStageCodegen (4)8.07271900120true37Sort121false
app-20220209230053-002824Filternull2.8048true47nullnullfalse
app-20220209230053-002824Exchangenull4.2836815true50:51nullnullfalse
app-20220209230053-002824BroadcastExchangenull3.01206127truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (26)WholeStageCodegen (26)8.0616179175true44Sort176false
app-20220209230053-002824HashAggregatenull1.00163false52nullnullfalse
app-20220209230053-002824HashAggregatenull1.00239false52nullnullfalse
app-20220209230053-002824Sortnull8.00235true52nullnullfalse
app-20220209230053-002824WholeStageCodegen (21)WholeStageCodegen (21)5.671192790141true51Sort:Project:Filter:HashAggregate:HashAggregate:Project:SortMergeJoin142:143:144:145:146:147:148false
app-20220209230053-002824SortMergeJoinnull22.70226true52nullnullfalse
app-20220209230053-002824SortMergeJoinnull22.70104true37nullnullfalse
app-20220209230053-002824ColumnarToRownull1.00118false34nullnulltrue
app-20220209230053-002824WholeStageCodegen (3)WholeStageCodegen (3)2.954860true33Project:Filter:ColumnarToRow61:62:63false
app-20220209230053-002824BroadcastHashJoinnull5.090165true52nullnullfalse
app-20220209230053-002824Filternull2.8067true32nullnullfalse
app-20220209230053-002824BroadcastExchangenull3.0115228truenullnullnullfalse
app-20220209230053-002824HashAggregatenull1.00146false51nullnullfalse
app-20220209230053-002824Sortnull8.0020true50nullnullfalse
app-20220209230053-002824WholeStageCodegen (1)WholeStageCodegen (1)2.948203true39Project:Filter:ColumnarToRow204:205:206false
app-20220209230053-002824Exchangenull4.21065true51:53nullnullfalse
app-20220209230053-002824Exchangenull4.26954171true44:52nullnullfalse
app-20220209230053-002824Scan parquet null3.0203869true32nullnullfalse
app-20220209230053-002824BroadcastExchangenull3.01925214truenullnullnullfalse
app-20220209230053-002824Projectnull3.00173truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (47)WholeStageCodegen (47)6.9658082162true52HashAggregate:Project:BroadcastHashJoin:Project:SortMergeJoin163:164:165:166:167false
app-20220209230053-002824WholeStageCodegen (13)WholeStageCodegen (13)8.0768468986true51Sort87false
app-20220209230053-002824Sortnull8.00176true44nullnullfalse
app-20220209230053-002811Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824HashAggregatenull4.50190true42nullnullfalse
app-20220209230053-002824Sortnull8.00152true51nullnullfalse
app-20220209230053-002824BroadcastExchangenull3.0159653truenullnullnullfalse
app-20220209230053-002824Projectnull3.0055truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (5)WholeStageCodegen (5)3.924787686192true40HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Filter:ColumnarToRow193:194:195:196:197:198:199false
app-20220209230053-002824WholeStageCodegen (5)WholeStageCodegen (5)2.9341115true34Project:Filter:ColumnarToRow116:117:118false
app-20220209230053-002824Projectnull3.00221truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (38)WholeStageCodegen (38)5.6715748975219true52Sort:Project:Filter:HashAggregate:HashAggregate:Project:SortMergeJoin220:221:222:223:224:225:226false
app-20220209230053-00282Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-00289Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824SortMergeJoinnull22.70167true52nullnullfalse
app-20220209230053-002824WholeStageCodegen (10)WholeStageCodegen (10)2.9162909081true46Project:Filter:ColumnarToRow82:83:84false
app-20220209230053-002824Filternull2.8031true31nullnullfalse
app-20220209230053-002824SortMergeJoinnull22.70133true51nullnullfalse
app-20220209230053-00288Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Scan parquet null3.02038218true32nullnullfalse
app-20220209230053-002824WholeStageCodegen (8)WholeStageCodegen (8)3.031701316true50Project17false
app-20220209230053-002810Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824BroadcastHashJoinnull5.090102true37nullnullfalse
app-20220209230053-002824Unionnull3.002truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (45)WholeStageCodegen (45)5.67579620234true52Sort:Project:Filter:HashAggregate:HashAggregate:Project:SortMergeJoin235:236:237:238:239:240:241false
app-20220209230053-002824HashAggregatenull4.5095true38nullnullfalse
app-20220209230053-002824Sortnull8.00230true52nullnullfalse
app-20220209230053-002824Exchangenull4.257306107true35:37nullnullfalse
app-20220209230053-00281Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824BroadcastExchangenull3.01152153truenullnullnullfalse
app-20220209230053-002824HashAggregatenull1.0075false51nullnullfalse
app-20220209230053-002824Scan parquet null3.052564true33nullnullfalse
app-20220209230053-002824SortMergeJoinnull22.70231true52nullnullfalse
app-20220209230053-002824Sortnull8.00142true51nullnullfalse
app-20220209230053-002824ColumnarToRownull1.00212false33nullnulltrue
app-20220209230053-002824BroadcastExchangenull3.01596208truenullnullnullfalse
app-20220209230053-002824Projectnull3.00210truenullnullnullfalse
app-20220209230053-002824ColumnarToRownull1.0091false43nullnulltrue
app-20220209230053-002824WholeStageCodegen (4)WholeStageCodegen (4)2.8225866true32Filter:ColumnarToRow67:68false
app-20220209230053-002824Filternull2.80179true41nullnullfalse
app-20220209230053-002824Sortnull8.0079true51nullnullfalse
app-20220209230053-002824Scan parquet null3.01128383111true35nullnullfalse
app-20220209230053-002824Filternull1.0073false51nullnullfalse
app-20220209230053-002824WholeStageCodegen (5)WholeStageCodegen (5)2.9341128true34Project:Filter:ColumnarToRow129:130:131false
app-20220209230053-002824Sortnull8.00245true52nullnullfalse
app-20220209230053-002824ColumnarToRownull1.0024false48nullnulltrue
app-20220209230053-002824BroadcastHashJoinnull5.090195true40nullnullfalse
app-20220209230053-002824SortMergeJoinnull22.7018true50nullnullfalse
app-20220209230053-002824HashAggregatenull1.004false53nullnullfalse
app-20220209230053-002824Projectnull3.00196truenullnullnullfalse
app-20220209230053-002824SubqueryBroadcastnull3.01212112truenullnullnullfalse
app-20220209230053-002824Filternull1.00144false51nullnullfalse
app-20220209230053-002823Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Exchangenull4.2374136true45:52:51nullnullfalse
app-20220209230053-002817Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824HashAggregatenull4.5098true37nullnullfalse
app-20220209230053-002824Filternull2.80216true32nullnullfalse
app-20220209230053-002824Execute InsertIntoHadoopFsRelationCommand parquetnull3.000truenullnullnullfalse
app-20220209230053-002824Exchangenull4.27422580true46:52:51nullnullfalse
app-20220209230053-002824BroadcastExchangenull3.0159659truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (7)WholeStageCodegen (7)8.026532234true50Sort35false
app-20220209230053-002824Exchangenull4.264161true52:53nullnullfalse
app-20220209230053-002824ColumnarToRownull1.0084false46nullnulltrue
app-20220209230053-002824Projectnull3.00166truenullnullnullfalse
app-20220209230053-002824Filternull2.80138true45nullnullfalse
app-20220209230053-002824Projectnull3.0076truenullnullnullfalse
app-20220209230053-002824SortMergeJoinnull22.70148true51nullnullfalse
app-20220209230053-002824Exchangenull4.236854186true42:44nullnullfalse
app-20220209230053-002824WholeStageCodegen (1)WholeStageCodegen (1)2.83141204108true35Filter:ColumnarToRow109:110false
app-20220209230053-002813Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824SortMergeJoinnull22.70168true52nullnullfalse
app-20220209230053-002824WholeStageCodegen (11)WholeStageCodegen (11)8.0773691078true51Sort79false
app-20220209230053-002824ReusedExchangenull1.0027falsenullnullnullfalse
app-20220209230053-002824SubqueryBroadcastnull3.0118326truenullnullnullfalse
app-20220209230053-002824ColumnarToRownull1.00125false36nullnulltrue
app-20220209230053-002824Scan parquet null3.020580126true36nullnullfalse
app-20220209230053-002824Scan parquet null3.0525213true33nullnullfalse
app-20220209230053-002824WholeStageCodegen (48)WholeStageCodegen (48)1.03979159false53HashAggregate160false
app-20220209230053-002824Sortnull8.00106true37nullnullfalse
app-20220209230053-002824Filternull2.80205true39nullnullfalse
app-20220209230053-002824Projectnull3.008truenullnullnullfalse
app-20220209230053-002824HashAggregatenull1.007false51nullnullfalse
app-20220209230053-002824WholeStageCodegen (14)WholeStageCodegen (14)5.671308543670true51Sort:Project:Filter:HashAggregate:HashAggregate:Project:SortMergeJoin71:72:73:74:75:76:77false
app-20220209230053-002824HashAggregatenull1.00145false51nullnullfalse
app-20220209230053-002824Projectnull3.00129truenullnullnullfalse
app-20220209230053-002824ColumnarToRownull1.00110false35nullnulltrue
app-20220209230053-002824WholeStageCodegen (33)WholeStageCodegen (33)8.01156186169true52Sort170false
app-20220209230053-002824Exchangenull4.23485041true47:49nullnullfalse
app-20220209230053-002824ColumnarToRownull1.0032false31nullnulltrue
app-20220209230053-002824Filternull2.80124true36nullnullfalse
app-20220209230053-002824Projectnull3.0010truenullnullnullfalse
app-20220209230053-002824HashAggregatenull1.00238false52nullnullfalse
app-20220209230053-002824Projectnull3.00101truenullnullnullfalse
app-20220209230053-002824Sortnull8.0071true51nullnullfalse
app-20220209230053-002824BroadcastExchangenull3.0192565truenullnullnullfalse
app-20220209230053-002824Filternull2.8023true48nullnullfalse
app-20220209230053-002818Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824SubqueryBroadcastnull3.01183182truenullnullnullfalse
app-20220209230053-002824Sortnull8.00170true52nullnullfalse
app-20220209230053-002824BroadcastHashJoinnull5.09045true47nullnullfalse
app-20220209230053-002824ColumnarToRownull1.00180false41nullnulltrue
app-20220209230053-002824HashAggregatenull4.5040true49nullnullfalse
app-20220209230053-002824Scan parquet null3.07319350true47nullnullfalse
app-20220209230053-002824WholeStageCodegen (40)WholeStageCodegen (40)8.00232true52Sort233false
app-20220209230053-002816Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Filternull2.80198true40nullnullfalse
app-20220209230053-002824Scan parquet null3.0736225true48nullnullfalse
app-20220209230053-002824Projectnull3.00240truenullnullnullfalse
app-20220209230053-002824Filternull2.80211true33nullnullfalse
app-20220209230053-002824Sortnull8.00121true37nullnullfalse
app-20220209230053-002824WholeStageCodegen (18)WholeStageCodegen (18)8.05641193149true51Sort150false
app-20220209230053-002824Filternull2.80117true34nullnullfalse
app-20220209230053-002824WholeStageCodegen (22)WholeStageCodegen (22)2.9305154true31Project:Filter:ColumnarToRow155:156:157false
app-20220209230053-002824Scan parquet null3.011173140true45nullnullfalse
app-20220209230053-002824BroadcastExchangenull3.01206114truenullnullnullfalse
app-20220209230053-002824ColumnarToRownull1.0068false32nullnulltrue
app-20220209230053-002824Filternull2.80156true31nullnullfalse
app-20220209230053-002824Scan parquet null3.052558true33nullnullfalse
app-20220209230053-002824Sortnull8.00220true52nullnullfalse
app-20220209230053-002821Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824SortMergeJoinnull22.70174true44nullnullfalse
app-20220209230053-002824Scan parquet null3.036108885true46nullnullfalse
app-20220209230053-002814Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (9)WholeStageCodegen (9)8.031903113true51Sort14false
app-20220209230053-002824Sortnull8.0035true50nullnullfalse
app-20220209230053-002824Sortnull8.0087true51nullnullfalse
app-20220209230053-002824HashAggregatenull1.0099false37nullnullfalse
app-20220209230053-002824Scan parquet null3.0972392true43nullnullfalse
app-20220209230053-002824WholeStageCodegen (6)WholeStageCodegen (6)5.76707748097true37HashAggregate:HashAggregate:HashAggregate:Project:BroadcastHashJoin:Project:SortMergeJoin98:99:100:101:102:103:104false
app-20220209230053-002824WholeStageCodegen (22)WholeStageCodegen (22)2.930529true31Project:Filter:ColumnarToRow30:31:32false
app-20220209230053-002824BroadcastHashJoinnull5.09047true47nullnullfalse
app-20220209230053-002824Projectnull3.00188truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (12)WholeStageCodegen (12)2.81437289true43Filter:ColumnarToRow90:91false
app-20220209230053-002824SubqueryBroadcastnull3.0108201truenullnullnullfalse
app-20220209230053-002824Projectnull3.0082truenullnullnullfalse
app-20220209230053-002824ColumnarToRownull1.00217false32nullnulltrue
app-20220209230053-002824Filternull1.00222false52nullnullfalse
app-20220209230053-002824Filternull2.80130true34nullnullfalse
app-20220209230053-002824SortMergeJoinnull22.7011true51nullnullfalse
app-20220209230053-002824Projectnull3.00116truenullnullnullfalse
app-20220209230053-002824ReusedExchangenull1.0052falsenullnullnullfalse
app-20220209230053-002824Filternull2.8039true49nullnullfalse
app-20220209230053-00285Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Projectnull3.00194truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (3)WholeStageCodegen (3)2.827817123true36Filter:ColumnarToRow124:125false
app-20220209230053-002824Filternull2.8083true46nullnullfalse
app-20220209230053-002824Projectnull3.00164truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (2)WholeStageCodegen (2)8.07610479105true37Sort106false
app-20220209230053-002824Exchangenull4.224920191true40:42nullnullfalse
app-20220209230053-002824Filternull2.80109true35nullnullfalse
app-20220209230053-002824Projectnull3.00103truenullnullnullfalse
app-20220209230053-002820Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Filternull1.00237false52nullnullfalse
app-20220209230053-002824ColumnarToRownull1.0057false33nullnulltrue
app-20220209230053-002824ColumnarToRownull1.00139false45nullnulltrue
app-20220209230053-002824ColumnarToRownull1.00131false34nullnulltrue
app-20220209230053-002824ColumnarToRownull1.0063false33nullnulltrue
app-20220209230053-002824WholeStageCodegen (25)WholeStageCodegen (25)2.815032178true41Filter:ColumnarToRow179:180false
app-20220209230053-002824ColumnarToRownull1.00206false39nullnulltrue
app-20220209230053-002824SortMergeJoinnull22.7077true51nullnullfalse
app-20220209230053-002824Exchangenull4.2124122true36:37nullnullfalse
app-20220209230053-002824WholeStageCodegen (37)WholeStageCodegen (37)8.09684161229true52Sort230false
app-20220209230053-002824ColumnarToRownull1.00199false40nullnulltrue
app-20220209230053-002824Sortnull8.00150true51nullnullfalse
app-20220209230053-002824Projectnull3.00147truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (24)WholeStageCodegen (24)1.0153863false53HashAggregate4false
app-20220209230053-002824WholeStageCodegen (3)WholeStageCodegen (3)2.9548209true33Project:Filter:ColumnarToRow210:211:212false
app-20220209230053-002824Scan parquet null3.0287158true31nullnullfalse
app-20220209230053-002824HashAggregatenull1.0074false51nullnullfalse
app-20220209230053-002824ReusedExchangenull1.00113falsenullnullnullfalse
app-20220209230053-002824Subquerynull1.0093falsenullnullnullfalse
app-20220209230053-002824Exchangenull4.215288true43:52:51nullnullfalse
app-20220209230053-002824Sortnull8.00135true51nullnullfalse
app-20220209230053-002824Projectnull3.0038truenullnullnullfalse
app-20220209230053-002824HashAggregatenull1.00160false53nullnullfalse
app-20220209230053-002824Scan parquet null3.0324132true34nullnullfalse
app-20220209230053-002824WholeStageCodegen (20)WholeStageCodegen (20)8.05632344151true51Sort152false
app-20220209230053-002824Scan parquet null3.0104034200true40nullnullfalse
app-20220209230053-002824WholeStageCodegen (31)WholeStageCodegen (31)8.0280275183true44Sort184false
app-20220209230053-002824Exchangenull4.281921true48:50nullnullfalse
app-20220209230053-002824WholeStageCodegen (3)WholeStageCodegen (3)2.954854true33Project:Filter:ColumnarToRow55:56:57false
app-20220209230053-002824WholeStageCodegen (7)WholeStageCodegen (7)4.5994true38HashAggregate95false
app-20220209230053-00280Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Filternull2.8090true43nullnullfalse
app-20220209230053-002824Scan parquet null3.031207true39nullnullfalse
app-20220209230053-002824ReusedExchangenull1.00185falsenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (5)WholeStageCodegen (5)3.92484989842true47HashAggregate:Project:BroadcastHashJoin:Project:BroadcastHashJoin:Filter:ColumnarToRow43:44:45:46:47:48:49false
app-20220209230053-002824Sortnull8.00243true52nullnullfalse
app-20220209230053-002824HashAggregatenull1.00100false37nullnullfalse
app-20220209230053-002824BroadcastHashJoinnull5.090197true40nullnullfalse
app-20220209230053-002824WholeStageCodegen (6)WholeStageCodegen (6)3.43329696187true42Project:Filter:HashAggregate188:189:190false
app-20220209230053-002824Sortnull8.00184true44nullnullfalse
app-20220209230053-002824Scan parquet null3.0324119true34nullnullfalse
app-20220209230053-002822Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Filternull2.8056true33nullnullfalse
app-20220209230053-002824Sortnull8.0014true51nullnullfalse
app-20220209230053-002824BroadcastHashJoinnull5.0909true51nullnullfalse
app-20220209230053-002824Projectnull3.0061truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (16)WholeStageCodegen (16)8.00134true51Sort135false
app-20220209230053-002819Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230053-002824Projectnull3.0044truenullnullnullfalse
app-20220209230053-002824WholeStageCodegen (44)WholeStageCodegen (44)8.07091464244true52Sort245false
app-20220209230750-003624WholeStageCodegen (19)WholeStageCodegen (19)2.811348582true40Filter:ColumnarToRow83:84false
app-20220209230750-003624Projectnull3.005truenullnullnullfalse
app-20220209230750-003624SortMergeJoinnull22.7023true37nullnullfalse
app-20220209230750-003624ColumnarToRownull1.0039false32nullnulltrue
app-20220209230750-003624HashAggregatenull4.5057true41nullnullfalse
app-20220209230750-003624ColumnarToRownull1.0090false31nullnulltrue
app-20220209230750-003624Filternull2.8017true38nullnullfalse
app-20220209230750-003624Scan parquet null3.0939853true33nullnullfalse
app-20220209230750-003624Scan parquet null3.0892791true31nullnullfalse
app-20220209230750-003624ReusedExchangenull1.0034falsenullnullnullfalse
app-20220209230750-003624BroadcastHashJoinnull5.0904true42nullnullfalse
app-20220209230750-003624BroadcastExchangenull3.0149435truenullnullnullfalse
app-20220209230750-003614Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230750-003624Sortnull8.0055true41nullnullfalse
app-20220209230750-003624Projectnull3.0071truenullnullnullfalse
app-20220209230750-003624WholeStageCodegen (11)WholeStageCodegen (11)8.062515967true35Sort68false
app-20220209230750-003624Scan parquet null3.06281985true40nullnullfalse
app-20220209230750-003611Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230750-003624WholeStageCodegen (6)WholeStageCodegen (6)10.07191090520true37HashAggregate:Project:SortMergeJoin21:22:23false
app-20220209230750-003624Filternull1.0056false41nullnullfalse
app-20220209230750-003624SortMergeJoinnull22.7066true35nullnullfalse
app-20220209230750-003624Sortnull8.0014true41nullnullfalse
app-20220209230750-003624HashAggregatenull4.5061true39nullnullfalse
app-20220209230750-003624Sortnull8.0025true37nullnullfalse
app-20220209230750-003624Sortnull8.008true42nullnullfalse
app-20220209230750-00363Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230750-003624WholeStageCodegen (14)WholeStageCodegen (14)10.0754130563true35HashAggregate:Project:SortMergeJoin64:65:66false
app-20220209230750-003624Projectnull3.0022truenullnullnullfalse
app-20220209230750-003624ColumnarToRownull1.0052false33nullnulltrue
app-20220209230750-003624WholeStageCodegen (7)WholeStageCodegen (7)3.6535682516true38Filter:HashAggregate17:18false
app-20220209230750-003624Filternull2.8089true31nullnullfalse
app-20220209230750-003615Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230750-00365Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230750-003616Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230750-003624WholeStageCodegen (2)WholeStageCodegen (2)3.6340442927true36Project:BroadcastHashJoin:Filter:ColumnarToRow28:29:30:31false
app-20220209230750-003624BroadcastExchangenull3.0149441truenullnullnullfalse
app-20220209230750-003624Projectnull3.0065truenullnullnullfalse
app-20220209230750-003624HashAggregatenull4.5021true37nullnullfalse
app-20220209230750-00362Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230750-003624Projectnull3.0037truenullnullnullfalse
app-20220209230750-00364Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230750-00367Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230750-003624WholeStageCodegen (18)WholeStageCodegen (18)8.04382647true42Sort8false
app-20220209230750-00360Execute CreateViewCommandnull1.000falsenullnullnullfalse
app-20220209230750-003624Exchangenull4.29152569true34:35nullnullfalse
app-20220209230750-003624HashAggregatenull4.5064true35nullnullfalse
app-20220209230750-003624WholeStageCodegen (5)WholeStageCodegen (5)8.0176929047true37Sort48false
Showing the first 1000 rows.
"]}}],"execution_count":0}],"metadata":{"application/vnd.databricks.v1+notebook":{"notebookName":"[RAPIDS Accelerator for Apache Spark] Qualification Tool Notebook Template","dashboards":[{"elements":[],"guid":"0ed3c80b-b2f6-4c89-9a92-1af2f168d5ea","layoutOption":{"stack":true,"grid":true},"version":"DashboardViewV1","nuid":"91c1bfb2-695a-4e5c-8a25-848a433108dc","origId":2721260844584915,"title":"Executive View","width":1600,"globalVars":{}},{"elements":[],"guid":"ab4cecf9-0471-4fee-aa33-8927bb7e1bb1","layoutOption":{"stack":true,"grid":true},"version":"DashboardViewV1","nuid":"62243296-4562-4f06-90ac-d7a609f19c16","origId":2721260844584916,"title":"App View","width":1920,"globalVars":{}}],"notebookMetadata":{"pythonIndentUnit":2,"widgetLayout":[{"name":"log_path","width":551,"breakBefore":false},{"name":"output_path","width":551,"breakBefore":false}]},"language":"python","widgets":{"log_path":{"nuid":"88986aa6-6e67-4d09-aeeb-7c96ea1ea8f1","currentValue":"/dbfs/user1/qualification_logs","widgetInfo":{"widgetType":"text","name":"log_path","defaultValue":"","label":null,"options":{"widgetType":"text","validationRegex":null}}},"output_path":{"nuid":"0b9846bd-5c3e-4ae2-ba00-80bb9da1ee32","currentValue":"/tmp","widgetInfo":{"widgetType":"text","name":"output_path","defaultValue":"","label":null,"options":{"widgetType":"text","validationRegex":null}}}},"notebookOrigID":2721260844584890}},"nbformat":4,"nbformat_minor":0} From 5a692212bd718103b0e6d36c36a750cfdc3a1f6b Mon Sep 17 00:00:00 2001 From: liyuan Date: Thu, 29 Jun 2023 10:47:05 +0800 Subject: [PATCH 12/12] merge dev to main Signed-off-by: liyuan --- examples/UDF-Examples/Spark-cuSpatial/gpu-run.sh | 2 +- examples/UDF-Examples/Spark-cuSpatial/pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/UDF-Examples/Spark-cuSpatial/gpu-run.sh b/examples/UDF-Examples/Spark-cuSpatial/gpu-run.sh index e1d3a4a7f..c79947967 100755 --- a/examples/UDF-Examples/Spark-cuSpatial/gpu-run.sh +++ b/examples/UDF-Examples/Spark-cuSpatial/gpu-run.sh @@ -31,7 +31,7 @@ rm -rf $DATA_OUT_PATH # the path to keep the jars of spark-rapids & spark-cuspatial JARS=$ROOT_PATH/jars -JARS_PATH=${JARS_PATH:-$JARS/rapids-4-spark_2.12-23.06.0-SNAPSHOT.jar,$JARS/spark-cuspatial-23.06.0.jar} +JARS_PATH=${JARS_PATH:-$JARS/rapids-4-spark_2.12-23.02.0.jar,$JARS/spark-cuspatial-23.02.0.jar} $SPARK_HOME/bin/spark-submit --master spark://$HOSTNAME:7077 \ --name "Gpu Spatial Join UDF" \ diff --git a/examples/UDF-Examples/Spark-cuSpatial/pom.xml b/examples/UDF-Examples/Spark-cuSpatial/pom.xml index 2048bb6f1..324236e27 100644 --- a/examples/UDF-Examples/Spark-cuSpatial/pom.xml +++ b/examples/UDF-Examples/Spark-cuSpatial/pom.xml @@ -24,13 +24,13 @@ UDF of the cuSpatial case for the RAPIDS Accelerator The RAPIDS accelerated user defined function of the cuSpatial case for use with the RAPIDS Accelerator for Apache Spark - 23.06.0 + 23.02.0 1.8 1.8 8 - 23.06.0 + 23.02.0 2.12 3.2.0 ${project.build.directory}/cpp-build