diff --git a/arro3-io/python/arro3/io/_rust.pyi b/arro3-io/python/arro3/io/_rust.pyi index 905297f..8583b4b 100644 --- a/arro3-io/python/arro3/io/_rust.pyi +++ b/arro3-io/python/arro3/io/_rust.pyi @@ -1,18 +1,12 @@ from pathlib import Path -from typing import IO, Protocol, Tuple +from typing import IO, Literal from arro3.core import RecordBatchReader, Schema - -class ArrowSchemaExportable(Protocol): - def __arrow_c_schema__(self) -> object: ... - -class ArrowArrayExportable(Protocol): - def __arrow_c_array__( - self, requested_schema: object | None = None - ) -> Tuple[object, object]: ... - -class ArrowStreamExportable(Protocol): - def __arrow_c_stream__(self, requested_schema: object | None = None) -> object: ... +from arro3.core.types import ( + ArrowSchemaExportable, + ArrowArrayExportable, + ArrowStreamExportable, +) #### CSV @@ -94,7 +88,117 @@ def write_ipc_stream( #### Parquet -def read_parquet(file: Path | str) -> RecordBatchReader: ... +def read_parquet(file: Path | str) -> RecordBatchReader: + """Read a Parquet file to an Arrow RecordBatchReader + + Args: + file: _description_ + + Returns: + _description_ + """ + def write_parquet( - data: ArrowStreamExportable | ArrowArrayExportable, file: IO[bytes] | Path | str -) -> None: ... + data: ArrowStreamExportable | ArrowArrayExportable, + file: IO[bytes] | Path | str, + *, + bloom_filter_enabled: bool | None = None, + bloom_filter_fpp: float | None = None, + bloom_filter_ndv: int | None = None, + compression: Literal[ + "uncompressed", "snappy", "gzip", "lzo", "brotli", "lz4", "zstd", "lz4_raw" + ] + | str + | None = None, + created_by: str | None = None, + data_page_row_count_limit: int | None = None, + data_page_size_limit: int | None = None, + dictionary_enabled: bool | None = None, + dictionary_page_size_limit: int | None = None, + encoding: Literal[ + "plain", + "plain_dictionary", + "rle", + "bit_packed", + "delta_binary_packed", + "delta_length_byte_array", + "delta_byte_array", + "rle_dictionary", + "byte_stream_split", + ] + | None = None, + key_value_metadata: dict[str, str] | None = None, + max_row_group_size: int | None = None, + max_statistics_size: int | None = None, + write_batch_size: int | None = None, + writer_version: Literal["parquet_1_0", "parquet_2_0"] | None = None, +) -> None: + """Write an Arrow Table or stream to a Parquet file. + + Args: + data: The Arrow Table, RecordBatchReader, or RecordBatch to write to Parquet. + file: The output file. + + Keyword Args: + bloom_filter_enabled: Sets if bloom filter is enabled by default for all columns (defaults to `false`). + bloom_filter_fpp: Sets the default target bloom filter false positive probability (fpp) for all columns (defaults to `0.05`). + bloom_filter_ndv: Sets default number of distinct values (ndv) for bloom filter for all columns (defaults to `1_000_000`). + compression: + Sets default compression codec for all columns (default to `uncompressed`). + Note that you can pass in a custom compression level with a string like + `"zstd(3)"` or `"gzip(9)"` or `"brotli(3)"`. + created_by: Sets "created by" property (defaults to `parquet-rs version `). + data_page_row_count_limit: + Sets best effort maximum number of rows in a data page (defaults to + `20_000`). + + The parquet writer will attempt to limit the number of rows in each + `DataPage` to this value. Reducing this value will result in larger parquet + files, but may improve the effectiveness of page index based predicate + pushdown during reading. + + Note: this is a best effort limit based on value of `set_write_batch_size`. + + data_page_size_limit: + Sets best effort maximum size of a data page in bytes (defaults to `1024 * + 1024`). + + The parquet writer will attempt to limit the sizes of each `DataPage` to + this many bytes. Reducing this value will result in larger parquet files, + but may improve the effectiveness of page index based predicate pushdown + during reading. + + Note: this is a best effort limit based on value of `set_write_batch_size`. + dictionary_enabled: Sets default flag to enable/disable dictionary encoding for all columns (defaults to `True`). + dictionary_page_size_limit: + Sets best effort maximum dictionary page size, in bytes (defaults to `1024 * + 1024`). + + The parquet writer will attempt to limit the size of each `DataPage` used to + store dictionaries to this many bytes. Reducing this value will result in + larger parquet files, but may improve the effectiveness of page index based + predicate pushdown during reading. + + Note: this is a best effort limit based on value of `set_write_batch_size`. + + encoding: + Sets default encoding for all columns. + + If dictionary is not enabled, this is treated as a primary encoding for all + columns. In case when dictionary is enabled for any column, this value is + considered to be a fallback encoding for that column. + key_value_metadata: Sets "key_value_metadata" property (defaults to `None`). + max_row_group_size: Sets maximum number of rows in a row group (defaults to `1024 * 1024`). + max_statistics_size: Sets default max statistics size for all columns (defaults to `4096`). + write_batch_size: + Sets write batch size (defaults to 1024). + + For performance reasons, data for each column is written in batches of this + size. + + Additional limits such as such as `set_data_page_row_count_limit` are + checked between batches, and thus the write batch size value acts as an + upper-bound on the enforcement granularity of other limits. + writer_version: Sets the `WriterVersion` written into the parquet metadata (defaults to `"parquet_1_0"`). This value can determine what features some readers will support. + + """ diff --git a/arro3-io/src/parquet.rs b/arro3-io/src/parquet.rs index 693135f..0560495 100644 --- a/arro3-io/src/parquet.rs +++ b/arro3-io/src/parquet.rs @@ -1,6 +1,14 @@ +use std::collections::HashMap; +use std::str::FromStr; + use parquet::arrow::arrow_reader::ParquetRecordBatchReaderBuilder; +use parquet::arrow::arrow_writer::ArrowWriterOptions; use parquet::arrow::ArrowWriter; -use pyo3::exceptions::PyTypeError; +use parquet::basic::{Compression, Encoding}; +use parquet::file::properties::{WriterProperties, WriterVersion}; +use parquet::format::KeyValue; +use parquet::schema::types::ColumnPath; +use pyo3::exceptions::{PyTypeError, PyValueError}; use pyo3::prelude::*; use pyo3_arrow::error::PyArrowResult; use pyo3_arrow::input::AnyRecordBatch; @@ -8,7 +16,6 @@ use pyo3_arrow::PyRecordBatchReader; use crate::utils::{FileReader, FileWriter}; -/// Read a Parquet file to an Arrow RecordBatchReader #[pyfunction] pub fn read_parquet(py: Python, file: FileReader) -> PyArrowResult { match file { @@ -24,11 +31,157 @@ pub fn read_parquet(py: Python, file: FileReader) -> PyArrowResult { } } -/// Write an Arrow Table or stream to a Parquet file +pub(crate) struct PyWriterVersion(WriterVersion); + +impl<'py> FromPyObject<'py> for PyWriterVersion { + fn extract_bound(ob: &Bound<'py, PyAny>) -> PyResult { + let s: String = ob.extract()?; + Ok(Self( + WriterVersion::from_str(&s).map_err(|err| PyValueError::new_err(err.to_string()))?, + )) + } +} + +pub(crate) struct PyCompression(Compression); + +impl<'py> FromPyObject<'py> for PyCompression { + fn extract_bound(ob: &Bound<'py, PyAny>) -> PyResult { + let s: String = ob.extract()?; + Ok(Self( + Compression::from_str(&s).map_err(|err| PyValueError::new_err(err.to_string()))?, + )) + } +} + +#[derive(Debug)] +pub(crate) struct PyEncoding(Encoding); + +impl<'py> FromPyObject<'py> for PyEncoding { + fn extract_bound(ob: &Bound<'py, PyAny>) -> PyResult { + let s: String = ob.extract()?; + Ok(Self( + Encoding::from_str(&s).map_err(|err| PyValueError::new_err(err.to_string()))?, + )) + } +} + +#[derive(Debug)] +#[allow(dead_code)] +pub(crate) struct PyColumnPath(ColumnPath); + +impl<'py> FromPyObject<'py> for PyColumnPath { + fn extract_bound(ob: &Bound<'py, PyAny>) -> PyResult { + if let Ok(path) = ob.extract::() { + Ok(Self(path.into())) + } else if let Ok(path) = ob.extract::>() { + Ok(Self(path.into())) + } else { + Err(PyTypeError::new_err( + "Expected string or list of string input for column path.", + )) + } + } +} + #[pyfunction] -pub fn write_parquet(data: AnyRecordBatch, file: FileWriter) -> PyArrowResult<()> { +#[pyo3(signature=( + data, + file, + *, + bloom_filter_enabled = None, + bloom_filter_fpp = None, + bloom_filter_ndv = None, + compression = None, + created_by = None, + data_page_row_count_limit = None, + data_page_size_limit = None, + dictionary_enabled = None, + dictionary_page_size_limit = None, + encoding = None, + key_value_metadata = None, + max_row_group_size = None, + max_statistics_size = None, + write_batch_size = None, + writer_version = None, +))] +#[allow(clippy::too_many_arguments)] +pub(crate) fn write_parquet( + data: AnyRecordBatch, + file: FileWriter, + bloom_filter_enabled: Option, + bloom_filter_fpp: Option, + bloom_filter_ndv: Option, + compression: Option, + created_by: Option, + data_page_row_count_limit: Option, + data_page_size_limit: Option, + dictionary_enabled: Option, + dictionary_page_size_limit: Option, + encoding: Option, + key_value_metadata: Option>, + max_row_group_size: Option, + max_statistics_size: Option, + write_batch_size: Option, + writer_version: Option, +) -> PyArrowResult<()> { + let mut props = WriterProperties::builder(); + + if let Some(writer_version) = writer_version { + props = props.set_writer_version(writer_version.0); + } + if let Some(data_page_size_limit) = data_page_size_limit { + props = props.set_data_page_size_limit(data_page_size_limit); + } + if let Some(data_page_row_count_limit) = data_page_row_count_limit { + props = props.set_data_page_row_count_limit(data_page_row_count_limit); + } + if let Some(dictionary_page_size_limit) = dictionary_page_size_limit { + props = props.set_dictionary_page_size_limit(dictionary_page_size_limit); + } + if let Some(write_batch_size) = write_batch_size { + props = props.set_write_batch_size(write_batch_size); + } + if let Some(max_row_group_size) = max_row_group_size { + props = props.set_max_row_group_size(max_row_group_size); + } + if let Some(created_by) = created_by { + props = props.set_created_by(created_by); + } + if let Some(key_value_metadata) = key_value_metadata { + props = props.set_key_value_metadata(Some( + key_value_metadata + .into_iter() + .map(|(k, v)| KeyValue::new(k, v)) + .collect(), + )); + } + if let Some(compression) = compression { + props = props.set_compression(compression.0); + } + if let Some(dictionary_enabled) = dictionary_enabled { + props = props.set_dictionary_enabled(dictionary_enabled); + } + if let Some(max_statistics_size) = max_statistics_size { + props = props.set_max_statistics_size(max_statistics_size); + } + if let Some(bloom_filter_enabled) = bloom_filter_enabled { + props = props.set_bloom_filter_enabled(bloom_filter_enabled); + } + if let Some(bloom_filter_fpp) = bloom_filter_fpp { + props = props.set_bloom_filter_fpp(bloom_filter_fpp); + } + if let Some(bloom_filter_ndv) = bloom_filter_ndv { + props = props.set_bloom_filter_ndv(bloom_filter_ndv); + } + if let Some(encoding) = encoding { + props = props.set_encoding(encoding.0); + } + let reader = data.into_reader()?; - let mut writer = ArrowWriter::try_new(file, reader.schema(), None).unwrap(); + + let writer_options = ArrowWriterOptions::new().with_properties(props.build()); + let mut writer = + ArrowWriter::try_new_with_options(file, reader.schema(), writer_options).unwrap(); for batch in reader { writer.write(&batch?).unwrap(); } diff --git a/poetry.lock b/poetry.lock index 407bf1c..0f1e284 100644 --- a/poetry.lock +++ b/poetry.lock @@ -765,51 +765,6 @@ files = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] -[[package]] -name = "numpy" -version = "1.26.4" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = ">=3.9" -files = [ - {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, - {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, - {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, - {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, - {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, - {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, - {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, - {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, - {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, - {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, - {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, -] - [[package]] name = "packaging" version = "24.1" @@ -955,54 +910,6 @@ docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx- test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] type = ["mypy (>=1.8)"] -[[package]] -name = "pyarrow" -version = "15.0.2" -description = "Python library for Apache Arrow" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyarrow-15.0.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:88b340f0a1d05b5ccc3d2d986279045655b1fe8e41aba6ca44ea28da0d1455d8"}, - {file = "pyarrow-15.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eaa8f96cecf32da508e6c7f69bb8401f03745c050c1dd42ec2596f2e98deecac"}, - {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23c6753ed4f6adb8461e7c383e418391b8d8453c5d67e17f416c3a5d5709afbd"}, - {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f639c059035011db8c0497e541a8a45d98a58dbe34dc8fadd0ef128f2cee46e5"}, - {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:290e36a59a0993e9a5224ed2fb3e53375770f07379a0ea03ee2fce2e6d30b423"}, - {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:06c2bb2a98bc792f040bef31ad3e9be6a63d0cb39189227c08a7d955db96816e"}, - {file = "pyarrow-15.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:f7a197f3670606a960ddc12adbe8075cea5f707ad7bf0dffa09637fdbb89f76c"}, - {file = "pyarrow-15.0.2-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:5f8bc839ea36b1f99984c78e06e7a06054693dc2af8920f6fb416b5bca9944e4"}, - {file = "pyarrow-15.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f5e81dfb4e519baa6b4c80410421528c214427e77ca0ea9461eb4097c328fa33"}, - {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a4f240852b302a7af4646c8bfe9950c4691a419847001178662a98915fd7ee7"}, - {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e7d9cfb5a1e648e172428c7a42b744610956f3b70f524aa3a6c02a448ba853e"}, - {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2d4f905209de70c0eb5b2de6763104d5a9a37430f137678edfb9a675bac9cd98"}, - {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:90adb99e8ce5f36fbecbbc422e7dcbcbed07d985eed6062e459e23f9e71fd197"}, - {file = "pyarrow-15.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:b116e7fd7889294cbd24eb90cd9bdd3850be3738d61297855a71ac3b8124ee38"}, - {file = "pyarrow-15.0.2-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:25335e6f1f07fdaa026a61c758ee7d19ce824a866b27bba744348fa73bb5a440"}, - {file = "pyarrow-15.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:90f19e976d9c3d8e73c80be84ddbe2f830b6304e4c576349d9360e335cd627fc"}, - {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a22366249bf5fd40ddacc4f03cd3160f2d7c247692945afb1899bab8a140ddfb"}, - {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2a335198f886b07e4b5ea16d08ee06557e07db54a8400cc0d03c7f6a22f785f"}, - {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e6d459c0c22f0b9c810a3917a1de3ee704b021a5fb8b3bacf968eece6df098f"}, - {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:033b7cad32198754d93465dcfb71d0ba7cb7cd5c9afd7052cab7214676eec38b"}, - {file = "pyarrow-15.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:29850d050379d6e8b5a693098f4de7fd6a2bea4365bfd073d7c57c57b95041ee"}, - {file = "pyarrow-15.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:7167107d7fb6dcadb375b4b691b7e316f4368f39f6f45405a05535d7ad5e5058"}, - {file = "pyarrow-15.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e85241b44cc3d365ef950432a1b3bd44ac54626f37b2e3a0cc89c20e45dfd8bf"}, - {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:248723e4ed3255fcd73edcecc209744d58a9ca852e4cf3d2577811b6d4b59818"}, - {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ff3bdfe6f1b81ca5b73b70a8d482d37a766433823e0c21e22d1d7dde76ca33f"}, - {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:f3d77463dee7e9f284ef42d341689b459a63ff2e75cee2b9302058d0d98fe142"}, - {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:8c1faf2482fb89766e79745670cbca04e7018497d85be9242d5350cba21357e1"}, - {file = "pyarrow-15.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:28f3016958a8e45a1069303a4a4f6a7d4910643fc08adb1e2e4a7ff056272ad3"}, - {file = "pyarrow-15.0.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:89722cb64286ab3d4daf168386f6968c126057b8c7ec3ef96302e81d8cdb8ae4"}, - {file = "pyarrow-15.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cd0ba387705044b3ac77b1b317165c0498299b08261d8122c96051024f953cd5"}, - {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad2459bf1f22b6a5cdcc27ebfd99307d5526b62d217b984b9f5c974651398832"}, - {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58922e4bfece8b02abf7159f1f53a8f4d9f8e08f2d988109126c17c3bb261f22"}, - {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:adccc81d3dc0478ea0b498807b39a8d41628fa9210729b2f718b78cb997c7c91"}, - {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:8bd2baa5fe531571847983f36a30ddbf65261ef23e496862ece83bdceb70420d"}, - {file = "pyarrow-15.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6669799a1d4ca9da9c7e06ef48368320f5856f36f9a4dd31a11839dda3f6cc8c"}, - {file = "pyarrow-15.0.2.tar.gz", hash = "sha256:9c9bc803cb3b7bfacc1e96ffbfd923601065d9d3f911179d81e72d99fd74a3d9"}, -] - -[package.dependencies] -numpy = ">=1.16.6,<2" - [[package]] name = "pycparser" version = "2.22" @@ -1411,4 +1318,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "1dda6027191e955040513dc7744c0d25524339472333a876b15f19b9f38a312a" +content-hash = "01a7d338472d50dd26903b35dc691f2d41cc83bfe3c416124590a9a861ffacfb" diff --git a/pyproject.toml b/pyproject.toml index aac5745..e39de90 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,8 +14,6 @@ mkdocstrings = { version = "^0.25.1", extras = ["python"] } # https://github.com/squidfunk/mkdocs-material/issues/6983 mkdocs-material = { version = "^9.5.17", extras = ["imaging"] } mike = "^2" -pyarrow = "^15.0.0" - [tool.poetry.group.dev.dependencies] maturin = "^1.4.0"