Skip to main content

No project description provided

Project description

Actions Status PyPI Bytewax User Guide

Bytewax

Python Stateful Stream Processing Framework

Bytewax is a Python framework that simplifies event and stream processing. Because Bytewax couples the stream and event processing capabilities of Flink, Spark, and Kafka Streams with the friendly and familiar interface of Python, you can re-use the Python libraries you already know and love. Connect data sources, run stateful transformations and write to various different downstream systems with built-in connectors or existing Python libraries. Bytewax Dataflow Animation

How it all works

Bytewax is a Python framework and Rust distributed processing engine that uses a dataflow computational model to provide parallelizable stream processing and event processing capabilities similar to Flink, Spark, and Kafka Streams. You can use Bytewax for a variety of workloads from moving data à la Kafka Connect style all the way to advanced online machine learning workloads. Bytewax is not limited to streaming applications but excels anywhere that data can be distributed at the input and output.

Bytewax has an accompanying command line interface, waxctl, which supports the deployment of dataflows on cloud servers or Kubernetes. You can download it here.


Getting Started with Bytewax

pip install bytewax

Install waxctl

Dataflow, Input and Operators

A Bytewax dataflow is Python code that will represent an input, a series of processing steps, and an output. The inputs could range from a Kafka stream to a WebSocket and the outputs could vary from a data lake to a key-value store.

import json

from bytewax import operators as op
from bytewax.connectors.kafka import operators as kop
from bytewax.dataflow import Dataflow

Bytewax has input and output helpers for common input and output data sources but you can also create your own with the Sink and Source API.

At a high-level, the dataflow compute model is one in which a program execution is conceptualized as data flowing through a series of operator-based steps. Operators like map and filter are the processing primitives of Bytewax. Each of them gives you a “shape” of data transformation, and you give them regular Python functions to customize them to a specific task you need. See the documentation for a list of the available operators

BROKERS = ["localhost:19092"]
IN_TOPICS = ["in_topic"]
OUT_TOPIC = "out_topic"
ERR_TOPIC = "errors"


def deserialize(kafka_message):
    return json.loads(kafka_message.value)


def anonymize_email(event_data):
    event_data["email"] = "@".join(["******", event_data["email"].split("@")[-1]])
    return event_data


def remove_bytewax(event_data):
    return "bytewax" not in event_data["email"]


flow = Dataflow("kafka_in_out")
stream = kop.input("inp", flow, brokers=BROKERS, topics=IN_TOPICS)
# we can inspect the stream coming from the kafka topic to view the items within on std out for debugging
op.inspect("inspect-oks", stream.oks)
# we can also inspect kafka errors as a separate stream and raise an exception when one is encountered
errs = op.inspect("errors", stream.errs).then(op.raises, "crash-on-err")
deser_msgs = op.map("deserialize", stream.oks, deserialize)
anon_msgs = op.map("anon", deser_msgs, anonymize_email)
filtered_msgs = op.filter("filter_employees", anon_msgs, remove_bytewax)
processed = op.map("map", anon_msgs, lambda m: KafkaSinkMessage(None, json.dumps(m)))
# and finally output the cleaned data to a new topic
kop.output("out1", processed, brokers=BROKERS, topic=OUT_TOPIC)

Windowing, Reducing and Aggregating

Bytewax is a stateful stream processing framework, which means that some operations remember information across multiple events. Windows and aggregations are also stateful, and can be reconstructed in the event of failure. Bytewax can be configured with different state recovery mechanisms to durably persist state in order to recover from failure.

There are multiple stateful operators available like reduce, stateful_map and fold_window. The complete list can be found in the API documentation for all operators. Below we use the fold_window operator with a tumbling window based on system time to gather events and calculate the number of times events have occurred on a per-user basis.

from datetime import datetime, timedelta, timezone

from bytewax.dataflow import Dataflow
import bytewax.operators.windowing as win
from bytewax.operators.windowing import EventClock, TumblingWindower
from bytewax.testing import TestingSource

flow = Dataflow("window_eg")

src = [
    {"user_id": "123", "value": 5, "time": "2023-1-1T00:00:00Z"},
    {"user_id": "123", "value": 7, "time": "2023-1-1T00:00:01Z"},
    {"user_id": "123", "value": 2, "time": "2023-1-1T00:00:07Z"},
]
inp = op.input("inp", flow, TestingSource(src))
keyed_inp = op.key_on("keyed_inp", inp, lambda x: x["user_id"])


# This function instructs the event clock on how to retrieve the
# event's datetime from the input.
# Note that the datetime MUST be UTC. If the datetime is using a different
# representation, we would have to convert it here.
def get_event_time(event):
    return datetime.fromisoformat(event["time"])


# Configure the `fold_window` operator to use the event time.
clock = EventClock(get_event_time, wait_for_system_duration=timedelta(seconds=10))

# And a 5 seconds tumbling window
align_to = datetime(2023, 1, 1, tzinfo=timezone.utc)
windower = TumblingWindower(align_to=align_to, length=timedelta(seconds=5))

five_sec_buckets_win_out = win.collect_window(
    "five_sec_buckets", keyed_inp, clock, windower
)


def calc_avg(bucket):
    values = [event["value"] for event in bucket]
    if len(values) > 0:
        return sum(values) / len(values)
    else:
        return None


five_sec_avgs = op.map_value("avg_in_bucket", five_sec_buckets_win_out.down, calc_avg)

Merges and Joins

Merging or Joining multiple input streams is a common task for stream processing, Bytewax enables different types of joins to facilitate different patters.

Merging Streams

Merging streams is like concatenating, there is no logic and the resulting stream will potentially include heterogeneous records.

from bytewax import operators as op

from bytewax.connectors.stdio import StdOutSink
from bytewax.dataflow import Dataflow
from bytewax.testing import TestingSource

flow = Dataflow("merge")

src_1 = [
    {"user_id": "123", "name": "Bumble"},
]
inp1 = op.input("inp1", flow, TestingSource(src_1))

src_2 = [
    {"user_id": "123", "email": "bee@bytewax.com"},
    {"user_id": "456", "email": "hive@bytewax.com"},
]
inp2 = op.input("inp2", flow, TestingSource(src_2))
merged_stream = op.merge("merge", inp1, inp2)
op.inspect("debug", merged_stream)
Joining Streams

Joining streams is different than merging because it uses logic to join the records in the streams together. The joins in Bytewax can be running or not. A regular join in streaming is more closely related to an inner join in SQL in that the dataflow will emit data downstream from a join when all of the sides of the join have matched on the key.

from bytewax import operators as op

from bytewax.connectors.stdio import StdOutSink
from bytewax.dataflow import Dataflow
from bytewax.testing import TestingSource

flow = Dataflow("join")

src_1 = [
    {"user_id": "123", "name": "Bumble"},
]
inp1 = op.input("inp1", flow, TestingSource(src_1))
keyed_inp_1 = op.key_on("key_stream_1", inp1, lambda x: x["user_id"])
src_2 = [
    {"user_id": "123", "email": "bee@bytewax.com"},
    {"user_id": "456", "email": "hive@bytewax.com"},
]
inp2 = op.input("inp2", flow, TestingSource(src_2))
keyed_inp_2 = op.key_on("key_stream_2", inp2, lambda x: x["user_id"])

merged_stream = op.join("join", keyed_inp_1, keyed_inp_2)
op.inspect("debug", merged_stream)

Output

Output in Bytewax is described as a sink and these are grouped into connectors. There are a number of basic connectors in the Bytewax repo to help you during development. In addition to the built-in connectors, it is possible to use the input and output API to build a custom sink and source. There is also a hub for connectors built by the community, partners and Bytewax. Below is an example of a custom connector for Postgres using the psycopg2 library.

% skip: next

import psycopg2

from bytewax import operators as op
from bytewax.outputs import FixedPartitionedSink, StatefulSinkPartition


class PsqlSink(StatefulSinkPartition):
    def __init__(self):
        self.conn = psycopg2.connect("dbname=website user=bytewax")
        self.conn.set_session(autocommit=True)
        self.cur = self.conn.cursor()

    def write_batch(self, values):
        query_string = """
            INSERT INTO events (user_id, data)
            VALUES (%s, %s)
            ON CONFLICT (user_id)
            DO UPDATE SET data = %s;
        """
        self.cur.execute_values(query_string, values)

    def snapshot(self):
        pass

    def close(self):
        self.conn.close()


class PsqlOutput(FixedPartitionedSink):
    def list_parts(self):
        return ["single"]

    def build_part(step_id, for_part, resume_state):
        return PsqlSink()

Execution

Bytewax dataflows can be executed in a single Python process, or on multiple processes on multiple hosts with multiple worker threads. When processing data in a distributed fashion, Bytewax uses routing keys to ensure your state is updated in a correct way automatically.

# a single worker locally
python -m bytewax.run my_dataflow:flow

# Start two worker threads in a single process.
python -m bytewax.run my_dataflow -w 2

# Start a process on two separate machines to form a Bytewax cluster.
# Start the first process with two worker threads on `machine_one`.
machine_one$ python -m bytewax.run my_dataflow -w 2 -i0 -a "machine_one:2101;machine_two:2101"

# Then start the second process with three worker threads on `machine_two`.
machine_two$ python -m bytewax.run my_dataflow -w 3 -i1 -a "machine_one:2101;machine_two:2101"

It can also be run in a Docker container as described further in the documentation.

Kubernetes

The recommended way to run dataflows at scale is to leverage the kubernetes ecosystem. To help manage deployment, we built waxctl, which allows you to easily deploy dataflows that will run at huge scale across multiple compute nodes.

waxctl df deploy my_dataflow.py --name my-dataflow

Why Bytewax?

At a high level, Bytewax provides a few major benefits:

  • The operators in Bytewax are largely “data-parallel”, meaning they can operate on independent parts of the data concurrently.
  • Bytewax offers the ability to express higher-level control constructs, like iteration.
  • Bytewax allows you to develop and run your code locally, and then easily scale that code to multiple workers or processes without changes.
  • Bytewax can be used in both a streaming and batch context
  • Ability to leverage the Python ecosystem directly

Community

Slack is the main forum for communication and discussion.

GitHub Issues is reserved only for actual issues. Please use the community Slack for discussions.

Code of Conduct

More Examples

For a more complete example, and documentation on the available operators, check out the User Guide and the /examples folder.

License

Bytewax is licensed under the Apache-2.0 license.

Contributing

Contributions are welcome! This community and project would not be what it is without the contributors. All contributions, from bug reports to new features, are welcome and encouraged.

Please view the Contribution Guide for how to get started.



With ❤️ Bytewax

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

bytewax-0.21.0-cp312-none-win_amd64.whl (5.2 MB view details)

Uploaded CPython 3.12 Windows x86-64

bytewax-0.21.0-cp312-cp312-manylinux_2_31_x86_64.whl (8.0 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.31+ x86-64

bytewax-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (7.7 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARMv7l

bytewax-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (8.0 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

bytewax-0.21.0-cp312-cp312-macosx_11_0_arm64.whl (6.0 MB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

bytewax-0.21.0-cp312-cp312-macosx_10_12_x86_64.whl (6.1 MB view details)

Uploaded CPython 3.12 macOS 10.12+ x86-64

bytewax-0.21.0-cp311-none-win_amd64.whl (5.2 MB view details)

Uploaded CPython 3.11 Windows x86-64

bytewax-0.21.0-cp311-cp311-manylinux_2_31_x86_64.whl (8.0 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.31+ x86-64

bytewax-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (7.7 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARMv7l

bytewax-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (7.9 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

bytewax-0.21.0-cp311-cp311-macosx_11_0_arm64.whl (6.0 MB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

bytewax-0.21.0-cp311-cp311-macosx_10_12_x86_64.whl (6.1 MB view details)

Uploaded CPython 3.11 macOS 10.12+ x86-64

bytewax-0.21.0-cp310-none-win_amd64.whl (5.2 MB view details)

Uploaded CPython 3.10 Windows x86-64

bytewax-0.21.0-cp310-cp310-manylinux_2_31_x86_64.whl (8.0 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.31+ x86-64

bytewax-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (7.7 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARMv7l

bytewax-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (7.9 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

bytewax-0.21.0-cp310-cp310-macosx_11_0_arm64.whl (6.0 MB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

bytewax-0.21.0-cp310-cp310-macosx_10_12_x86_64.whl (6.1 MB view details)

Uploaded CPython 3.10 macOS 10.12+ x86-64

bytewax-0.21.0-cp39-none-win_amd64.whl (5.2 MB view details)

Uploaded CPython 3.9 Windows x86-64

bytewax-0.21.0-cp39-cp39-manylinux_2_31_x86_64.whl (8.0 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.31+ x86-64

bytewax-0.21.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (7.7 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARMv7l

bytewax-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (8.0 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

bytewax-0.21.0-cp39-cp39-macosx_11_0_arm64.whl (6.0 MB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

bytewax-0.21.0-cp39-cp39-macosx_10_12_x86_64.whl (6.1 MB view details)

Uploaded CPython 3.9 macOS 10.12+ x86-64

bytewax-0.21.0-cp38-none-win_amd64.whl (5.2 MB view details)

Uploaded CPython 3.8 Windows x86-64

bytewax-0.21.0-cp38-cp38-manylinux_2_31_x86_64.whl (8.0 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.31+ x86-64

bytewax-0.21.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (7.7 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARMv7l

bytewax-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (8.0 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

bytewax-0.21.0-cp38-cp38-macosx_11_0_arm64.whl (6.0 MB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

bytewax-0.21.0-cp38-cp38-macosx_10_12_x86_64.whl (6.1 MB view details)

Uploaded CPython 3.8 macOS 10.12+ x86-64

File details

Details for the file bytewax-0.21.0-cp312-none-win_amd64.whl.

File metadata

  • Download URL: bytewax-0.21.0-cp312-none-win_amd64.whl
  • Upload date:
  • Size: 5.2 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.19

File hashes

Hashes for bytewax-0.21.0-cp312-none-win_amd64.whl
Algorithm Hash digest
SHA256 60d7ffa2b7ee404c23dc2675e2268a0bd4b5632b154d861dc0b99e648ff61230
MD5 7bab68b70eef7afa43bf5884c1133985
BLAKE2b-256 3917102e3c603393bb3a709e00e900ff8d0299292c7de69d9c6360aadd3b97ca

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp312-cp312-manylinux_2_31_x86_64.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp312-cp312-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 41ab5ec4b6e88caadd8b4445e67e0b614c75d3efd8e9566f61f0e22826d82f4e
MD5 7df64628351bcf9ff2416bc9dd60c550
BLAKE2b-256 dbd675761aeda9d13014b32832a65880cacb23d93e6b391cce39e49b781b92ef

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 62fceee1514483b279bbffbaca21b2df50d59636bb7496adb3bfb286fa4b8772
MD5 9d35fb39676c08ead45e960810bb4008
BLAKE2b-256 3d7555301b8572d425f5e041f9d8f1836ba2311a03fde240847ea256b21d9aa0

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5e455ad632cf7beffb77d52cb1260667da3927bb4a7de98c80dd3db355880db7
MD5 b5d9e121941146a56ce8554ee05b5ddb
BLAKE2b-256 574667e7eab647c592a815b93a8b20c55a11136eae7865254cc89d7285c270a3

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b6c7d7525f2688cecaa3ee06ec090c565458d6aa800dd28cb1dedb4c75eac12b
MD5 bfed6f772f1d37c9cd74d26906526158
BLAKE2b-256 89e291b05a3dfb81ab0a328a5bc9f32121c8140046e1e06fc10c766927ff34ab

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 87ee87564de9d873cdf2f9b4b02037923a53cfa42fdd508ab9726fc5ea224f95
MD5 83a57213b816d38be594b3b7eacb43ac
BLAKE2b-256 7051c71527f604537642fa4d1dcdb9de443223291febe34ce071272abe280f7a

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp311-none-win_amd64.whl.

File metadata

  • Download URL: bytewax-0.21.0-cp311-none-win_amd64.whl
  • Upload date:
  • Size: 5.2 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.19

File hashes

Hashes for bytewax-0.21.0-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 ba92413aac84180ce2ced3946ae4962dae280ecc36cbf3638cdde4548254cb75
MD5 dd83c87383b660045935d67bfec9e7ac
BLAKE2b-256 6efbfe6c9acad0d6bc588d0b6f5851b9617c3bed8d91bc72a1871825fc2f4e7e

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp311-cp311-manylinux_2_31_x86_64.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp311-cp311-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 c407ffe67b4f9eb31b91a975a6796d01041bdc46cc3cee82e70acb2185f48bc5
MD5 220ed44387b94d62b38ee8f66fbb8aa7
BLAKE2b-256 8720c5018ed63f995a6b87878ee42b71af225d3b9b2e778a552b7d3a169089ba

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 1d7df84fbd228e2fc274e4cf4ae9f555c1eb3778b3d2b8d1eaab130748c236bd
MD5 1d45c2befb0b917160d47556617ec6c7
BLAKE2b-256 0b1cff54c1be6a8883f912e7c66c039d27040cf1f87f13aec44bc040b8d90aff

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 80bd7f70e60ace4514984ddc9048e770d6ef412b09999c973820e4ff61eca178
MD5 1004a4a62b236578b196a1152a903a9b
BLAKE2b-256 66409beb4437c584e6a80b7d5a2a10c1fefb1128e2f7ce2929bab351acd33878

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 65399a64fec4f45932ef4acbe34f45ecb1d9bc6b91a1b049316a2e79fa85dbe7
MD5 578fb6a1247225b56ab6bb0d3d664a76
BLAKE2b-256 779985fc100ef29ea7906b5f760caae2239617c2117df90dda085e7032020946

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 f551b2eef7b354b439fd13f62349528c1eff9e59ffbfdf2a7d4fe0141b4ae6ca
MD5 995e724e0fcacc07e50148e92dea9c7a
BLAKE2b-256 1c549dd0837fbeed9ac7971aacba14fa9a55f50ab0b12acc81ee743569f47c5c

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp310-none-win_amd64.whl.

File metadata

  • Download URL: bytewax-0.21.0-cp310-none-win_amd64.whl
  • Upload date:
  • Size: 5.2 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.19

File hashes

Hashes for bytewax-0.21.0-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 44081c85ae78f381b673706868fba2f97e82be1fb5457996456c1abd1f5d4ae5
MD5 8e75735bfba00143aef8f3cdc7e9f900
BLAKE2b-256 f58060bd0dadb79c949d705225d729146a8a78641cf1e11ec2fa63942dcc6105

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp310-cp310-manylinux_2_31_x86_64.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp310-cp310-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 9fd4bbe5de9970d7cc40b4bf656663d44f62b04da2ec16b6b1c97125a466ea27
MD5 9068e36ebcfebd5ad257732a53bdfcee
BLAKE2b-256 885fb0e9f76c0269c2ec3ed7c960647689141f7004b463f3eb6ac30ddffb0b0a

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 bb179c5a24b1adb209a7b3974530909768d32817374b5ec37855b30834ff17bf
MD5 c0c1236b5503989a82134b92335c49b8
BLAKE2b-256 148a2bb040481b1d64c69475382864ccf066746269d1b2468fce794e268cb6dc

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 be65945ddc80372b1079c90bc871a566e0dd8ea8031702e317466ffcfe1668ea
MD5 d467ed6fde075a133516f48b23f483fa
BLAKE2b-256 e94df8a4ec3fc3e4cb24e657d0cdc581dbfbfccf418061d9efd34f0f95b8ff84

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 76be3063e6878589e306b7216eb8ffed3448a63e6083a3c48dea7c74c9632203
MD5 3edd0d8efe1f713909521a5903ebfa7c
BLAKE2b-256 5f48c7824ea7225f6bed95f9b320c6fb89747666e69451c71b398355f6e7df6d

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a31d651406534963d990ec1995f45ddae50db498b56f9d96cb9482edbcb499c6
MD5 eabeeb15eaf3bf6fc9acc55a5fbbe615
BLAKE2b-256 53e40a73d18426efaa3989f7c223cd23001ca287a00a4a8cf9f6729962bf5990

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp39-none-win_amd64.whl.

File metadata

  • Download URL: bytewax-0.21.0-cp39-none-win_amd64.whl
  • Upload date:
  • Size: 5.2 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.19

File hashes

Hashes for bytewax-0.21.0-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 ece6452ce1c609915447402214714d7392cb7f864ea968a584b649ab8007466d
MD5 d070171f0e42ffe6398bc9baa1fb3933
BLAKE2b-256 1fec63e7f8ed239dd3cf2ecdef02154373fc9707862de4b979a5517a980f9085

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp39-cp39-manylinux_2_31_x86_64.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp39-cp39-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 97e3a3c9a199b87ff15655cfdf4b3b37bd4ae3270c469eb3297972949d542e9e
MD5 7d30ce884e6e5c9c39e732cf94841d0d
BLAKE2b-256 c548e849970558751c911a0858f0273cbb7e0d8f4671cfd395abcfe290a02ced

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 872e60fff03a8dca95e5317992756d3e479457a0e07c4204ec009db9970995b9
MD5 5d5c2c71d99345dbf6a0bd27f1563942
BLAKE2b-256 f261ce8f4f6e7f8deccebf287fa4c838ce04108b069ee5ea43ea16e58498b2d2

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c9e96870801761aab83aa3b164affdfc76df8c5d4f6c93b28fdbf3ef4cc66008
MD5 81361d11fed43925d5972255a0b222d0
BLAKE2b-256 b5ec399f73a5e0ba513e059497b6e4810758acb1aafb234c5fc98f72c17f6f65

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4d957989ca4f3a3cbbe9747c926afc28d1e6ce320772ea062b2a4383e1eacbb4
MD5 dcfb3a620e4612726308d0ad773729bd
BLAKE2b-256 e6542112af87ffc439309179bf3349128ce2600079d368712bfffa116fc7251b

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp39-cp39-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 131c4bf07cfdbf7141e9fc30cb2b6a15e8e7ef35564dadb3225ac6625da12c03
MD5 b1491ae0c59943764c2d26841a0fc403
BLAKE2b-256 0b0b335f3d25eb2cba820ee0ff91864896b1b0a5777db6b6952882971ee1ec11

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp38-none-win_amd64.whl.

File metadata

  • Download URL: bytewax-0.21.0-cp38-none-win_amd64.whl
  • Upload date:
  • Size: 5.2 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.19

File hashes

Hashes for bytewax-0.21.0-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 4a4384687450ff0d80b76126297b2b9f22ef09c3a480bc16549721181dee1a48
MD5 6f38d84c4c47a0c3d114727c19c1640d
BLAKE2b-256 e74894beb4f3cf11253724fce5edcdb5e1a4cf59e7bdade535884d04448e4160

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp38-cp38-manylinux_2_31_x86_64.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp38-cp38-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 fffebf6ee9ed44f701d16156ce386d2ed2b7d3fe9cf3b381183c49e37ab8639b
MD5 f5c6443d5c286c5cf2d74ab2f63ee25a
BLAKE2b-256 2908db1ddd7261062e95a33865aeaa6066671fd84356f4d371b1e884c57c00db

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 12abe0192d4595569c5f9047e66b8ae1271062575ba9276e1ff378436cad594a
MD5 f6026465a65b7bb8a2183226be555801
BLAKE2b-256 cf893075171e3ee022bd19fee4906aadc20a76692f0d5eaef76ff272c1eb2878

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d0b6b90cba01f9362f210adf3ff41c0b6040e91a83d3ada9672fa21f214f7f69
MD5 a64b5aa603b77de38a73bc022200636c
BLAKE2b-256 6d6bbb08985b701db750df08943e42d231d1770fefae422e7487078e1c00cd24

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 41cdf8278c2b9d8dab3ebd384ab1af73859e0e6cb83ad0d0dcb19ca125a4e3f4
MD5 33e25b9b954a9767ae13e7b6cb2ea218
BLAKE2b-256 c38d281dc720ed6120d92f7080c5828f4d1032c59ee4fa34e2d7d86f5020d73b

See more details on using hashes here.

File details

Details for the file bytewax-0.21.0-cp38-cp38-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for bytewax-0.21.0-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 dd07619f7186c879955ffca2cb15490b9bb924e46770f6e05359294847e0da11
MD5 dc4952d8994bc3fc4322a6a2733fd55c
BLAKE2b-256 83021eca3dfb5de5c94a8336ac26ce318ec7b1779ba4361e30ca52bf63b35511

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