Skip to main content

Python SQL Query Engine

Project description

Opteryx

Query your data, where it lives.

A unified SQL interface to unlock insights across your diverse data sources, from blobs stores to databases - effortless cross-platform data analytics.

Resource Location
Source Code https://github.com/mabel-dev/opteryx
Documentation https://opteryx.dev/
Download https://pypi.org/project/opteryx/

PyPI Latest Release Downloads codecov opteryx PyPI Latest Release

InstallExamplesGet Involved

What is Opteryx?

Opteryx champions the SQL-on-everything approach, streamlining cross-platform data analytics by federating SQL queries across diverse data sources, including database systems like Postgres and datalake file formats like Parquet. The goal is to enhance your data analytics process by offering a unified way to access data from across your organization.

Opteryx is a Python library that combines elements of in-process database engines like SQLite and DuckDB with federative features found in systems like Presto and Trino. The result is a versatile tool for querying data across multiple data sources in a seamless fashion.

Opteryx offers the following features:

  • SQL queries on data files generated by other processes, such as logs
  • A command-line tool for filtering, transforming, and combining files
  • Integration with familiar tools like pandas and Polars
  • Embeddable as a low-cost engine, enabling portability and allowing for hundreds of analysts to leverage ad hoc databases with ease
  • Unified and federated access to data on disk, in the cloud, and in on-premises databases, not only through the same interface but in the same query

How Does it Work?

Opteryx processes queries by first determining the appropriate query language to interact with different downstream data platforms. It translates your query into SQL, CQL, or another suitable format for document stores like MongoDB, based on the data source. This enables Opteryx to efficiently retrieve the necessary data from systems such as MySQL or MongoDB to respond to your query.

Opteryx

Why Use Opteryx?

Familiar Interface

Opteryx supports key parts of the Python DBAPI and SQL92 standard standards which many analysts and engineers will already know how to use.

Consistent Syntax

Opteryx creates a common SQL-layer over multiple data platforms, allowing backend systems to be upgraded, migrated or consolidated without changing any Opteryx code.

Where possible, errors and warnings returned by Opteryx help the user to understand how to fix their statement to reduce time-to-success for even novice SQL users.

Consumption-Based Billing Friendly

Opteryx is well-suited for deployments to environments which are pay-as-you-use, like Google Cloud Run. Great for situations where you have low-volume usage, or multiple environments, where the costs of many traditional database deployment can quickly add up.

Python Ecosystem

Opteryx is Open Source Python, it quickly and easily integrates into Python code, including Jupyter Notebooks, so you can start querying your data within a few minutes. Opteryx integrates with many of your favorite Python data tools, you can use Opteryx to run SQL against pandas and Polars DataFrames, and even execute a JOIN on an in-memory DataFrame and a remote SQL dataset.

Time Travel

Designed for data analytics in environments where decisions need to be replayable, Opteryx allows you to query data as at a point in time in the past to replay decision algorithms against facts as they were known in the past. You can even self-join tables historic data, great for finding deltas in datasets over time. (data must be structured to enable temporal queries)

Fast

Benchmarks on M2 Pro Mac running an ad hoc GROUP BY over a 6 million row parquet file via the CLI in ~1/4th of a second from a cold start (no caching and predefined schema). (different systems will have different performance characteristics)

Instant Elasticity

Designed to run in Knative and similar environments like Google Cloud Run, Opteryx can scale down to zero, and scale up to respond to thousands of concurrent queries within seconds.

Bring your own Data

Opteryx

Opteryx supports multiple query engines, dataframe APIs and storage formats. You can mix-and-match sources in a single query. Opteryx can even JOIN datasets stored in different formats and different platforms in the same query, such as Parquet and MySQL.

Opteryx allows you to query your data directly in the systems where they are stored, eliminating the need to duplicate data into a common store for analytics. This saves you the cost and effort of maintaining duplicates.

Opteryx can push parts of your query to the source query engine, allowing queries to run at the speed of the backend, rather than your local computer.

And if there's not a connector in the box for your data platform; feel free to submit a pull request to add one.

Install

Installing from PyPI is recommended.

pip install opteryx

To build Opteryx from source, refer to the contribution guides.

Opteryx installs with a small set of libraries it needs for core functionality, such as Numpy, PyArrow, and orjson. Some features require additional libraries to be installed, you are notified of these libraries as they are required.

Examples

Filter a Dataset on the Command Line

In this example, we are running Opteryx from the command line to filter one of the internal example datasets and display the results on the console.

python -m opteryx "SELECT * FROM \$astronauts WHERE 'Apollo 11' IN UNNEST(missions);"

Opteryx this example is complete and should run as-is

Execute a Simple Query in Python

In this example, we are showing the basic usage of the Python API by executing a simple query that makes no references to any datasets.

# Import the Opteryx SQL query engine library.
import opteryx

# Execute a SQL query to evaluate the expression 4 * 7.
# The result is stored in the 'result' variable.
result = opteryx.query("SELECT 4 * 7;")

# Display the first row(s) of the result to verify the query executed correctly.
result.head()
ID 4 * 7
1 28

this example is complete and should run as-is

Execute SQL on a pandas DataFrame

In this example, we are running a SQL statement on a pandas DataFrame and returning the result as a new pandas DataFrame.

# Required imports
import opteryx
import pandas

# Read data from the exoplanets.csv file hosted on Google Cloud Storage
# The resulting DataFrame is stored in the variable `pandas_df`.
pandas_df = pandas.read_csv("https://storage.googleapis.com/opteryx/exoplanets/exoplanets.csv")

# Register the pandas DataFrame with Opteryx under the alias "exoplanets"
# This makes the DataFrame available for SQL-like queries.
opteryx.register_df("exoplanets", pandas_df)

# Perform an SQL query to group the data by `koi_disposition` and count the number
# of occurrences of each distinct `koi_disposition`.
# The result is stored in `aggregated_df`.
aggregated_df = opteryx.query("SELECT koi_disposition, COUNT(*) FROM exoplanets GROUP BY koi_disposition;").pandas()

# Display the aggregated DataFrame to get a preview of the result.
aggregated_df.head()
  koi_disposition  COUNT(*)
0       CONFIRMED      2293
1  FALSE POSITIVE      5023
2       CANDIDATE      2248 

this example is complete and should run as-is

Query Data on Local Disk

In this example, we are querying and filtering a file directly. This example will not run as written because the file being queried does not exist.

# Import the Opteryx query engine.
import opteryx

# Execute a SQL query to select the first 5 rows from the 'space_missions.parquet' table.
# The result will be stored in the 'result' variable.
result = opteryx.query("SELECT * FROM 'space_missions.parquet' LIMIT 5;")

# Display the result.
# This is useful for quick inspection of the data.
result.head()
ID Company Location Price Launched_at Rocket Rocket_Status Mission Mission_Status
0 RVSN USSR Site 1/5, Baikonur Cosmodrome, null 1957-10-04 19:28:00 Sputnik 8K71PS Retired Sputnik-1 Success
1 RVSN USSR Site 1/5, Baikonur Cosmodrome, null 1957-11-03 02:30:00 Sputnik 8K71PS Retired Sputnik-2 Success
2 US Navy LC-18A, Cape Canaveral AFS, Fl null 1957-12-06 16:44:00 Vanguard Retired Vanguard TV3 Failure
3 AMBA LC-26A, Cape Canaveral AFS, Fl null 1958-02-01 03:48:00 Juno I Retired Explorer 1 Success
4 US Navy LC-18A, Cape Canaveral AFS, Fl null 1958-02-05 07:33:00 Vanguard Retired Vanguard TV3BU Failure

this example requires a data file, space_missions.parquet.

Query Data in SQLite

In this example, we are querying a SQLite database via Opteryx. This example will not run as written because the file being queried does not exist.

# Import the Opteryx query engine and the SqlConnector from its connectors module.
import opteryx
from opteryx.connectors import SqlConnector

# Register a new data store with the prefix "sql", specifying the SQL Connector to handle it.
# This allows queries with the 'sql' prefix to be routed to the appropriate SQL database.
opteryx.register_store(
   prefix="sql",  # Prefix for distinguishing this particular store
   connector=SqlConnector,  # Specify the connector to handle queries for this store
   remove_prefix=True,  # Remove the prefix from the table name when querying SQLite
   connection="sqlite:///database.db"  # SQLAlchemy connection string for the SQLite database
)

# Execute a SQL query to select specified columns from the 'planets' table in the SQL store,
# limiting the output to 5 rows. The result is stored in the 'result' variable.
result = opteryx.query("SELECT name, mass, diameter, density FROM sql.planets LIMIT 5;")

# Display the result.
# This is useful for quickly verifying that the query executed correctly.
result.head()
ID name mass diameter density
1 Mercury 0.33 4879 5427
2 Venus 4.87 12104 5243
3 Earth 5.97 12756 5514
4 Mars 0.642 6792 3933
5 Jupiter 1898.0 142984 1326

this example requires a data file, database.db.

Query Data on GCS

In this example, we are to querying a dataset on GCS in a public bucket called 'opteryx'.

# Import the Opteryx query engine and the GcpCloudStorageConnector from its connectors module.
import opteryx
from opteryx.connectors import GcpCloudStorageConnector

# Register a new data store named 'opteryx', specifying the GcpCloudStorageConnector to handle it.
# This allows queries for this particular store to be routed to the appropriate GCP Cloud Storage bucket.
opteryx.register_store(
    "opteryx",  # Name of the store to register
    GcpCloudStorageConnector  # Connector to handle queries for this store
)

# Execute a SQL query to select all columns from the 'space_missions' table located in the 'opteryx' store,
# and limit the output to 5 rows. The result is stored in the 'result' variable.
result = opteryx.query("SELECT * FROM opteryx.space_missions LIMIT 5;")

# Display the result.
# This is useful for quickly verifying that the query executed correctly.
result.head()
ID Company Location Price Launched_at Rocket Rocket_Status Mission Mission_Status
0 RVSN USSR Site 1/5, Baikonur Cosmodrome, null 1957-10-04 19:28:00 Sputnik 8K71PS Retired Sputnik-1 Success
1 RVSN USSR Site 1/5, Baikonur Cosmodrome, null 1957-11-03 02:30:00 Sputnik 8K71PS Retired Sputnik-2 Success
2 US Navy LC-18A, Cape Canaveral AFS, Fl null 1957-12-06 16:44:00 Vanguard Retired Vanguard TV3 Failure
3 AMBA LC-26A, Cape Canaveral AFS, Fl null 1958-02-01 03:48:00 Juno I Retired Explorer 1 Success
4 US Navy LC-18A, Cape Canaveral AFS, Fl null 1958-02-05 07:33:00 Vanguard Retired Vanguard TV3BU Failure

this example is complete and should run as-is


You can also try Opteryx right now using our interactive labs on Binder.

Binder

Community

Discord X Follow Medium

Get Involved

  • :star: Star this repo
  • Contribute — join us in building Opteryx, through writing code, or inspiring others to use it.
  • Let us know your ideas, how you are using Opteryx, or report a bug or feature request.
  • See the contributor documentation for Opteryx. It's easy to get started, and we're really friendly if you need any help!
  • If you're interested in contributing to the code now, check out GitHub issues. Feel free to ask questions or open a draft PR.

Security

Static Analysis Vulnerabilities Security Rating

See the project Security Policy for information about reporting vulnerabilities.

License

License FOSSA Status

Opteryx is licensed under Apache 2.0 except where specific modules note otherwise.

Status

Status

Opteryx is in beta. Beta means different things to different people, to us, being beta means:

  • Core functionality has good regression test coverage to help ensure stability
  • Some edge cases may have undetected bugs
  • Performance tuning is incomplete
  • Changes are focused on feature completion, bugs, performance, reducing debt, and security
  • Code structure and APIs are not stable and may change

Related Projects

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

opteryx-0.18.2.tar.gz (1.6 MB view details)

Uploaded Source

Built Distributions

opteryx-0.18.2-cp312-cp312-win_amd64.whl (3.2 MB view details)

Uploaded CPython 3.12 Windows x86-64

opteryx-0.18.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.8 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

opteryx-0.18.2-cp312-cp312-macosx_10_15_universal2.whl (6.1 MB view details)

Uploaded CPython 3.12 macOS 10.15+ universal2 (ARM64, x86-64)

opteryx-0.18.2-cp311-cp311-win_amd64.whl (3.2 MB view details)

Uploaded CPython 3.11 Windows x86-64

opteryx-0.18.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.5 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

opteryx-0.18.2-cp311-cp311-macosx_10_15_universal2.whl (6.1 MB view details)

Uploaded CPython 3.11 macOS 10.15+ universal2 (ARM64, x86-64)

opteryx-0.18.2-cp310-cp310-win_amd64.whl (3.2 MB view details)

Uploaded CPython 3.10 Windows x86-64

opteryx-0.18.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.3 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

opteryx-0.18.2-cp310-cp310-macosx_10_15_universal2.whl (6.1 MB view details)

Uploaded CPython 3.10 macOS 10.15+ universal2 (ARM64, x86-64)

opteryx-0.18.2-cp39-cp39-win_amd64.whl (3.2 MB view details)

Uploaded CPython 3.9 Windows x86-64

opteryx-0.18.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.3 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

opteryx-0.18.2-cp39-cp39-macosx_10_15_universal2.whl (6.1 MB view details)

Uploaded CPython 3.9 macOS 10.15+ universal2 (ARM64, x86-64)

File details

Details for the file opteryx-0.18.2.tar.gz.

File metadata

  • Download URL: opteryx-0.18.2.tar.gz
  • Upload date:
  • Size: 1.6 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for opteryx-0.18.2.tar.gz
Algorithm Hash digest
SHA256 d617bd7d403c0ca0280597a7b5ed3798d67a81bbf33b91decefe99c29efd5f96
MD5 0dc9e69db0c0d1b15c0dacd22dc3b842
BLAKE2b-256 8dd4f9ac11722e64f1ff0fa6357bf7423327425ba7d86de13a1f5fe2bf0e3379

See more details on using hashes here.

File details

Details for the file opteryx-0.18.2-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for opteryx-0.18.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 401e52f6213c515a5a9a674728feea86af1010ba75325391122ffa51b1c7fe11
MD5 ecdf6fe1667011440f96494ab79a184b
BLAKE2b-256 1ca186b2761255f846dfb100067888331874fa4e8529466c1c2a9a75b146427e

See more details on using hashes here.

File details

Details for the file opteryx-0.18.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for opteryx-0.18.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dd6f4e4491794e9b3760b8195db5daa5c83cdbb07ae7c11300ec10d40cd2c09c
MD5 720605a59116d68b8862f904bf4136f7
BLAKE2b-256 4fbee45a6585b03792ddd0dcab73adb8d1ba3028c275b9d7fb73125a9d6f73c2

See more details on using hashes here.

File details

Details for the file opteryx-0.18.2-cp312-cp312-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for opteryx-0.18.2-cp312-cp312-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 e208d41066c0aadcf9240353968fe84a560927803fd29f298b1f784d5f1b0efc
MD5 54a52e32762008115a4a9363988ecc0f
BLAKE2b-256 628efaedea6dd4ac763f4c883ded345a566d913d597288a75260c3b10c6cdc39

See more details on using hashes here.

File details

Details for the file opteryx-0.18.2-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for opteryx-0.18.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 4d609eecf2e62dcfca014eda42a7eff4d2d1b150196b1cd22aa0368683ccaf8a
MD5 b077d5698ed79ad36ba70f15718a8248
BLAKE2b-256 8c4ea82077eaf50ec6ac7eae060376bf8916eadf2f7e1c0a3dfe763daea12a8c

See more details on using hashes here.

File details

Details for the file opteryx-0.18.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for opteryx-0.18.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cd197aeb7462a1ced10de49f9199465b6aa97fbc5accdb09fd7bcbc9c79befcb
MD5 dcb2b93b01910651fe6c28601b7bfe14
BLAKE2b-256 274b07376a70f71abace791ef6f72700785541314523e487fbe98053c49b339b

See more details on using hashes here.

File details

Details for the file opteryx-0.18.2-cp311-cp311-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for opteryx-0.18.2-cp311-cp311-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 223b762c5a537922a515e4afb6918e42922f13bdcc10ac41c9d5b68067b3e956
MD5 54873062b7bb705fe5a00da24d01ee5b
BLAKE2b-256 ff4704381ae48b64cd75c36cf9a4663de810651d101c581b7a45617f3b8a9f28

See more details on using hashes here.

File details

Details for the file opteryx-0.18.2-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for opteryx-0.18.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 7c3a1fd96411bcc1d33f0a1f12a3faade1a8a821f9c2279357d3544fad646a02
MD5 dfc8df7d7584fb5c3c40ae6996ecce40
BLAKE2b-256 a6e2e559a342b67bcc079707f57badc7d1733e89e739d78c2a260a7696d46421

See more details on using hashes here.

File details

Details for the file opteryx-0.18.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for opteryx-0.18.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b50b7c3df3f25910112bbf93cf7636af57ad7315c6ad7697f2d7f39a641de4db
MD5 5faed10c4308b7d8089d0c71ae9f6145
BLAKE2b-256 876aebfb9c479cddf1e2f474e6f60a7527c766c707036fd2133dda77b9884b74

See more details on using hashes here.

File details

Details for the file opteryx-0.18.2-cp310-cp310-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for opteryx-0.18.2-cp310-cp310-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 bdde5a7fb68237906e7f921f5001ae3f86aa7d020eb9699ae6fdbe7d9962a6d6
MD5 c589962cce4cb18d5abf688e139398dc
BLAKE2b-256 ebfd0e56c24b6abaa24fa52c9f7ebcd51583316d30c06a88a2bac33a1a7667bf

See more details on using hashes here.

File details

Details for the file opteryx-0.18.2-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: opteryx-0.18.2-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 3.2 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for opteryx-0.18.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 a64f5bbe2d17e30c9d352fe7a06d4a490071842730b7aecbac2b736dd520114a
MD5 5b870ca72705c2548f706c5826bd0443
BLAKE2b-256 04718d3917ea0939985c4e78146cde99a73c82f43dd02efe728e12742a16c0ee

See more details on using hashes here.

File details

Details for the file opteryx-0.18.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for opteryx-0.18.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 98c52ee1f3d56bc18396be92b95e8f50b716e655965757568669a5a58059de1d
MD5 bcb348fbbe27e1a9ec07d2c205a60ec4
BLAKE2b-256 05fdd371f30a6b51bed66f651e82aed55d86318a66c00408e4cc84d9bb1b5761

See more details on using hashes here.

File details

Details for the file opteryx-0.18.2-cp39-cp39-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for opteryx-0.18.2-cp39-cp39-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 40f3af92aca733498615acd61f25082f8870d4b2048d3ab04d8f0b107f449da6
MD5 1bb9d5074bff9dda198c9c5003691611
BLAKE2b-256 c4eaee3bbe265068e04151b4bd923c812d75829f7aa5bef1db946540b4a2c87b

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page