{"id":13929709,"url":"https://github.com/delta-io/delta-sharing","last_synced_at":"2026-03-04T05:05:46.974Z","repository":{"id":37073151,"uuid":"356069432","full_name":"delta-io/delta-sharing","owner":"delta-io","description":"An open protocol for secure data sharing","archived":false,"fork":false,"pushed_at":"2026-01-07T01:17:19.000Z","size":3071,"stargazers_count":914,"open_issues_count":120,"forks_count":215,"subscribers_count":28,"default_branch":"main","last_synced_at":"2026-01-09T05:11:42.853Z","etag":null,"topics":["big-data","data-sharing","delta-lake","pandas","spark"],"latest_commit_sha":null,"homepage":"https://delta.io/sharing","language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/delta-io.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-04-08T22:58:25.000Z","updated_at":"2026-01-07T21:41:53.000Z","dependencies_parsed_at":"2023-10-02T20:01:18.015Z","dependency_job_id":"1ed921fc-db4b-4321-a6b8-1ce28723fb27","html_url":"https://github.com/delta-io/delta-sharing","commit_stats":{"total_commits":252,"total_committers":27,"mean_commits":9.333333333333334,"dds":0.7420634920634921,"last_synced_commit":"9fbf773c9bee32170a7611af450d5fbb9b554aba"},"previous_names":[],"tags_count":83,"template":false,"template_full_name":null,"purl":"pkg:github/delta-io/delta-sharing","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delta-io%2Fdelta-sharing","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delta-io%2Fdelta-sharing/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delta-io%2Fdelta-sharing/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delta-io%2Fdelta-sharing/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/delta-io","download_url":"https://codeload.github.com/delta-io/delta-sharing/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delta-io%2Fdelta-sharing/sbom","scorecard":{"id":333257,"data":{"date":"2025-08-11","repo":{"name":"github.com/delta-io/delta-sharing","commit":"b33530cc6d5baca39f9d14a074db393c62285c3e"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.8,"checks":[{"name":"Maintained","score":10,"reason":"15 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":10,"reason":"all changesets reviewed","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build-and-test.yml:1","Warn: no topLevel permission defined: .github/workflows/build-kernel-wheels.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-test.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/delta-io/delta-sharing/build-and-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-test.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/delta-io/delta-sharing/build-and-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-test.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/delta-io/delta-sharing/build-and-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-test.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/delta-io/delta-sharing/build-and-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-test.yml:44: update your workflow using https://app.stepsecurity.io/secureworkflow/delta-io/delta-sharing/build-and-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-test.yml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/delta-io/delta-sharing/build-and-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-test.yml:69: update your workflow using https://app.stepsecurity.io/secureworkflow/delta-io/delta-sharing/build-and-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-test.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/delta-io/delta-sharing/build-and-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-test.yml:79: update your workflow using https://app.stepsecurity.io/secureworkflow/delta-io/delta-sharing/build-and-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-test.yml:108: update your workflow using https://app.stepsecurity.io/secureworkflow/delta-io/delta-sharing/build-and-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-test.yml:110: update your workflow using https://app.stepsecurity.io/secureworkflow/delta-io/delta-sharing/build-and-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-test.yml:118: update your workflow using https://app.stepsecurity.io/secureworkflow/delta-io/delta-sharing/build-and-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-kernel-wheels.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/delta-io/delta-sharing/build-kernel-wheels.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-kernel-wheels.yml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/delta-io/delta-sharing/build-kernel-wheels.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-kernel-wheels.yml:87: update your workflow using https://app.stepsecurity.io/secureworkflow/delta-io/delta-sharing/build-kernel-wheels.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-kernel-wheels.yml:97: update your workflow using https://app.stepsecurity.io/secureworkflow/delta-io/delta-sharing/build-kernel-wheels.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/build-kernel-wheels.yml:41","Info:   0 out of  16 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"18 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2023-120 / GHSA-45c4-8wx5-qw6w","Warn: Project is vulnerable to: GHSA-5m98-qgg9-wh84","Warn: Project is vulnerable to: GHSA-7gpw-8wmc-pm8g","Warn: Project is vulnerable to: GHSA-8495-4g3g-x7pr","Warn: Project is vulnerable to: PYSEC-2024-26 / GHSA-8qpw-xqxj-h4r2","Warn: Project is vulnerable to: GHSA-9548-qrrj-x5pj","Warn: Project is vulnerable to: PYSEC-2023-246 / GHSA-gfw2-4jvh-wgfg","Warn: Project is vulnerable to: GHSA-pjjw-qhg8-p2p9","Warn: Project is vulnerable to: PYSEC-2023-250 / GHSA-q3qx-c6g2-7pw2","Warn: Project is vulnerable to: PYSEC-2023-251 / GHSA-qvrw-v9rv-5rjx","Warn: Project is vulnerable to: PYSEC-2021-76 / GHSA-v6wp-4m6f-gcjg","Warn: Project is vulnerable to: PYSEC-2023-247 / GHSA-xx9p-xxvh-7g8j","Warn: Project is vulnerable to: PYSEC-2024-161","Warn: Project is vulnerable to: PYSEC-2014-14 / GHSA-652x-xj99-gmcc","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2014-13 / GHSA-cfj3-7x9c-4p3h","Warn: Project is vulnerable to: PYSEC-2018-28 / GHSA-x84v-xcm2-53pg"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-18T04:05:16.657Z","repository_id":37073151,"created_at":"2025-08-18T04:05:16.657Z","updated_at":"2025-08-18T04:05:16.657Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28481976,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["big-data","data-sharing","delta-lake","pandas","spark"],"created_at":"2024-08-07T18:02:30.359Z","updated_at":"2026-01-16T19:48:37.878Z","avatar_url":"https://github.com/delta-io.png","language":"Scala","funding_links":[],"categories":["others","📂 Additional Sections","大数据"],"sub_categories":["3. Open-source Projects","Spring Cloud框架"],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://user-images.githubusercontent.com/1446829/144671151-b095e1b9-2d24-4d3b-b3c6-a7041e491077.png\" alt=\"Delta Sharing Logo\" width=\"200\" /\u003e\n\u003c/div\u003e\n\n# Delta Sharing: An Open Protocol for Secure Data Sharing\n\n[![Build and Test](https://github.com/delta-io/delta-sharing/actions/workflows/build-and-test.yml/badge.svg)](https://github.com/delta-io/delta-sharing/actions/workflows/build-and-test.yml)\n[![License](https://img.shields.io/badge/license-Apache%202-brightgreen.svg)](https://github.com/delta-io/delta-sharing/blob/main/LICENSE.txt)\n[![PyPI](https://img.shields.io/pypi/v/delta-sharing.svg)](https://pypi.org/project/delta-sharing/)\n\n[Delta Sharing](https://delta.io/sharing) is an open protocol for secure real-time exchange of large datasets, which enables organizations to share data in real time regardless of which computing platforms they use. It is a simple [REST protocol](PROTOCOL.md) that securely shares access to part of a cloud dataset and leverages modern cloud storage systems, such as S3, ADLS, or GCS, to reliably transfer data.\n\nWith Delta Sharing, a user accessing shared data can directly connect to it through pandas, Tableau, Apache Spark, Rust, or other systems that support the open protocol, without having to deploy a specific compute platform first. Data providers can share a dataset once to reach a broad range of consumers, while consumers can begin using the data in minutes.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"images/delta-sharing.png\" width=\"85%\"/\u003e\n\u003c/p\u003e\n\nThis repo includes the following components:\n\n- Delta Sharing [protocol specification](PROTOCOL.md).\n- Python Connector: A Python library that implements the Delta Sharing Protocol to read shared tables as [pandas](https://pandas.pydata.org/) DataFrame or [Apache Spark](http://spark.apache.org/) DataFrames.\n- [Apache Spark](http://spark.apache.org/) Connector: An Apache Spark connector that implements the Delta Sharing Protocol to read shared tables from a Delta Sharing Server. The tables can then be accessed in SQL, Python, Java, Scala, or R.\n- Delta Sharing Server: A reference implementation server for the Delta Sharing Protocol for development purposes. Users can deploy this server to share existing tables in Delta Lake and Apache Parquet format on modern cloud storage systems.\n\n# Python Connector\n\nThe Delta Sharing Python Connector is a Python library that implements the [Delta Sharing Protocol](PROTOCOL.md) to read tables from a Delta Sharing Server. You can load shared tables as a [pandas](https://pandas.pydata.org/) DataFrame, or as an [Apache Spark](http://spark.apache.org/) DataFrame if running in PySpark with the Apache Spark Connector installed.\n\n## System Requirements\n\nPython 3.8+ for delta-sharing version 1.1+, Python 3.6+ for older versions\nIf running Linux, glibc version \u003e= 2.31 (for automatic delta-kernel-rust-sharing-wrapper package installation, please see next section for more details)\n\n## Installation\n\n```\npip3 install delta-sharing\n```\n\nIf you are using [Databricks Runtime](https://docs.databricks.com/runtime/dbr.html), you can follow [Databricks Libraries doc](https://docs.databricks.com/libraries/index.html) to install the library on your clusters.\n\nIf this doesn’t work because of an issue downloading delta-kernel-rust-sharing-wrapper try the following:\n- Check python3 version \u003e= 3.8\n- Upgrade your pip3 to the latest version\n- Check the linux glibc version \u003e= 2.31\n- [Install Rust](https://www.rust-lang.org/tools/install)\n\nIf you cannot upgrade glibc or PyPI does not have a pre-built wheel for delta-kernel-rust-sharing-wrapper for your environment, pip will have to build the package from source, which requires Rust to be installed.\nSee https://pypi.org/project/delta-kernel-rust-sharing-wrapper/0.2.1/#files for environments that have a pre-built wheel.\n\nYou can also use an older version of the delta-sharing package which did not bake delta-kernel-rust-sharing-wrapper into the installation with the following:\n```\npip3 install delta-sharing==1.0.5\n```\n\nYou can also install the delta-kernel-rust-sharing-wrapper package manually:\n```\ncd [delta-sharing-root]/python/delta-kernel-rust-sharing-wrapper\npython3 -m venv .venv\nsource .venv/bin/activate\npip3 install maturin\nmaturin develop\n```\n\n## Accessing Shared Data\n\nThe connector accesses shared tables based on [profile files](PROTOCOL.md#profile-file-format), which are JSON files containing a user's credentials to access a Delta Sharing Server. We have several ways to get started:\n\n- Download the profile file to access an open, example Delta Sharing Server that we're hosting [here](https://databricks-datasets-oregon.s3-us-west-2.amazonaws.com/delta-sharing/share/open-datasets.share). You can try the connectors with this sample data.\n- Start your own [Delta Sharing Server](#delta-sharing-reference-server) and create your own profile file following [profile file format](PROTOCOL.md#profile-file-format) to connect to this server.\n- Download a profile file from your data provider.\n\n## Quick Start\n\nAfter you save the profile file, you can use it in the connector to access shared tables.\n\n```python\nimport delta_sharing\n\n# Point to the profile file. It can be a file on the local file system or a file on a remote storage.\nprofile_file = \"\u003cprofile-file-path\u003e\"\n\n# Create a SharingClient.\nclient = delta_sharing.SharingClient(profile_file)\n\n# List all shared tables.\nclient.list_all_tables()\n\n# Create a url to access a shared table.\n# A table path is the profile file path following with `#` and the fully qualified name of a table \n# (`\u003cshare-name\u003e.\u003cschema-name\u003e.\u003ctable-name\u003e`).\ntable_url = profile_file + \"#\u003cshare-name\u003e.\u003cschema-name\u003e.\u003ctable-name\u003e\"\n\n# Fetch 10 rows from a table and convert it to a Pandas DataFrame. This can be used to read sample data \n# from a table that cannot fit in the memory.\ndelta_sharing.load_as_pandas(table_url, limit=10)\n\n# Load a table as a Pandas DataFrame. This can be used to process tables that can fit in the memory.\ndelta_sharing.load_as_pandas(table_url)\n\n# Load a table as a Pandas DataFrame explicitly using Delta Format\ndelta_sharing.load_as_pandas(table_url, use_delta_format=True)\n\n# Load a table as a Pandas DataFrame, using batch conversion to potentially reduce memory usage.\ndelta_sharing.load_as_pandas(table_url, convert_in_batches=True)\n\n# Load a table as a Pandas DataFrame explicitly using jsonPredicateHints\nhintOnHireDate = '''{\n  \"op\": \"equal\",\n  \"children\": [\n    {\"op\": \"column\", \"name\":\"hireDate\", \"valueType\":\"date\"},\n    {\"op\":\"literal\",\"value\":\"2021-04-29\",\"valueType\":\"date\"}\n  ]\n}'''\ndelta_sharing.load_as_pandas(table_url, jsonPredicateHints = hintOnHireDate)\n\n# If the code is running with PySpark, you can use `load_as_spark` to load the table as a Spark DataFrame.\ndelta_sharing.load_as_spark(table_url)\n```\n\nIf the table supports history sharing(`tableConfig.cdfEnabled=true` in the OSS Delta Sharing Server), the connector can query table changes.\n```python\n# Load table changes from version 0 to version 5, as a Pandas DataFrame.\ndelta_sharing.load_table_changes_as_pandas(table_url, starting_version=0, ending_version=5)\n\n# Load table changes from version 0 to version 5 as a Pandas DataFrame, explicitly using Delta Format.\ndelta_sharing.load_table_changes_as_pandas(table_url, starting_version=0, ending_version=5, use_delta_format=True)\n\n# Load table changes from version 0 to version 5, as a Pandas DataFrame, with batch conversion for potentially lower memory usage.\ndelta_sharing.load_table_changes_as_pandas(table_url, starting_version=0, ending_version=5, convert_in_batches=True)\n\n# If the code is running with PySpark, you can load table changes as Spark DataFrame.\ndelta_sharing.load_table_changes_as_spark(table_url, starting_version=0, ending_version=5)\n```\n  \n\nYou can try this by running our [examples](examples/README.md) with the open, example Delta Sharing Server.\n\n### Details on Profile Paths\n\n- The profile file path for `SharingClient` and `load_as_pandas` can be any URL supported by [FSSPEC](https://filesystem-spec.readthedocs.io/en/latest/index.html) (such as `s3a://my_bucket/my/profile/file`). If you are using [Databricks File System](https://docs.databricks.com/data/databricks-file-system.html), you can also [preface the path with `/dbfs/`](https://docs.databricks.com/data/databricks-file-system.html#dbfs-and-local-driver-node-paths) to access the profile file as if it were a local file.  \n- The profile file path for `load_as_spark` can be any URL supported by Hadoop FileSystem (such as `s3a://my_bucket/my/profile/file`).\n- A table path is the profile file path following with `#` and the fully qualified name of a table (`\u003cshare-name\u003e.\u003cschema-name\u003e.\u003ctable-name\u003e`).\n\n# Apache Spark Connector\n\nThe Apache Spark Connector implements the [Delta Sharing Protocol](PROTOCOL.md) to read shared tables from a Delta Sharing Server. It can be used in SQL, Python, Java, Scala and R.\n\n## System Requirements\n\n- Java 8+\n- Scala 2.12.x\n- Apache Spark 3+ or [Databricks Runtime](https://docs.databricks.com/runtime/dbr.html) 9+\n\n## Accessing Shared Data\n\nThe connector loads user credentials from profile files. Please see [Accessing Shared Data](#accessing-shared-data) to download a profile file for our example server or for your own data sharing server.\n\n## Configuring Apache Spark\n\nYou can set up Apache Spark to load the Delta Sharing connector in the following two ways:\n\n- Run interactively: Start the Spark shell (Scala or Python) with the Delta Sharing connector and run the code snippets interactively in the shell.\n- Run as a project: Set up a Maven or SBT project (Scala or Java) with the Delta Sharing connector, copy the code snippets into a source file, and run the project.\n\nIf you are using [Databricks Runtime](https://docs.databricks.com/runtime/dbr.html), you can skip this section and follow [Databricks Libraries doc](https://docs.databricks.com/libraries/index.html) to install the connector on your clusters.\n\n### Set up an interactive shell\n\nTo use Delta Sharing connector interactively within the Spark’s Scala/Python shell, you can launch the shells as follows.\n\n#### PySpark shell\n\n```\npyspark --packages io.delta:delta-sharing-spark_2.12:3.1.0\n```\n\n#### Scala Shell\n\n```\nbin/spark-shell --packages io.delta:delta-sharing-spark_2.12:3.1.0\n```\n\n### Set up a standalone project\n\nIf you want to build a Java/Scala project using Delta Sharing connector from Maven Central Repository, you can use the following Maven coordinates.\n\n#### Maven\n\nYou include Delta Sharing connector in your Maven project by adding it as a dependency in your POM file. Delta Sharing connector is compiled with Scala 2.12.\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003eio.delta\u003c/groupId\u003e\n  \u003cartifactId\u003edelta-sharing-spark_2.12\u003c/artifactId\u003e\n  \u003cversion\u003e3.1.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n#### SBT\n\nYou include Delta Sharing connector in your SBT project by adding the following line to your `build.sbt` file:\n\n```scala\nlibraryDependencies += \"io.delta\" %% \"delta-sharing-spark\" % \"3.1.0\"\n```\n\n## Quick Start\n\nAfter you save the profile file and launch Spark with the connector library, you can access shared tables using any language.\n\n### SQL\n```sql\n-- A table path is the profile file path following with `#` and the fully qualified name \n-- of a table (`\u003cshare-name\u003e.\u003cschema-name\u003e.\u003ctable-name\u003e`).\nCREATE TABLE mytable USING deltaSharing LOCATION '\u003cprofile-file-path\u003e#\u003cshare-name\u003e.\u003cschema-name\u003e.\u003ctable-name\u003e';\nSELECT * FROM mytable;\n```\n\n### Python\n\n```python\n# A table path is the profile file path following with `#` and the fully qualified name \n# of a table (`\u003cshare-name\u003e.\u003cschema-name\u003e.\u003ctable-name\u003e`).\ntable_path = \"\u003cprofile-file-path\u003e#\u003cshare-name\u003e.\u003cschema-name\u003e.\u003ctable-name\u003e\"\ndf = spark.read.format(\"deltaSharing\").load(table_path)\n```\n\n### Scala\n\n```scala\n// A table path is the profile file path following with `#` and the fully qualified name \n// of a table (`\u003cshare-name\u003e.\u003cschema-name\u003e.\u003ctable-name\u003e`).\nval tablePath = \"\u003cprofile-file-path\u003e#\u003cshare-name\u003e.\u003cschema-name\u003e.\u003ctable-name\u003e\"\nval df = spark.read.format(\"deltaSharing\").load(tablePath)\n```\n\n### Java\n\n```java\n// A table path is the profile file path following with `#` and the fully qualified name \n// of a table (`\u003cshare-name\u003e.\u003cschema-name\u003e.\u003ctable-name\u003e`).\nString tablePath = \"\u003cprofile-file-path\u003e#\u003cshare-name\u003e.\u003cschema-name\u003e.\u003ctable-name\u003e\";\nDataset\u003cRow\u003e df = spark.read.format(\"deltaSharing\").load(tablePath);\n```\n\n### R\n```r\n# A table path is the profile file path following with `#` and the fully qualified name \n# of a table (`\u003cshare-name\u003e.\u003cschema-name\u003e.\u003ctable-name\u003e`).\ntable_path \u003c- \"\u003cprofile-file-path\u003e#\u003cshare-name\u003e.\u003cschema-name\u003e.\u003ctable-name\u003e\"\ndf \u003c- read.df(table_path, \"deltaSharing\")\n```\n\nYou can try this by running our [examples](examples/README.md) with the open, example Delta Sharing Server.\n\n### CDF \nStarting from release 0.5.0, querying [Change Data Feed](https://docs.databricks.com/delta/delta-change-data-feed.html) is supported with Delta Sharing.\nOnce the provider turns on CDF on the original delta table and shares it through Delta Sharing, the recipient can query\nCDF of a Delta Sharing table similar to CDF of a delta table.\n```scala\nval tablePath = \"\u003cprofile-file-path\u003e#\u003cshare-name\u003e.\u003cschema-name\u003e.\u003ctable-name\u003e\"\nval df = spark.read.format(\"deltaSharing\")\n  .option(\"readChangeFeed\", \"true\")\n  .option(\"startingVersion\", \"3\")\n  .load(tablePath)\n```\n\n### Streaming\nStarting from release 0.6.0, Delta Sharing table can be used as a data source for [Spark Structured Streaming](https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html).\nOnce the provider shares a table with history, the recipient can perform a streaming query on the table.\n\nNote: Trigger.AvailableNow is not supported in delta sharing streaming because it's supported since spark 3.3.0, while delta sharing is still using spark 3.1.1.\n```scala\nval tablePath = \"\u003cprofile-file-path\u003e#\u003cshare-name\u003e.\u003cschema-name\u003e.\u003ctable-name\u003e\"\nval df = spark.readStream.format(\"deltaSharing\")\n  .option(\"startingVersion\", \"1\")\n  .option(\"skipChangeCommits\", \"true\")\n  .load(tablePath)\n```\n\n### Table paths\n\n- A profile file path can be any URL supported by Hadoop FileSystem (such as `s3a://my_bucket/my/profile/file`).\n- A table path is the profile file path following with `#` and the fully qualified name of a table (`\u003cshare-name\u003e.\u003cschema-name\u003e.\u003ctable-name\u003e`).\n\n# The Community\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"./images/the-community.png\" alt=\"Delta Sharing OSS Connectors\" width=\"400\" /\u003e\n\u003c/div\u003e\n\u003ctable\u003e\n\u003ctr\u003e\n\u003cth\u003eConnector\u003c/th\u003e\n\u003cth\u003eLink\u003c/th\u003e\n\u003cth\u003eStatus\u003c/th\u003e\n\u003cth\u003eSupported Features\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePower BI\u003c/td\u003e\n\u003ctd\u003eDatabricks owned\u003c/td\u003e\n\u003ctd\u003eReleased\u003c/td\u003e\n\u003ctd\u003eQueryTableVersion\u003cbr\u003eQueryTableMetadata\u003cbr\u003eQueryTableLatestSnapshot\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eClojure\u003c/td\u003e\n\u003ctd\u003e\n\n[amperity/delta-sharing-client-clj](https://github.com/amperity/delta-sharing-client-clj)\n\u003c/td\u003e\n\u003ctd\u003eReleased\u003c/td\u003e\n\u003ctd\u003eQueryTableVersion\u003cbr\u003eQueryTableMetadata\u003cbr\u003eQueryTableLatestSnapshot\u003cbr\u003eQueryTableChanges(CDF)\u003cbr\u003eTime Travel Queries\u003cbr\u003eQuery Changes between Versions\u003cbr\u003eDelta Format Queries\u003cbr\u003eLimit and Predicate Pushdown\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctr\u003e\n\u003ctd\u003eNode.js\u003c/td\u003e\n\u003ctd\u003e\n\n[goodwillpunning/nodejs-sharing-client](https://github.com/goodwillpunning/nodejs-sharing-client)\n\u003c/td\u003e\n\u003ctd\u003eReleased\u003c/td\u003e\n\u003ctd\u003eQueryTableVersion\u003cbr\u003eQueryTableMetadata\u003cbr\u003eQueryTableLatestSnapshot\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJava\u003c/td\u003e\n\u003ctd\u003e\n\n[databrickslabs/delta-sharing-java-connector](https://github.com/databrickslabs/delta-sharing-java-connector)\n\u003c/td\u003e\n\u003ctd\u003eReleased\u003c/td\u003e\n\u003ctd\u003eQueryTableVersion\u003cbr\u003eQueryTableMetadata\u003cbr\u003eQueryTableLatestSnapshot\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eArcuate\u003c/td\u003e\n\u003ctd\u003e\n\n[databrickslabs/arcuate](https://github.com/databrickslabs/arcuate)\n\u003c/td\u003e\n\u003ctd\u003eReleased\u003c/td\u003e\n\u003ctd\u003eQueryTableVersion\u003cbr\u003eQueryTableMetadata\u003cbr\u003eQueryTableLatestSnapshot\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRust\u003c/td\u003e\n\u003ctd\u003e\n\n[r3stl355/delta-sharing-rust-client](https://github.com/r3stl355/delta-sharing-rust-client)\n\u003c/td\u003e\n\u003ctd\u003eReleased\u003c/td\u003e\n\u003ctd\u003eQueryTableVersion\u003cbr\u003eQueryTableMetadata\u003cbr\u003eQueryTableLatestSnapshot\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGo\u003c/td\u003e\n\u003ctd\u003e\n\n[magpierre/delta-sharing](https://github.com/magpierre/delta-sharing/tree/golangdev/golang/delta_sharing_go)\n\u003c/td\u003e\n\u003ctd\u003eReleased\u003c/td\u003e\n\u003ctd\u003eQueryTableVersion\u003cbr\u003eQueryTableMetadata\u003cbr\u003eQueryTableLatestSnapshot\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eC++\u003c/td\u003e\n\u003ctd\u003e\n\n[magpierre/delta-sharing](https://github.com/magpierre/delta-sharing/tree/cppdev/cpp/DeltaSharingClient)\n\u003c/td\u003e\n\u003ctd\u003eReleased\u003c/td\u003e\n\u003ctd\u003eQueryTableMetadata\u003cbr\u003eQueryTableLatestSnapshot\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eR\u003c/td\u003e\n\u003ctd\u003e\n\n[zacdav-db/delta-sharing-r](https://github.com/zacdav-db/delta-sharing-r)\n\u003c/td\u003e\n\u003ctd\u003eReleased\u003c/td\u003e\n\u003ctd\u003eQueryTableVersion\u003cbr\u003eQueryTableMetadata\u003cbr\u003eQueryTableLatestSnapshot\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGoogle Spreadsheet\u003c/td\u003e\n\u003ctd\u003e\n\n[delta-incubator/delta-sharing-connectors]( https://github.com/delta-incubator/delta-sharing-connectors/tree/main/google_workspace_add_on)\n\u003c/td\u003e\n\u003ctd\u003eBeta\u003c/td\u003e\n\u003ctd\u003eQueryTableVersion\u003cbr\u003eQueryTableMetadata\u003cbr\u003eQueryTableLatestSnapshot\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAirflow\u003c/td\u003e\n\u003ctd\u003e\n\n[apache/airflow](https://github.com/apache/airflow/pull/22692)\n\u003c/td\u003e\n\u003ctd\u003eUn-released\u003c/td\u003e\n\u003ctd\u003eN/A\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eExcel-Connector\u003c/td\u003e\n\u003ctd\u003e\n\n[https://www.exponam.com/solutions/](https://www.exponam.com/solutions/)\n\u003c/td\u003e\n\u003ctd\u003elimited-release\u003c/td\u003e\n\u003ctd\u003eN/A\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLakehouse Sharing\u003c/td\u003e\n\u003ctd\u003e\n\n[rajagurunath/lakehouse-sharing](https://github.com/rajagurunath/lakehouse-sharing)\n\u003c/td\u003e\n\u003ctd\u003ePreview\u003c/td\u003e\n\u003ctd\u003e\n\n[Demonstrates](https://guruengineering.substack.com/p/lakehouse-sharing) a table format agnostic data sharing\u003cbr/\u003e\nserver (based on delta-sharing protocol) implemented  in python for both Delta Lake and Iceberg formats.\n\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\n# Delta Sharing Reference Server\n\nThe Delta Sharing Reference Server is a reference implementation server for the [Delta Sharing Protocol](PROTOCOL.md). This can be used to set up a small service to test your own connector that implements the [Delta Sharing Protocol](PROTOCOL.md). Please note that this is not a completed implementation of secure web server. We highly recommend you to put this behind a secure proxy if you would like to expose it to public.\n\nSome vendors offer managed services for Delta Sharing too (for example, [Databricks](https://databricks.com/product/delta-sharing)). Please refer to your vendor's website for how to set up sharing there. Vendors that are interested in being listed as a service provider should open an issue on GitHub to be added to this README and our project's website.\n\nHere are the steps to setup the reference server to share your own data.\n\n## Get the pre-built package\n\nDownload the pre-built package `delta-sharing-server-x.y.z.zip` from [GitHub Releases](https://github.com/delta-io/delta-sharing/releases).\n\n## Server configuration and adding Shared Data\n\n- Unpack the pre-built package and copy the server config template file `conf/delta-sharing-server.yaml.template` to create your own server yaml file, such as `conf/delta-sharing-server.yaml`.\n- Make changes to your yaml file. You may also need to update some server configs for special requirements.\n- To add Shared Data, add reference to Delta Lake tables you would like to share from this server in this config file.\n\n## Config the server to access tables on cloud storage\n\nWe support sharing Delta Lake tables on S3, Azure Blob Storage and Azure Data Lake Storage Gen2.\n\n### S3\n\nThe server is using `hadoop-aws` to access S3. Table paths in the server config file should use `s3a://` paths rather than `s3://` paths. There are multiple ways to config S3 authentication.\n\n#### EC2 IAM Metadata Authentication (Recommended)\n\nApplications running in EC2 may associate an IAM role with the VM and query the [EC2 Instance Metadata Service](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) for credentials to access S3.\n\n#### Authenticating via the AWS Environment Variables\n\nWe support configuration via [the standard AWS environment variables](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html#cli-environment). The core environment variables are for the access key and associated secret:\n```\nexport AWS_ACCESS_KEY_ID=my.aws.key\nexport AWS_SECRET_ACCESS_KEY=my.secret.key\n```\n\n#### Other S3 authentication methods\n\nYou can find other approaches in [hadoop-aws doc](https://hadoop.apache.org/docs/r2.10.1/hadoop-aws/tools/hadoop-aws/index.html#S3A_Authentication_methods).\n\n### Azure Blob Storage\n\nThe server is using `hadoop-azure` to read Azure Blob Storage. Using Azure Blob Storage requires [configuration of credentials](https://hadoop.apache.org/docs/current/hadoop-azure/index.html#Configuring_Credentials). You can create a Hadoop configuration file named `core-site.xml` and add it to the server's `conf` directory. Then add the following content to the xml file:\n\n```xml\n\u003c?xml version=\"1.0\"?\u003e\n\u003c?xml-stylesheet type=\"text/xsl\" href=\"configuration.xsl\"?\u003e\n\u003cconfiguration\u003e\n  \u003cproperty\u003e\n    \u003cname\u003efs.azure.account.key.YOUR-ACCOUNT-NAME.blob.core.windows.net\u003c/name\u003e\n    \u003cvalue\u003eYOUR-ACCOUNT-KEY\u003c/value\u003e\n  \u003c/property\u003e\n\u003c/configuration\u003e\n```\n`YOUR-ACCOUNT-NAME` is your Azure storage account and `YOUR-ACCOUNT-KEY` is your account key.\n\n### Azure Data Lake Storage Gen2\n\nThe server is using `hadoop-azure` to read Azure Data Lake Storage Gen2. We support [the Shared Key authentication](https://hadoop.apache.org/docs/stable/hadoop-azure/abfs.html#Default:_Shared_Key). You can create a Hadoop configuration file named `core-site.xml` and add it to the server's `conf` directory. Then add the following content to the xml file:\n\n```xml\n\u003c?xml version=\"1.0\"?\u003e\n\u003c?xml-stylesheet type=\"text/xsl\" href=\"configuration.xsl\"?\u003e\n\u003cconfiguration\u003e\n  \u003cproperty\u003e\n    \u003cname\u003efs.azure.account.auth.type.YOUR-ACCOUNT-NAME.dfs.core.windows.net\u003c/name\u003e\n    \u003cvalue\u003eSharedKey\u003c/value\u003e\n    \u003cdescription\u003e\n    \u003c/description\u003e\n  \u003c/property\u003e\n  \u003cproperty\u003e\n    \u003cname\u003efs.azure.account.key.YOUR-ACCOUNT-NAME.dfs.core.windows.net\u003c/name\u003e\n    \u003cvalue\u003eYOUR-ACCOUNT-KEY\u003c/value\u003e\n    \u003cdescription\u003e\n    The secret password. Never share these.\n    \u003c/description\u003e\n  \u003c/property\u003e\n\u003c/configuration\u003e\n```\n`YOUR-ACCOUNT-NAME` is your Azure storage account and `YOUR-ACCOUNT-KEY` is your account key.\n\n### Google Cloud Storage\n\nWe support using [Service Account](https://cloud.google.com/iam/docs/service-accounts) to read Google Cloud Storage. You can find more details in [GCP Authentication Doc](https://cloud.google.com/docs/authentication/getting-started).\n\nTo set up the Service Account credentials, you can specify the environment GOOGLE_APPLICATION_CREDENTIALS before starting the Delta Sharing Server.\n\n```\nexport GOOGLE_APPLICATION_CREDENTIALS=\"KEY_PATH\"\n```\n\nReplace `KEY_PATH` with path of the JSON file that contains your service account key.\n\n### Cloudflare R2\nWe use an R2 implementation of the [S3 API](https://developers.cloudflare.com/r2/api/s3/api/) and `hadoop-aws` to read Cloudflare R2. Table paths in the server config file should use the `s3a://` scheme. You must [generate an API token](https://developers.cloudflare.com/r2/api/s3/tokens/) for usage with existing S3-compatible SDKs. These credentials can be specified in substitute of the S3 credentials in a Hadoop configuration file named `core-site.xml` within the server's `conf` directory. For R2 to work, you also need to directly specify the S3 endpoint and reduce `fs.s3a.paging.maximum` from Hadoop's default of 5000 to 1000 since R2 only supports `MaxKeys` \u003c= 1000.\n```xml\n\u003c?xml version=\"1.0\"?\u003e\n\u003c?xml-stylesheet type=\"text/xsl\" href=\"configuration.xsl\"?\u003e\n\u003cconfiguration\u003e\n  \u003cproperty\u003e\n    \u003cname\u003efs.s3a.access.key\u003c/name\u003e\n    \u003cvalue\u003eYOUR-ACCESS-KEY\u003c/value\u003e\n  \u003c/property\u003e\n  \u003cproperty\u003e\n    \u003cname\u003efs.s3a.secret.key\u003c/name\u003e\n    \u003cvalue\u003eYOUR-SECRET-KEY\u003c/value\u003e\n  \u003c/property\u003e\n  \u003cproperty\u003e\n    \u003cname\u003efs.s3a.endpoint\u003c/name\u003e\n    \u003cvalue\u003ehttps://YOUR-ACCOUNT-ID.r2.cloudflarestorage.com\u003c/value\u003e\n  \u003c/property\u003e\n  \u003cproperty\u003e\n    \u003cname\u003efs.s3a.paging.maximum\u003c/name\u003e\n    \u003cvalue\u003e1000\u003c/value\u003e\n  \u003c/property\u003e\n\u003c/configuration\u003e\n```\nReplace `YOUR-ACCESS-KEY` with your generated API token's R2 access key ID, `YOUR-SECRET-KEY` with your generated API token's secret access key, and `YOUR-ACCOUNT-ID` with your Cloudflare account ID.\n\n**Note**: S3 and R2 credentials cannot be configured simultaneously.\n\n## Authorization\n\nThe server supports a basic authorization with pre-configed bearer token. You can add the following config to your server yaml file:\n\n```yaml\nauthorization:\n  bearerToken: \u003ctoken\u003e\n```\n\nThen any request should send with the above token, otherwise, the server will refuse the request.\n\nIf you don't config the bearer token in the server yaml file, all requests will be accepted without authorization.\n\nTo be more secure, you recommend you to put the server behind a secure proxy such as [NGINX](https://www.nginx.com/) to set up [JWT Authentication](https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-jwt-authentication/).\n\n## Start the server\n\nRun the following shell command:\n\n```\nbin/delta-sharing-server -- --config \u003cthe-server-config-yaml-file\u003e \n```\n\n`\u003cthe-server-config-yaml-file\u003e` should be the path of the yaml file you created in the previous step. You can find options to config JVM in [sbt-native-packager](https://www.scala-sbt.org/sbt-native-packager/archetypes/java_app/index.html#start-script-options).\n\n## Use the pre-built Docker image\n\nYou can use the pre-built docker image from https://hub.docker.com/r/deltaio/delta-sharing-server by running the following command\n\n```\ndocker run -p \u003chost-port\u003e:\u003ccontainer-port\u003e \\\n  --mount type=bind,source=\u003cthe-server-config-yaml-file\u003e,target=/config/delta-sharing-server-config.yaml \\\n  deltaio/delta-sharing-server:0.7.8 -- --config /config/delta-sharing-server-config.yaml\n```\n\nNote that `\u003ccontainer-port\u003e` should be the same as the port defined inside the config file.\n\n## API Compatibility\n\nThe REST APIs provided by Delta Sharing Server are stable public APIs. They are defined by [Delta Sharing Protocol](PROTOCOL.md) and we will follow the entire protocol strictly.\n\nThe interfaces inside Delta Sharing Server are not public APIs. They are considered internal, and they are subject to change across minor/patch releases.\n\n# Delta Sharing Protocol\n\nThe [Delta Sharing Protocol specification](PROTOCOL.md) details the protocol.\n\n# Building this Project\n\n## Python Connector\n\nTo execute tests, run\n\n```\npython/dev/pytest\n```\n\nTo install in develop mode, run\n\n```\ncd python/\npip install -e .\n```\n\nTo install locally, run\n\n```\ncd python/\npip install .\n```\n\nTo generate a wheel file, run\n\n```\ncd python/\npython setup.py sdist bdist_wheel\n```\n\nIt will generate `python/dist/delta_sharing-x.y.z-py3-none-any.whl`.\n\n## Apache Spark Connector and Delta Sharing Server\n\nApache Spark Connector and Delta Sharing Server are compiled using [SBT](https://www.scala-sbt.org/1.x/docs/Command-Line-Reference.html).\n\nTo compile, run\n\n```\nbuild/sbt compile\n```\n\nTo execute tests, run\n\n```\nbuild/sbt test\n```\n\nTo generate the Apache Spark Connector, run\n\n```\nbuild/sbt spark/package\n```\n\nIt will generate `spark/target/scala-2.12/delta-sharing-spark_2.12-x.y.z.jar`.\n\nTo generate the pre-built Delta Sharing Server package, run\n\n```\nbuild/sbt server/universal:packageBin\n```\n\nIt will generate `server/target/universal/delta-sharing-server-x.y.z.zip`.\n\nTo build the Docker image for Delta Sharing Server, run\n\n```\nbuild/sbt server/docker:publishLocal\n```\n\nThis will build a Docker image tagged `delta-sharing-server:x.y.z`, which you can run with:\n\n```\ndocker run -p \u003chost-port\u003e:\u003ccontainer-port\u003e \\\n  --mount type=bind,source=\u003cthe-server-config-yaml-file\u003e,target=/config/delta-sharing-server-config.yaml \\\n  delta-sharing-server:x.y.z -- --config /config/delta-sharing-server-config.yaml\n```\n\nNote that `\u003ccontainer-port\u003e` should be the same as the port defined inside the config file.\n\n\nRefer to [SBT docs](https://www.scala-sbt.org/1.x/docs/Command-Line-Reference.html) for more commands.\n\n# Reporting Issues\n\nWe use [GitHub Issues](https://github.com/delta-io/delta-sharing/issues) to track community reported issues. You can also [contact](#community) the community for getting answers.\n\n# Contributing \nWe welcome contributions to Delta Sharing. See our [CONTRIBUTING.md](CONTRIBUTING.md) for more details.\n\nWe also adhere to the [Delta Lake Code of Conduct](https://github.com/delta-io/delta/blob/master/CODE_OF_CONDUCT.md).\n\n# License\n[Apache License 2.0](LICENSE.txt).\n\n# Community\n\nWe use the same community resources as the Delta Lake project:\n\n- Public Slack Channel\n  - [Register here](https://go.delta.io/slack)\n  - [Login here](https://delta-users.slack.com/)\n\n- Public [Mailing list](https://groups.google.com/forum/#!forum/delta-users)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdelta-io%2Fdelta-sharing","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdelta-io%2Fdelta-sharing","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdelta-io%2Fdelta-sharing/lists"}