From 57508a6c2976a0ce554471e7ad5a68e598df11f1 Mon Sep 17 00:00:00 2001 From: David Kegley Date: Mon, 26 Feb 2024 16:32:50 -0500 Subject: [PATCH] Add sample databricks content --- examples/connect/.gitignore | 1 + examples/connect/databricks/README.md | 19 +++++++ examples/connect/databricks/requirements.txt | 56 +++++++++++++++++++ examples/connect/databricks/sample-content.py | 43 ++++++++++++++ 4 files changed, 119 insertions(+) create mode 100644 examples/connect/.gitignore create mode 100644 examples/connect/databricks/README.md create mode 100644 examples/connect/databricks/requirements.txt create mode 100644 examples/connect/databricks/sample-content.py diff --git a/examples/connect/.gitignore b/examples/connect/.gitignore new file mode 100644 index 00000000..afe36a39 --- /dev/null +++ b/examples/connect/.gitignore @@ -0,0 +1 @@ +.posit diff --git a/examples/connect/databricks/README.md b/examples/connect/databricks/README.md new file mode 100644 index 00000000..fb1c223f --- /dev/null +++ b/examples/connect/databricks/README.md @@ -0,0 +1,19 @@ +```bash +# start streamlit locally +DATABRICKS_TOKEN= \ +streamlit run ./sample-content.py + +# deploy the app the first time +publisher deploy -a localhost:3939 -n databricks ./ + +# re-deploy the databricks app +publisher redeploy databricks +``` + +TODO: Test this content with databricks-connect + + +``` +# install the sdk from this branch +pip install git+https://github.com/posit-dev/posit-sdk-py.git@kegs/databricks-oauth-2 +``` diff --git a/examples/connect/databricks/requirements.txt b/examples/connect/databricks/requirements.txt new file mode 100644 index 00000000..4833a049 --- /dev/null +++ b/examples/connect/databricks/requirements.txt @@ -0,0 +1,56 @@ +altair==5.2.0 +attrs==23.2.0 +blinker==1.7.0 +cachetools==5.3.2 +certifi==2024.2.2 +charset-normalizer==3.3.2 +click==8.1.7 +databricks-sdk==0.20.0 +databricks-sql-connector==3.1.0 +et-xmlfile==1.1.0 +gitdb==4.0.11 +GitPython==3.1.42 +google-auth==2.28.0 +idna==3.6 +importlib-metadata==7.0.1 +Jinja2==3.1.3 +jsonschema==4.21.1 +jsonschema-specifications==2023.12.1 +lz4==4.3.3 +markdown-it-py==3.0.0 +MarkupSafe==2.1.5 +mdurl==0.1.2 +numpy==1.26.4 +oauthlib==3.2.2 +openpyxl==3.1.2 +packaging==23.2 +pandas==2.1.4 +pillow==10.2.0 +posit-sdk @ git+https://github.com/posit-dev/posit-sdk-py.git@ea91a374b9fab936d0deae41e9faad364c1ed0e2 +protobuf==4.25.3 +pyarrow==14.0.2 +pyasn1==0.5.1 +pyasn1-modules==0.3.0 +pydeck==0.8.1b0 +Pygments==2.17.2 +python-dateutil==2.8.2 +pytz==2024.1 +referencing==0.33.0 +requests==2.31.0 +rich==13.7.0 +rpds-py==0.18.0 +rsa==4.9 +six==1.16.0 +smmap==5.0.1 +streamlit==1.31.1 +tenacity==8.2.3 +thrift==0.16.0 +toml==0.10.2 +toolz==0.12.1 +tornado==6.4 +typing_extensions==4.9.0 +tzdata==2024.1 +tzlocal==5.2 +urllib3==2.2.1 +validators==0.22.0 +zipp==3.17.0 diff --git a/examples/connect/databricks/sample-content.py b/examples/connect/databricks/sample-content.py new file mode 100644 index 00000000..1fc1c5a7 --- /dev/null +++ b/examples/connect/databricks/sample-content.py @@ -0,0 +1,43 @@ +import os + +from posit.connect.external.databricks import viewer_credentials_provider + +from databricks import sql +from databricks.sdk.service.iam import CurrentUserAPI +from databricks.sdk.core import ApiClient, Config + +import pandas as pd +import streamlit as st +from streamlit.web.server.websocket_headers import _get_websocket_headers + +DB_PAT=os.getenv("DATABRICKS_TOKEN") + +DB_HOST=os.getenv("DB_HOST") +DB_HOST_URL = f"https://{DB_HOST}" +SQL_HTTP_PATH=os.getenv("SQL_HTTP_PATH") + +USER_IDENTITY = None + +# Read the viewer's individual content identity token from the streamlit ws header. +headers = _get_websocket_headers() +if headers: + USER_IDENTITY = headers.get('Posit-Connect-User-Identity') + +credentials_provider = viewer_credentials_provider(user_identity=USER_IDENTITY) +cfg = Config(host=DB_HOST_URL, credentials_provider=credentials_provider) +#cfg = Config(host=DB_HOST_URL, token=DB_PAT) + +databricks_user = CurrentUserAPI(ApiClient(cfg)).me() +st.write(f"Hello, {databricks_user.display_name}!") + +with sql.connect( + server_hostname=DB_HOST, + http_path=SQL_HTTP_PATH, + #access_token=DB_PAT) as connection: + auth_type='databricks-oauth', + credentials_provider=credentials_provider) as connection: + with connection.cursor() as cursor: + cursor.execute("SELECT * FROM data") + result = cursor.fetchall() + st.table(pd.DataFrame(result)) +