From 810cd3c898a2cf8fbcb2948fc4e27d4db986ba5a Mon Sep 17 00:00:00 2001 From: Keith Kraus Date: Wed, 6 Nov 2019 13:44:15 -0800 Subject: [PATCH 01/19] add orc reader --- pandas/__init__.py | 1 + pandas/core/config_init.py | 16 + pandas/io/api.py | 1 + pandas/io/orc.py | 126 ++++++++ .../tests/io/data/orc/TestOrcFile.decimal.orc | Bin 0 -> 16337 bytes .../io/data/orc/TestOrcFile.emptyFile.orc | Bin 0 -> 523 bytes .../tests/io/data/orc/TestOrcFile.test1.orc | Bin 0 -> 1711 bytes .../io/data/orc/TestOrcFile.testDate1900.orc | Bin 0 -> 30941 bytes .../io/data/orc/TestOrcFile.testDate2038.orc | Bin 0 -> 95787 bytes .../io/data/orc/TestOrcFile.testSnappy.orc | Bin 0 -> 126370 bytes pandas/tests/io/test_orc.py | 279 ++++++++++++++++++ 11 files changed, 423 insertions(+) create mode 100644 pandas/io/orc.py create mode 100644 pandas/tests/io/data/orc/TestOrcFile.decimal.orc create mode 100644 pandas/tests/io/data/orc/TestOrcFile.emptyFile.orc create mode 100644 pandas/tests/io/data/orc/TestOrcFile.test1.orc create mode 100644 pandas/tests/io/data/orc/TestOrcFile.testDate1900.orc create mode 100644 pandas/tests/io/data/orc/TestOrcFile.testDate2038.orc create mode 100644 pandas/tests/io/data/orc/TestOrcFile.testSnappy.orc create mode 100644 pandas/tests/io/test_orc.py diff --git a/pandas/__init__.py b/pandas/__init__.py index a60aa08b89f84..f72a12b58edcb 100644 --- a/pandas/__init__.py +++ b/pandas/__init__.py @@ -168,6 +168,7 @@ # misc read_clipboard, read_parquet, + read_orc, read_feather, read_gbq, read_html, diff --git a/pandas/core/config_init.py b/pandas/core/config_init.py index ba0a4d81a88d3..63e069f4da69d 100644 --- a/pandas/core/config_init.py +++ b/pandas/core/config_init.py @@ -568,6 +568,22 @@ def use_inf_as_na_cb(key): validator=is_one_of_factory(["auto", "pyarrow", "fastparquet"]), ) + +# Set up the io.orc specific configuration. +orc_engine_doc = """ +: string + The default orc reader/writer engine. Available options: + 'auto', 'pyarrow', the default is 'auto' +""" + +with cf.config_prefix("io.orc"): + cf.register_option( + "engine", + "auto", + orc_engine_doc, + validator=is_one_of_factory(["auto", "pyarrow"]), + ) + # -------- # Plotting # --------- diff --git a/pandas/io/api.py b/pandas/io/api.py index 725e82604ca7f..e20aa18324a34 100644 --- a/pandas/io/api.py +++ b/pandas/io/api.py @@ -10,6 +10,7 @@ from pandas.io.gbq import read_gbq from pandas.io.html import read_html from pandas.io.json import read_json +from pandas.io.orc import read_orc from pandas.io.packers import read_msgpack, to_msgpack from pandas.io.parquet import read_parquet from pandas.io.parsers import read_csv, read_fwf, read_table diff --git a/pandas/io/orc.py b/pandas/io/orc.py new file mode 100644 index 0000000000000..abc3830d8d627 --- /dev/null +++ b/pandas/io/orc.py @@ -0,0 +1,126 @@ +""" orc compat """ + +from warnings import catch_warnings + +from pandas.compat._optional import import_optional_dependency +from pandas.errors import AbstractMethodError + +from pandas import DataFrame, get_option + +from pandas.io.common import get_filepath_or_buffer, is_gcs_url, is_s3_url + + +def get_engine(engine): + """ return our implementation """ + + if engine == "auto": + engine = get_option("io.orc.engine") + + if engine == "auto": + # try engines in this order + try: + return PyArrowImpl() + except ImportError: + pass + + raise ImportError( + "Unable to find a usable engine; " + "tried using: 'pyarrow'.\n" + "pyarrow is required for orc " + "support" + ) + + if engine not in ["pyarrow"]: + raise ValueError("engine must be 'pyarrow'") + + if engine == "pyarrow": + return PyArrowImpl() + + +class BaseImpl: + + api = None # module + + @staticmethod + def validate_dataframe(df): + + if not isinstance(df, DataFrame): + raise ValueError("to_orc only supports IO with DataFrames") + + # must have value column names (strings only) + if df.columns.inferred_type not in {"string", "unicode", "empty"}: + raise ValueError("ORC must have string column names") + + # index level names must be strings + valid_names = all( + isinstance(name, str) for name in df.index.names if name is not None + ) + if not valid_names: + raise ValueError("Index level names must be strings") + + def write(self, df, path, compression, **kwargs): + raise AbstractMethodError(self) + + def read(self, path, columns=None, **kwargs): + raise AbstractMethodError(self) + + +class PyArrowImpl(BaseImpl): + def __init__(self): + pyarrow = import_optional_dependency( + "pyarrow", extra="pyarrow is required for orc support." + ) + import pyarrow.orc + + self.api = pyarrow + + def read(self, path, columns=None, **kwargs): + path, _, _, _ = get_filepath_or_buffer(path) + + py_file = self.api.input_stream(path) + orc_file = self.api.orc.ORCFile(py_file) + + result = orc_file.read( + columns=columns, **kwargs + ).to_pandas() + + return result + + +def read_orc(path, engine="auto", columns=None, **kwargs): + """ + Load an ORC object from the file path, returning a DataFrame. + + .. versionadded:: 0.21.0 + + Parameters + ---------- + path : str, path object or file-like object + Any valid string path is acceptable. The string could be a URL. Valid + URL schemes include http, ftp, s3, and file. For file URLs, a host is + expected. A local file could be: + ``file://localhost/path/to/table.orc``. + + If you want to pass in a path object, pandas accepts any + ``os.PathLike``. + + By file-like object, we refer to objects with a ``read()`` method, + such as a file handler (e.g. via builtin ``open`` function) + or ``StringIO``. + engine : {'auto', 'pyarrow'}, default 'auto' + ORC library to use. If 'auto', then the option ``io.orc.engine`` is + used. The default ``io.orc.engine`` behavior is to try 'pyarrow'. + columns : list, default=None + If not None, only these columns will be read from the file. + + .. versionadded:: 0.21.1 + **kwargs + Any additional kwargs are passed to the engine. + + Returns + ------- + DataFrame + """ + + impl = get_engine(engine) + return impl.read(path, columns=columns, **kwargs) diff --git a/pandas/tests/io/data/orc/TestOrcFile.decimal.orc b/pandas/tests/io/data/orc/TestOrcFile.decimal.orc new file mode 100644 index 0000000000000000000000000000000000000000..cb0f7b9d767a37159c5509da1a47877d1c8b411e GIT binary patch literal 16337 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
y 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 literal 0 HcmV?d00001 diff --git a/pandas/tests/io/data/orc/TestOrcFile.testDate1900.orc b/pandas/tests/io/data/orc/TestOrcFile.testDate1900.orc new file mode 100644 index 0000000000000000000000000000000000000000..f51ffdbd03a43fadbedce302ffa8e5967a30ad59 GIT binary patch literal 30941 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 Q3Hk6I?h+6vtI5#+2fmTVNdN!< literal 0 HcmV?d00001 diff --git a/pandas/tests/io/data/orc/TestOrcFile.testSnappy.orc b/pandas/tests/io/data/orc/TestOrcFile.testSnappy.orc new file mode 100644 index 0000000000000000000000000000000000000000..aa6cc9c9ba1a7284bee1d70f186d212d8659b3ef GIT binary patch literal 126370 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 qc$ Date: Wed, 6 Nov 2019 13:46:09 -0800 Subject: [PATCH 02/19] black --- pandas/io/orc.py | 4 +--- pandas/tests/io/test_orc.py | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/pandas/io/orc.py b/pandas/io/orc.py index abc3830d8d627..3f56bf55d955f 100644 --- a/pandas/io/orc.py +++ b/pandas/io/orc.py @@ -80,9 +80,7 @@ def read(self, path, columns=None, **kwargs): py_file = self.api.input_stream(path) orc_file = self.api.orc.ORCFile(py_file) - result = orc_file.read( - columns=columns, **kwargs - ).to_pandas() + result = orc_file.read(columns=columns, **kwargs).to_pandas() return result diff --git a/pandas/tests/io/test_orc.py b/pandas/tests/io/test_orc.py index cd8b4d648b7f7..b2f149bc31c84 100644 --- a/pandas/tests/io/test_orc.py +++ b/pandas/tests/io/test_orc.py @@ -111,9 +111,7 @@ def test_orc_reader_basic(dirpath, engine): "byte1": np.array([1, 100], dtype="int8"), "short1": np.array([1024, 2048], dtype="int16"), "int1": np.array([65536, 65536], dtype="int32"), - "long1": np.array( - [9223372036854775807, 9223372036854775807], dtype="int64" - ), + "long1": np.array([9223372036854775807, 9223372036854775807], dtype="int64"), "float1": np.array([1.0, 2.0], dtype="float32"), "double1": np.array([-15.0, -5.0], dtype="float64"), "bytes1": np.array([b"\x00\x01\x02\x03\x04", b""], dtype="object"), From 21ada9f3a3fb1611bafec686983432309b9e8193 Mon Sep 17 00:00:00 2001 From: Keith Kraus Date: Wed, 6 Nov 2019 13:50:21 -0800 Subject: [PATCH 03/19] flake8 and more black --- pandas/io/orc.py | 4 +--- pandas/tests/io/test_orc.py | 22 ++++++++-------------- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/pandas/io/orc.py b/pandas/io/orc.py index 3f56bf55d955f..6db7f75e372e6 100644 --- a/pandas/io/orc.py +++ b/pandas/io/orc.py @@ -1,13 +1,11 @@ """ orc compat """ -from warnings import catch_warnings - from pandas.compat._optional import import_optional_dependency from pandas.errors import AbstractMethodError from pandas import DataFrame, get_option -from pandas.io.common import get_filepath_or_buffer, is_gcs_url, is_s3_url +from pandas.io.common import get_filepath_or_buffer def get_engine(engine): diff --git a/pandas/tests/io/test_orc.py b/pandas/tests/io/test_orc.py index b2f149bc31c84..90cf0a6e08cb9 100644 --- a/pandas/tests/io/test_orc.py +++ b/pandas/tests/io/test_orc.py @@ -1,17 +1,11 @@ """ test orc compat """ import datetime -from distutils.version import LooseVersion import os -from warnings import catch_warnings import numpy as np -import pytest - -import pandas.util._test_decorators as td - import pandas as pd import pandas.util.testing as tm - +import pytest from pandas.io.orc import PyArrowImpl, get_engine, read_orc try: @@ -69,7 +63,7 @@ def test_invalid_engine(dirpath): inputfile = os.path.join(dirpath, "TestOrcFile.emptyFile.orc") engine = "foo" with pytest.raises(ValueError): - pd.read_orc(inputfile, engine=engine, columns=["boolean1"]) + read_orc(inputfile, engine=engine, columns=["boolean1"]) def test_orc_reader_empty(dirpath, engine): @@ -100,7 +94,7 @@ def test_orc_reader_empty(dirpath, engine): expected[colname] = pd.Series(dtype=dtype) inputfile = os.path.join(dirpath, "TestOrcFile.emptyFile.orc") - got = pd.read_orc(inputfile, engine=engine, columns=columns) + got = read_orc(inputfile, engine=engine, columns=columns) tm.assert_equal(expected, got) @@ -120,7 +114,7 @@ def test_orc_reader_basic(dirpath, engine): expected = pd.DataFrame.from_dict(data) inputfile = os.path.join(dirpath, "TestOrcFile.test1.orc") - got = pd.read_orc(inputfile, engine=engine, columns=data.keys()) + got = read_orc(inputfile, engine=engine, columns=data.keys()) tm.assert_equal(expected, got) @@ -149,7 +143,7 @@ def test_orc_reader_decimal(dirpath, engine): expected = pd.DataFrame.from_dict(data) inputfile = os.path.join(dirpath, "TestOrcFile.decimal.orc") - got = pd.read_orc(inputfile, engine=engine).iloc[:10] + got = read_orc(inputfile, engine=engine).iloc[:10] tm.assert_equal(expected, got) @@ -190,7 +184,7 @@ def test_orc_reader_date_low(dirpath, engine): expected = pd.DataFrame.from_dict(data) inputfile = os.path.join(dirpath, "TestOrcFile.testDate1900.orc") - got = pd.read_orc(inputfile, engine=engine).iloc[:10] + got = read_orc(inputfile, engine=engine).iloc[:10] tm.assert_equal(expected, got) @@ -231,7 +225,7 @@ def test_orc_reader_date_high(dirpath, engine): expected = pd.DataFrame.from_dict(data) inputfile = os.path.join(dirpath, "TestOrcFile.testDate2038.orc") - got = pd.read_orc(inputfile, engine=engine).iloc[:10] + got = read_orc(inputfile, engine=engine).iloc[:10] tm.assert_equal(expected, got) @@ -272,6 +266,6 @@ def test_orc_reader_snappy_compressed(dirpath, engine): expected = pd.DataFrame.from_dict(data) inputfile = os.path.join(dirpath, "TestOrcFile.testSnappy.orc") - got = pd.read_orc(inputfile, engine=engine).iloc[:10] + got = read_orc(inputfile, engine=engine).iloc[:10] tm.assert_equal(expected, got) From 39518dad49ff7134352470692bfa5b60a870941e Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Sun, 17 Nov 2019 08:19:12 -0500 Subject: [PATCH 04/19] update docs --- doc/source/getting_started/install.rst | 2 +- doc/source/user_guide/io.rst | 4 +--- pandas/io/orc.py | 4 +--- pandas/tests/api/test_api.py | 1 + 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/doc/source/getting_started/install.rst b/doc/source/getting_started/install.rst index 9f3ab22496ae7..2591038febbe8 100644 --- a/doc/source/getting_started/install.rst +++ b/doc/source/getting_started/install.rst @@ -258,7 +258,7 @@ matplotlib 2.2.2 Visualization openpyxl 2.4.8 Reading / writing for xlsx files pandas-gbq 0.8.0 Google Big Query access psycopg2 PostgreSQL engine for sqlalchemy -pyarrow 0.12.0 Parquet and feather reading / writing +pyarrow 0.12.0 Parquet, ORC, and feather reading / writing pymysql 0.7.11 MySQL engine for sqlalchemy pyreadstat SPSS files (.sav) reading pytables 3.4.2 HDF5 reading / writing diff --git a/doc/source/user_guide/io.rst b/doc/source/user_guide/io.rst index fa47a5944f7bf..98b658f6b8a47 100644 --- a/doc/source/user_guide/io.rst +++ b/doc/source/user_guide/io.rst @@ -28,6 +28,7 @@ The pandas I/O API is a set of top level ``reader`` functions accessed like binary;`HDF5 Format `__;:ref:`read_hdf`;:ref:`to_hdf` binary;`Feather Format `__;:ref:`read_feather`;:ref:`to_feather` binary;`Parquet Format `__;:ref:`read_parquet`;:ref:`to_parquet` + binary;`ORC Format `__;:ref:`read_orc`; binary;`Msgpack `__;:ref:`read_msgpack`;:ref:`to_msgpack` binary;`Stata `__;:ref:`read_stata`;:ref:`to_stata` binary;`SAS `__;:ref:`read_sas`; @@ -5761,6 +5762,3 @@ Space on disk (in bytes) 24009288 Oct 10 06:43 test_fixed_compress.hdf 24458940 Oct 10 06:44 test_table.hdf 24458940 Oct 10 06:44 test_table_compress.hdf - - - diff --git a/pandas/io/orc.py b/pandas/io/orc.py index 6db7f75e372e6..5f09d42d83f8f 100644 --- a/pandas/io/orc.py +++ b/pandas/io/orc.py @@ -87,7 +87,7 @@ def read_orc(path, engine="auto", columns=None, **kwargs): """ Load an ORC object from the file path, returning a DataFrame. - .. versionadded:: 0.21.0 + .. versionadded:: 1.0.0 Parameters ---------- @@ -108,8 +108,6 @@ def read_orc(path, engine="auto", columns=None, **kwargs): used. The default ``io.orc.engine`` behavior is to try 'pyarrow'. columns : list, default=None If not None, only these columns will be read from the file. - - .. versionadded:: 0.21.1 **kwargs Any additional kwargs are passed to the engine. diff --git a/pandas/tests/api/test_api.py b/pandas/tests/api/test_api.py index 76141dceae930..870d7fd6e44c1 100644 --- a/pandas/tests/api/test_api.py +++ b/pandas/tests/api/test_api.py @@ -167,6 +167,7 @@ class TestPDApi(Base): "read_table", "read_feather", "read_parquet", + "read_orc", "read_spss", ] From f4e4eb5a1c126c7c59112639389f8fb7d97946b6 Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Sun, 17 Nov 2019 09:14:02 -0500 Subject: [PATCH 05/19] use min version of pyarrow --- pandas/io/orc.py | 9 +++++++++ pandas/tests/io/test_orc.py | 8 +++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/pandas/io/orc.py b/pandas/io/orc.py index 5f09d42d83f8f..88dd12a343d06 100644 --- a/pandas/io/orc.py +++ b/pandas/io/orc.py @@ -1,5 +1,7 @@ """ orc compat """ +import distutils + from pandas.compat._optional import import_optional_dependency from pandas.errors import AbstractMethodError @@ -68,6 +70,13 @@ def __init__(self): pyarrow = import_optional_dependency( "pyarrow", extra="pyarrow is required for orc support." ) + + # we require a newer version of pyarrow that we support for parquet + import pyarrow + + if distutils.version.LooseVersion(pyarrow.__version__) < "0.13.0": + raise ImportError("pyarrow must be >= 0.13.0 for read_orc") + import pyarrow.orc self.api = pyarrow diff --git a/pandas/tests/io/test_orc.py b/pandas/tests/io/test_orc.py index 90cf0a6e08cb9..4e7142d25369a 100644 --- a/pandas/tests/io/test_orc.py +++ b/pandas/tests/io/test_orc.py @@ -1,16 +1,22 @@ """ test orc compat """ import datetime +import distutils import os import numpy as np +import pytest + import pandas as pd import pandas.util.testing as tm -import pytest + from pandas.io.orc import PyArrowImpl, get_engine, read_orc try: import pyarrow # noqa + if distutils.version.LooseVersion(pyarrow.__version__) < "0.13.0": + raise ImportError("pyarrow must be >= 0.13.0 for read_orc") + _HAVE_PYARROW = True except ImportError: _HAVE_PYARROW = False From 1fe30e9a324283b18b48d15d07ff0c4851629712 Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Sun, 17 Nov 2019 18:20:37 -0500 Subject: [PATCH 06/19] update doc-links & add typing --- doc/source/reference/io.rst | 7 +++++++ doc/source/user_guide/io.rst | 14 ++++++++++++++ pandas/io/orc.py | 23 +++++++++++++++++------ 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/doc/source/reference/io.rst b/doc/source/reference/io.rst index 91f4942d03b0d..6d2d405a15850 100644 --- a/doc/source/reference/io.rst +++ b/doc/source/reference/io.rst @@ -98,6 +98,13 @@ Parquet read_parquet +ORC +~~~ +.. autosummary:: + :toctree: api/ + + read_orc + SAS ~~~ .. autosummary:: diff --git a/doc/source/user_guide/io.rst b/doc/source/user_guide/io.rst index 98b658f6b8a47..cd38b0b65cd24 100644 --- a/doc/source/user_guide/io.rst +++ b/doc/source/user_guide/io.rst @@ -4859,6 +4859,20 @@ The above example creates a partitioned dataset that may look like: except OSError: pass +.. _io.orc: + +ORC +--- + +.. versionadded:: 1.0.0 + +Similar to the `parquet ` format, the `ORC Format `__ binary columnar serialization +for data frames. It is designed to make reading data frames efficient. Pandas provides *only* a reader for the +ORC format, :func:`~pandas.read_orc`. + +See the documentation for `pyarrow `__ for more. + + .. _io.sql: SQL queries diff --git a/pandas/io/orc.py b/pandas/io/orc.py index 88dd12a343d06..125610089f56e 100644 --- a/pandas/io/orc.py +++ b/pandas/io/orc.py @@ -1,16 +1,18 @@ """ orc compat """ import distutils +from typing import List, Optional from pandas.compat._optional import import_optional_dependency from pandas.errors import AbstractMethodError from pandas import DataFrame, get_option +from pandas._typing import FilePathOrBuffer from pandas.io.common import get_filepath_or_buffer -def get_engine(engine): +def get_engine(engine: str) -> "PyArrowImpl": """ return our implementation """ if engine == "auto": @@ -42,7 +44,7 @@ class BaseImpl: api = None # module @staticmethod - def validate_dataframe(df): + def validate_dataframe(df: DataFrame): if not isinstance(df, DataFrame): raise ValueError("to_orc only supports IO with DataFrames") @@ -58,10 +60,12 @@ def validate_dataframe(df): if not valid_names: raise ValueError("Index level names must be strings") - def write(self, df, path, compression, **kwargs): + def write(self, df: DataFrame, path: FilePathOrBuffer, compression: str, **kwargs): raise AbstractMethodError(self) - def read(self, path, columns=None, **kwargs): + def read( + self, path: FilePathOrBuffer, columns: Optional[List[str]] = None, **kwargs + ): raise AbstractMethodError(self) @@ -81,7 +85,9 @@ def __init__(self): self.api = pyarrow - def read(self, path, columns=None, **kwargs): + def read( + self, path: FilePathOrBuffer, columns: Optional[List[str]] = None, **kwargs + ) -> DataFrame: path, _, _, _ = get_filepath_or_buffer(path) py_file = self.api.input_stream(path) @@ -92,7 +98,12 @@ def read(self, path, columns=None, **kwargs): return result -def read_orc(path, engine="auto", columns=None, **kwargs): +def read_orc( + path: FilePathOrBuffer, + engine: str = "auto", + columns: Optional[List[str]] = None, + **kwargs, +): """ Load an ORC object from the file path, returning a DataFrame. From 5582a09771bd3c66c99e0785ae7c6f6551fc9d20 Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Sun, 17 Nov 2019 18:26:52 -0500 Subject: [PATCH 07/19] simplify --- pandas/io/orc.py | 38 +++----------------------------------- 1 file changed, 3 insertions(+), 35 deletions(-) diff --git a/pandas/io/orc.py b/pandas/io/orc.py index 125610089f56e..e1bfad77afbba 100644 --- a/pandas/io/orc.py +++ b/pandas/io/orc.py @@ -4,7 +4,6 @@ from typing import List, Optional from pandas.compat._optional import import_optional_dependency -from pandas.errors import AbstractMethodError from pandas import DataFrame, get_option from pandas._typing import FilePathOrBuffer @@ -35,47 +34,16 @@ def get_engine(engine: str) -> "PyArrowImpl": if engine not in ["pyarrow"]: raise ValueError("engine must be 'pyarrow'") - if engine == "pyarrow": - return PyArrowImpl() + return PyArrowImpl() -class BaseImpl: - - api = None # module - - @staticmethod - def validate_dataframe(df: DataFrame): - - if not isinstance(df, DataFrame): - raise ValueError("to_orc only supports IO with DataFrames") - - # must have value column names (strings only) - if df.columns.inferred_type not in {"string", "unicode", "empty"}: - raise ValueError("ORC must have string column names") - - # index level names must be strings - valid_names = all( - isinstance(name, str) for name in df.index.names if name is not None - ) - if not valid_names: - raise ValueError("Index level names must be strings") - - def write(self, df: DataFrame, path: FilePathOrBuffer, compression: str, **kwargs): - raise AbstractMethodError(self) - - def read( - self, path: FilePathOrBuffer, columns: Optional[List[str]] = None, **kwargs - ): - raise AbstractMethodError(self) - - -class PyArrowImpl(BaseImpl): +class PyArrowImpl: def __init__(self): pyarrow = import_optional_dependency( "pyarrow", extra="pyarrow is required for orc support." ) - # we require a newer version of pyarrow that we support for parquet + # we require a newer version of pyarrow thaN we support for parquet import pyarrow if distutils.version.LooseVersion(pyarrow.__version__) < "0.13.0": From 0d027e93d388ebda842ae4dc2fc8734f777bc00a Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Sun, 17 Nov 2019 19:17:15 -0500 Subject: [PATCH 08/19] skip tests on windows --- pandas/tests/io/test_orc.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pandas/tests/io/test_orc.py b/pandas/tests/io/test_orc.py index 4e7142d25369a..b0c709f3b41a3 100644 --- a/pandas/tests/io/test_orc.py +++ b/pandas/tests/io/test_orc.py @@ -6,6 +6,8 @@ import numpy as np import pytest +from pandas.compat import is_platform_windows + import pandas as pd import pandas.util.testing as tm @@ -50,6 +52,8 @@ def engine(request): def pa(): if not _HAVE_PYARROW: pytest.skip("pyarrow is not installed") + if is_platform_windows(): + pytest.skip("pyarrow orc not available by default on windows") return "pyarrow" From a4284d197394a8fed4447341bfe6da3f35b68c0e Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Mon, 18 Nov 2019 08:42:22 -0500 Subject: [PATCH 09/19] actually skip on windows --- pandas/tests/io/test_orc.py | 39 ++++++++++++------------------------- 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/pandas/tests/io/test_orc.py b/pandas/tests/io/test_orc.py index b0c709f3b41a3..fbc24b795cd74 100644 --- a/pandas/tests/io/test_orc.py +++ b/pandas/tests/io/test_orc.py @@ -33,21 +33,6 @@ def dirpath(datapath): return datapath("io", "data", "orc") -# setup engines & skips -@pytest.fixture( - params=[ - pytest.param( - "pyarrow", - marks=pytest.mark.skipif( - not _HAVE_PYARROW, reason="pyarrow is not installed" - ), - ) - ] -) -def engine(request): - return request.param - - @pytest.fixture def pa(): if not _HAVE_PYARROW: @@ -76,7 +61,7 @@ def test_invalid_engine(dirpath): read_orc(inputfile, engine=engine, columns=["boolean1"]) -def test_orc_reader_empty(dirpath, engine): +def test_orc_reader_empty(dirpath, pa): columns = [ "boolean1", "byte1", @@ -104,12 +89,12 @@ def test_orc_reader_empty(dirpath, engine): expected[colname] = pd.Series(dtype=dtype) inputfile = os.path.join(dirpath, "TestOrcFile.emptyFile.orc") - got = read_orc(inputfile, engine=engine, columns=columns) + got = read_orc(inputfile, columns=columns) tm.assert_equal(expected, got) -def test_orc_reader_basic(dirpath, engine): +def test_orc_reader_basic(dirpath, pa): data = { "boolean1": np.array([False, True], dtype="bool"), "byte1": np.array([1, 100], dtype="int8"), @@ -124,12 +109,12 @@ def test_orc_reader_basic(dirpath, engine): expected = pd.DataFrame.from_dict(data) inputfile = os.path.join(dirpath, "TestOrcFile.test1.orc") - got = read_orc(inputfile, engine=engine, columns=data.keys()) + got = read_orc(inputfile, columns=data.keys()) tm.assert_equal(expected, got) -def test_orc_reader_decimal(dirpath, engine): +def test_orc_reader_decimal(dirpath, pa): from decimal import Decimal # Only testing the first 10 rows of data @@ -153,12 +138,12 @@ def test_orc_reader_decimal(dirpath, engine): expected = pd.DataFrame.from_dict(data) inputfile = os.path.join(dirpath, "TestOrcFile.decimal.orc") - got = read_orc(inputfile, engine=engine).iloc[:10] + got = read_orc(inputfile).iloc[:10] tm.assert_equal(expected, got) -def test_orc_reader_date_low(dirpath, engine): +def test_orc_reader_date_low(dirpath, pa): data = { "time": np.array( [ @@ -194,12 +179,12 @@ def test_orc_reader_date_low(dirpath, engine): expected = pd.DataFrame.from_dict(data) inputfile = os.path.join(dirpath, "TestOrcFile.testDate1900.orc") - got = read_orc(inputfile, engine=engine).iloc[:10] + got = read_orc(inputfile).iloc[:10] tm.assert_equal(expected, got) -def test_orc_reader_date_high(dirpath, engine): +def test_orc_reader_date_high(dirpath, pa): data = { "time": np.array( [ @@ -235,12 +220,12 @@ def test_orc_reader_date_high(dirpath, engine): expected = pd.DataFrame.from_dict(data) inputfile = os.path.join(dirpath, "TestOrcFile.testDate2038.orc") - got = read_orc(inputfile, engine=engine).iloc[:10] + got = read_orc(inputfile).iloc[:10] tm.assert_equal(expected, got) -def test_orc_reader_snappy_compressed(dirpath, engine): +def test_orc_reader_snappy_compressed(dirpath, pa): data = { "int1": np.array( [ @@ -276,6 +261,6 @@ def test_orc_reader_snappy_compressed(dirpath, engine): expected = pd.DataFrame.from_dict(data) inputfile = os.path.join(dirpath, "TestOrcFile.testSnappy.orc") - got = read_orc(inputfile, engine=engine).iloc[:10] + got = read_orc(inputfile).iloc[:10] tm.assert_equal(expected, got) From 25cf714198ed3100e4a41a8a7a4f19d3cbccfb7e Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Sun, 1 Dec 2019 16:58:08 -0500 Subject: [PATCH 10/19] simplify imports --- pandas/io/orc.py | 37 +++++++++++------------------------- pandas/tests/io/test_orc.py | 38 +++++++++---------------------------- 2 files changed, 20 insertions(+), 55 deletions(-) diff --git a/pandas/io/orc.py b/pandas/io/orc.py index e1bfad77afbba..4265edc48cb4f 100644 --- a/pandas/io/orc.py +++ b/pandas/io/orc.py @@ -1,6 +1,5 @@ """ orc compat """ -import distutils from typing import List, Optional from pandas.compat._optional import import_optional_dependency @@ -12,28 +11,13 @@ def get_engine(engine: str) -> "PyArrowImpl": - """ return our implementation """ + """ return our implementation; we only support a pyarrow impl """ if engine == "auto": engine = get_option("io.orc.engine") - if engine == "auto": - # try engines in this order - try: - return PyArrowImpl() - except ImportError: - pass - - raise ImportError( - "Unable to find a usable engine; " - "tried using: 'pyarrow'.\n" - "pyarrow is required for orc " - "support" - ) - if engine not in ["pyarrow"]: raise ValueError("engine must be 'pyarrow'") - return PyArrowImpl() @@ -43,12 +27,15 @@ def __init__(self): "pyarrow", extra="pyarrow is required for orc support." ) - # we require a newer version of pyarrow thaN we support for parquet - import pyarrow - - if distutils.version.LooseVersion(pyarrow.__version__) < "0.13.0": - raise ImportError("pyarrow must be >= 0.13.0 for read_orc") - + try: + import pyarrow + except ImportError: + raise ImportError( + "Unable to find a usable engine; " + "tried using: 'pyarrow'.\n" + "pyarrow is required for orc " + "support" + ) import pyarrow.orc self.api = pyarrow @@ -57,9 +44,7 @@ def read( self, path: FilePathOrBuffer, columns: Optional[List[str]] = None, **kwargs ) -> DataFrame: path, _, _, _ = get_filepath_or_buffer(path) - - py_file = self.api.input_stream(path) - orc_file = self.api.orc.ORCFile(py_file) + orc_file = self.api.orc.ORCFile(path) result = orc_file.read(columns=columns, **kwargs).to_pandas() diff --git a/pandas/tests/io/test_orc.py b/pandas/tests/io/test_orc.py index fbc24b795cd74..2d15c699bf8e1 100644 --- a/pandas/tests/io/test_orc.py +++ b/pandas/tests/io/test_orc.py @@ -1,27 +1,17 @@ """ test orc compat """ import datetime -import distutils +from decimal import Decimal import os import numpy as np import pytest -from pandas.compat import is_platform_windows - import pandas as pd import pandas.util.testing as tm from pandas.io.orc import PyArrowImpl, get_engine, read_orc -try: - import pyarrow # noqa - - if distutils.version.LooseVersion(pyarrow.__version__) < "0.13.0": - raise ImportError("pyarrow must be >= 0.13.0 for read_orc") - - _HAVE_PYARROW = True -except ImportError: - _HAVE_PYARROW = False +pyarrow = pytest.importorskip("pyarrow") pytestmark = pytest.mark.filterwarnings( "ignore:RangeIndex.* is deprecated:DeprecationWarning" @@ -33,16 +23,7 @@ def dirpath(datapath): return datapath("io", "data", "orc") -@pytest.fixture -def pa(): - if not _HAVE_PYARROW: - pytest.skip("pyarrow is not installed") - if is_platform_windows(): - pytest.skip("pyarrow orc not available by default on windows") - return "pyarrow" - - -def test_options_get_engine(pa): +def test_options_get_engine(): assert isinstance(get_engine("pyarrow"), PyArrowImpl) with pd.option_context("io.orc.engine", "pyarrow"): @@ -61,7 +42,7 @@ def test_invalid_engine(dirpath): read_orc(inputfile, engine=engine, columns=["boolean1"]) -def test_orc_reader_empty(dirpath, pa): +def test_orc_reader_empty(dirpath): columns = [ "boolean1", "byte1", @@ -94,7 +75,7 @@ def test_orc_reader_empty(dirpath, pa): tm.assert_equal(expected, got) -def test_orc_reader_basic(dirpath, pa): +def test_orc_reader_basic(dirpath): data = { "boolean1": np.array([False, True], dtype="bool"), "byte1": np.array([1, 100], dtype="int8"), @@ -114,8 +95,7 @@ def test_orc_reader_basic(dirpath, pa): tm.assert_equal(expected, got) -def test_orc_reader_decimal(dirpath, pa): - from decimal import Decimal +def test_orc_reader_decimal(dirpath): # Only testing the first 10 rows of data data = { @@ -143,7 +123,7 @@ def test_orc_reader_decimal(dirpath, pa): tm.assert_equal(expected, got) -def test_orc_reader_date_low(dirpath, pa): +def test_orc_reader_date_low(dirpath): data = { "time": np.array( [ @@ -184,7 +164,7 @@ def test_orc_reader_date_low(dirpath, pa): tm.assert_equal(expected, got) -def test_orc_reader_date_high(dirpath, pa): +def test_orc_reader_date_high(dirpath): data = { "time": np.array( [ @@ -225,7 +205,7 @@ def test_orc_reader_date_high(dirpath, pa): tm.assert_equal(expected, got) -def test_orc_reader_snappy_compressed(dirpath, pa): +def test_orc_reader_snappy_compressed(dirpath): data = { "int1": np.array( [ From e8efceb2a4391e6b768557cf089598c0c4d62b25 Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Sun, 1 Dec 2019 19:53:41 -0500 Subject: [PATCH 11/19] clean impl --- pandas/io/orc.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/io/orc.py b/pandas/io/orc.py index 4265edc48cb4f..b1946136071c5 100644 --- a/pandas/io/orc.py +++ b/pandas/io/orc.py @@ -16,8 +16,8 @@ def get_engine(engine: str) -> "PyArrowImpl": if engine == "auto": engine = get_option("io.orc.engine") - if engine not in ["pyarrow"]: - raise ValueError("engine must be 'pyarrow'") + if engine not in ["auto", "pyarrow"]: + raise ValueError("engine must be 'pyarrow or auto'") return PyArrowImpl() From bf4f01330e23a88d4bfc9be44cd38d593f26b89b Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Mon, 2 Dec 2019 18:42:57 -0500 Subject: [PATCH 12/19] Revert "clean impl" This reverts commit 19e4d47a8866a8e87395743231d00f5f0db5e9ee. --- pandas/io/orc.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/io/orc.py b/pandas/io/orc.py index b1946136071c5..4265edc48cb4f 100644 --- a/pandas/io/orc.py +++ b/pandas/io/orc.py @@ -16,8 +16,8 @@ def get_engine(engine: str) -> "PyArrowImpl": if engine == "auto": engine = get_option("io.orc.engine") - if engine not in ["auto", "pyarrow"]: - raise ValueError("engine must be 'pyarrow or auto'") + if engine not in ["pyarrow"]: + raise ValueError("engine must be 'pyarrow'") return PyArrowImpl() From ad1bade1baad37cd6ffeb0d7bc5d1961199291e6 Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Mon, 2 Dec 2019 18:43:13 -0500 Subject: [PATCH 13/19] Revert "simplify imports" This reverts commit 6919a707f751f38552adb5435af19dbb3d7818c8. --- pandas/io/orc.py | 37 +++++++++++++++++++++++++----------- pandas/tests/io/test_orc.py | 38 ++++++++++++++++++++++++++++--------- 2 files changed, 55 insertions(+), 20 deletions(-) diff --git a/pandas/io/orc.py b/pandas/io/orc.py index 4265edc48cb4f..e1bfad77afbba 100644 --- a/pandas/io/orc.py +++ b/pandas/io/orc.py @@ -1,5 +1,6 @@ """ orc compat """ +import distutils from typing import List, Optional from pandas.compat._optional import import_optional_dependency @@ -11,13 +12,28 @@ def get_engine(engine: str) -> "PyArrowImpl": - """ return our implementation; we only support a pyarrow impl """ + """ return our implementation """ if engine == "auto": engine = get_option("io.orc.engine") + if engine == "auto": + # try engines in this order + try: + return PyArrowImpl() + except ImportError: + pass + + raise ImportError( + "Unable to find a usable engine; " + "tried using: 'pyarrow'.\n" + "pyarrow is required for orc " + "support" + ) + if engine not in ["pyarrow"]: raise ValueError("engine must be 'pyarrow'") + return PyArrowImpl() @@ -27,15 +43,12 @@ def __init__(self): "pyarrow", extra="pyarrow is required for orc support." ) - try: - import pyarrow - except ImportError: - raise ImportError( - "Unable to find a usable engine; " - "tried using: 'pyarrow'.\n" - "pyarrow is required for orc " - "support" - ) + # we require a newer version of pyarrow thaN we support for parquet + import pyarrow + + if distutils.version.LooseVersion(pyarrow.__version__) < "0.13.0": + raise ImportError("pyarrow must be >= 0.13.0 for read_orc") + import pyarrow.orc self.api = pyarrow @@ -44,7 +57,9 @@ def read( self, path: FilePathOrBuffer, columns: Optional[List[str]] = None, **kwargs ) -> DataFrame: path, _, _, _ = get_filepath_or_buffer(path) - orc_file = self.api.orc.ORCFile(path) + + py_file = self.api.input_stream(path) + orc_file = self.api.orc.ORCFile(py_file) result = orc_file.read(columns=columns, **kwargs).to_pandas() diff --git a/pandas/tests/io/test_orc.py b/pandas/tests/io/test_orc.py index 2d15c699bf8e1..fbc24b795cd74 100644 --- a/pandas/tests/io/test_orc.py +++ b/pandas/tests/io/test_orc.py @@ -1,17 +1,27 @@ """ test orc compat """ import datetime -from decimal import Decimal +import distutils import os import numpy as np import pytest +from pandas.compat import is_platform_windows + import pandas as pd import pandas.util.testing as tm from pandas.io.orc import PyArrowImpl, get_engine, read_orc -pyarrow = pytest.importorskip("pyarrow") +try: + import pyarrow # noqa + + if distutils.version.LooseVersion(pyarrow.__version__) < "0.13.0": + raise ImportError("pyarrow must be >= 0.13.0 for read_orc") + + _HAVE_PYARROW = True +except ImportError: + _HAVE_PYARROW = False pytestmark = pytest.mark.filterwarnings( "ignore:RangeIndex.* is deprecated:DeprecationWarning" @@ -23,7 +33,16 @@ def dirpath(datapath): return datapath("io", "data", "orc") -def test_options_get_engine(): +@pytest.fixture +def pa(): + if not _HAVE_PYARROW: + pytest.skip("pyarrow is not installed") + if is_platform_windows(): + pytest.skip("pyarrow orc not available by default on windows") + return "pyarrow" + + +def test_options_get_engine(pa): assert isinstance(get_engine("pyarrow"), PyArrowImpl) with pd.option_context("io.orc.engine", "pyarrow"): @@ -42,7 +61,7 @@ def test_invalid_engine(dirpath): read_orc(inputfile, engine=engine, columns=["boolean1"]) -def test_orc_reader_empty(dirpath): +def test_orc_reader_empty(dirpath, pa): columns = [ "boolean1", "byte1", @@ -75,7 +94,7 @@ def test_orc_reader_empty(dirpath): tm.assert_equal(expected, got) -def test_orc_reader_basic(dirpath): +def test_orc_reader_basic(dirpath, pa): data = { "boolean1": np.array([False, True], dtype="bool"), "byte1": np.array([1, 100], dtype="int8"), @@ -95,7 +114,8 @@ def test_orc_reader_basic(dirpath): tm.assert_equal(expected, got) -def test_orc_reader_decimal(dirpath): +def test_orc_reader_decimal(dirpath, pa): + from decimal import Decimal # Only testing the first 10 rows of data data = { @@ -123,7 +143,7 @@ def test_orc_reader_decimal(dirpath): tm.assert_equal(expected, got) -def test_orc_reader_date_low(dirpath): +def test_orc_reader_date_low(dirpath, pa): data = { "time": np.array( [ @@ -164,7 +184,7 @@ def test_orc_reader_date_low(dirpath): tm.assert_equal(expected, got) -def test_orc_reader_date_high(dirpath): +def test_orc_reader_date_high(dirpath, pa): data = { "time": np.array( [ @@ -205,7 +225,7 @@ def test_orc_reader_date_high(dirpath): tm.assert_equal(expected, got) -def test_orc_reader_snappy_compressed(dirpath): +def test_orc_reader_snappy_compressed(dirpath, pa): data = { "int1": np.array( [ From ca016eff56a73d71f8a620ac107b765b02985c47 Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Mon, 2 Dec 2019 18:55:17 -0500 Subject: [PATCH 14/19] remove option for multiple backends & simplify tests --- doc/source/getting_started/install.rst | 2 +- pandas/core/config_init.py | 16 -------- pandas/io/orc.py | 50 ++++------------------- pandas/tests/io/test_orc.py | 56 ++++---------------------- 4 files changed, 17 insertions(+), 107 deletions(-) diff --git a/doc/source/getting_started/install.rst b/doc/source/getting_started/install.rst index 2591038febbe8..14530a9010a1c 100644 --- a/doc/source/getting_started/install.rst +++ b/doc/source/getting_started/install.rst @@ -258,7 +258,7 @@ matplotlib 2.2.2 Visualization openpyxl 2.4.8 Reading / writing for xlsx files pandas-gbq 0.8.0 Google Big Query access psycopg2 PostgreSQL engine for sqlalchemy -pyarrow 0.12.0 Parquet, ORC, and feather reading / writing +pyarrow 0.12.0 Parquet, ORC (requires 0.13.0), and feather reading / writing pymysql 0.7.11 MySQL engine for sqlalchemy pyreadstat SPSS files (.sav) reading pytables 3.4.2 HDF5 reading / writing diff --git a/pandas/core/config_init.py b/pandas/core/config_init.py index 63e069f4da69d..ba0a4d81a88d3 100644 --- a/pandas/core/config_init.py +++ b/pandas/core/config_init.py @@ -568,22 +568,6 @@ def use_inf_as_na_cb(key): validator=is_one_of_factory(["auto", "pyarrow", "fastparquet"]), ) - -# Set up the io.orc specific configuration. -orc_engine_doc = """ -: string - The default orc reader/writer engine. Available options: - 'auto', 'pyarrow', the default is 'auto' -""" - -with cf.config_prefix("io.orc"): - cf.register_option( - "engine", - "auto", - orc_engine_doc, - validator=is_one_of_factory(["auto", "pyarrow"]), - ) - # -------- # Plotting # --------- diff --git a/pandas/io/orc.py b/pandas/io/orc.py index e1bfad77afbba..091fd0982b93d 100644 --- a/pandas/io/orc.py +++ b/pandas/io/orc.py @@ -1,40 +1,16 @@ """ orc compat """ import distutils -from typing import List, Optional +from typing import TYPE_CHECKING, List, Optional from pandas.compat._optional import import_optional_dependency -from pandas import DataFrame, get_option from pandas._typing import FilePathOrBuffer from pandas.io.common import get_filepath_or_buffer - -def get_engine(engine: str) -> "PyArrowImpl": - """ return our implementation """ - - if engine == "auto": - engine = get_option("io.orc.engine") - - if engine == "auto": - # try engines in this order - try: - return PyArrowImpl() - except ImportError: - pass - - raise ImportError( - "Unable to find a usable engine; " - "tried using: 'pyarrow'.\n" - "pyarrow is required for orc " - "support" - ) - - if engine not in ["pyarrow"]: - raise ValueError("engine must be 'pyarrow'") - - return PyArrowImpl() +if TYPE_CHECKING: + from pandas import DataFrame class PyArrowImpl: @@ -55,22 +31,15 @@ def __init__(self): def read( self, path: FilePathOrBuffer, columns: Optional[List[str]] = None, **kwargs - ) -> DataFrame: + ) -> "DataFrame": path, _, _, _ = get_filepath_or_buffer(path) - - py_file = self.api.input_stream(path) - orc_file = self.api.orc.ORCFile(py_file) - + orc_file = self.api.orc.ORCFile(path) result = orc_file.read(columns=columns, **kwargs).to_pandas() - return result def read_orc( - path: FilePathOrBuffer, - engine: str = "auto", - columns: Optional[List[str]] = None, - **kwargs, + path: FilePathOrBuffer, columns: Optional[List[str]] = None, **kwargs, ): """ Load an ORC object from the file path, returning a DataFrame. @@ -91,18 +60,15 @@ def read_orc( By file-like object, we refer to objects with a ``read()`` method, such as a file handler (e.g. via builtin ``open`` function) or ``StringIO``. - engine : {'auto', 'pyarrow'}, default 'auto' - ORC library to use. If 'auto', then the option ``io.orc.engine`` is - used. The default ``io.orc.engine`` behavior is to try 'pyarrow'. columns : list, default=None If not None, only these columns will be read from the file. **kwargs - Any additional kwargs are passed to the engine. + Any additional kwargs are passed to pyarrow. Returns ------- DataFrame """ - impl = get_engine(engine) + impl = PyArrowImpl() return impl.read(path, columns=columns, **kwargs) diff --git a/pandas/tests/io/test_orc.py b/pandas/tests/io/test_orc.py index fbc24b795cd74..885cf6e3fe3f6 100644 --- a/pandas/tests/io/test_orc.py +++ b/pandas/tests/io/test_orc.py @@ -1,27 +1,15 @@ """ test orc compat """ import datetime -import distutils import os import numpy as np import pytest -from pandas.compat import is_platform_windows - import pandas as pd +from pandas import read_orc import pandas.util.testing as tm -from pandas.io.orc import PyArrowImpl, get_engine, read_orc - -try: - import pyarrow # noqa - - if distutils.version.LooseVersion(pyarrow.__version__) < "0.13.0": - raise ImportError("pyarrow must be >= 0.13.0 for read_orc") - - _HAVE_PYARROW = True -except ImportError: - _HAVE_PYARROW = False +pytest.importorskip("pyarrow", minversion="0.13.0") pytestmark = pytest.mark.filterwarnings( "ignore:RangeIndex.* is deprecated:DeprecationWarning" @@ -33,35 +21,7 @@ def dirpath(datapath): return datapath("io", "data", "orc") -@pytest.fixture -def pa(): - if not _HAVE_PYARROW: - pytest.skip("pyarrow is not installed") - if is_platform_windows(): - pytest.skip("pyarrow orc not available by default on windows") - return "pyarrow" - - -def test_options_get_engine(pa): - assert isinstance(get_engine("pyarrow"), PyArrowImpl) - - with pd.option_context("io.orc.engine", "pyarrow"): - assert isinstance(get_engine("auto"), PyArrowImpl) - assert isinstance(get_engine("pyarrow"), PyArrowImpl) - - with pd.option_context("io.orc.engine", "auto"): - assert isinstance(get_engine("auto"), PyArrowImpl) - assert isinstance(get_engine("pyarrow"), PyArrowImpl) - - -def test_invalid_engine(dirpath): - inputfile = os.path.join(dirpath, "TestOrcFile.emptyFile.orc") - engine = "foo" - with pytest.raises(ValueError): - read_orc(inputfile, engine=engine, columns=["boolean1"]) - - -def test_orc_reader_empty(dirpath, pa): +def test_orc_reader_empty(dirpath): columns = [ "boolean1", "byte1", @@ -94,7 +54,7 @@ def test_orc_reader_empty(dirpath, pa): tm.assert_equal(expected, got) -def test_orc_reader_basic(dirpath, pa): +def test_orc_reader_basic(dirpath): data = { "boolean1": np.array([False, True], dtype="bool"), "byte1": np.array([1, 100], dtype="int8"), @@ -114,7 +74,7 @@ def test_orc_reader_basic(dirpath, pa): tm.assert_equal(expected, got) -def test_orc_reader_decimal(dirpath, pa): +def test_orc_reader_decimal(dirpath): from decimal import Decimal # Only testing the first 10 rows of data @@ -143,7 +103,7 @@ def test_orc_reader_decimal(dirpath, pa): tm.assert_equal(expected, got) -def test_orc_reader_date_low(dirpath, pa): +def test_orc_reader_date_low(dirpath): data = { "time": np.array( [ @@ -184,7 +144,7 @@ def test_orc_reader_date_low(dirpath, pa): tm.assert_equal(expected, got) -def test_orc_reader_date_high(dirpath, pa): +def test_orc_reader_date_high(dirpath): data = { "time": np.array( [ @@ -225,7 +185,7 @@ def test_orc_reader_date_high(dirpath, pa): tm.assert_equal(expected, got) -def test_orc_reader_snappy_compressed(dirpath, pa): +def test_orc_reader_snappy_compressed(dirpath): data = { "int1": np.array( [ From b846bff5f92b17733d02da4e994a315ce9eef2cd Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Mon, 2 Dec 2019 19:01:26 -0500 Subject: [PATCH 15/19] small doc update --- doc/source/user_guide/io.rst | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/doc/source/user_guide/io.rst b/doc/source/user_guide/io.rst index cd38b0b65cd24..e1e9599b6d19c 100644 --- a/doc/source/user_guide/io.rst +++ b/doc/source/user_guide/io.rst @@ -4868,10 +4868,7 @@ ORC Similar to the `parquet ` format, the `ORC Format `__ binary columnar serialization for data frames. It is designed to make reading data frames efficient. Pandas provides *only* a reader for the -ORC format, :func:`~pandas.read_orc`. - -See the documentation for `pyarrow `__ for more. - +ORC format, :func:`~pandas.read_orc`. This requires the ``pyarrow `__ library. .. _io.sql: From ebaec28b2b75fce17bfdc9302ebc9a2cb013a6e4 Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Sun, 8 Dec 2019 10:40:02 -0500 Subject: [PATCH 16/19] fix doc error & make simpler --- doc/source/user_guide/io.rst | 2 +- pandas/io/orc.py | 43 +++++++++++------------------------- pandas/tests/io/test_orc.py | 4 ++++ 3 files changed, 18 insertions(+), 31 deletions(-) diff --git a/doc/source/user_guide/io.rst b/doc/source/user_guide/io.rst index e1e9599b6d19c..ebac916400d26 100644 --- a/doc/source/user_guide/io.rst +++ b/doc/source/user_guide/io.rst @@ -4866,7 +4866,7 @@ ORC .. versionadded:: 1.0.0 -Similar to the `parquet ` format, the `ORC Format `__ binary columnar serialization +Similar to the :ref:`parquet ` format, the `ORC Format `__ is a binary columnar serialization for data frames. It is designed to make reading data frames efficient. Pandas provides *only* a reader for the ORC format, :func:`~pandas.read_orc`. This requires the ``pyarrow `__ library. diff --git a/pandas/io/orc.py b/pandas/io/orc.py index 091fd0982b93d..02edd1416f0e3 100644 --- a/pandas/io/orc.py +++ b/pandas/io/orc.py @@ -3,8 +3,6 @@ import distutils from typing import TYPE_CHECKING, List, Optional -from pandas.compat._optional import import_optional_dependency - from pandas._typing import FilePathOrBuffer from pandas.io.common import get_filepath_or_buffer @@ -13,34 +11,9 @@ from pandas import DataFrame -class PyArrowImpl: - def __init__(self): - pyarrow = import_optional_dependency( - "pyarrow", extra="pyarrow is required for orc support." - ) - - # we require a newer version of pyarrow thaN we support for parquet - import pyarrow - - if distutils.version.LooseVersion(pyarrow.__version__) < "0.13.0": - raise ImportError("pyarrow must be >= 0.13.0 for read_orc") - - import pyarrow.orc - - self.api = pyarrow - - def read( - self, path: FilePathOrBuffer, columns: Optional[List[str]] = None, **kwargs - ) -> "DataFrame": - path, _, _, _ = get_filepath_or_buffer(path) - orc_file = self.api.orc.ORCFile(path) - result = orc_file.read(columns=columns, **kwargs).to_pandas() - return result - - def read_orc( path: FilePathOrBuffer, columns: Optional[List[str]] = None, **kwargs, -): +) -> "DataFrame": """ Load an ORC object from the file path, returning a DataFrame. @@ -70,5 +43,15 @@ def read_orc( DataFrame """ - impl = PyArrowImpl() - return impl.read(path, columns=columns, **kwargs) + # we require a newer version of pyarrow thaN we support for parquet + import pyarrow + + if distutils.version.LooseVersion(pyarrow.__version__) < "0.13.0": + raise ImportError("pyarrow must be >= 0.13.0 for read_orc") + + import pyarrow.orc + + path, _, _, _ = get_filepath_or_buffer(path) + orc_file = pyarrow.orc.ORCFile(path) + result = orc_file.read(columns=columns, **kwargs).to_pandas() + return result diff --git a/pandas/tests/io/test_orc.py b/pandas/tests/io/test_orc.py index 885cf6e3fe3f6..42cac9093e030 100644 --- a/pandas/tests/io/test_orc.py +++ b/pandas/tests/io/test_orc.py @@ -5,12 +5,16 @@ import numpy as np import pytest +from pandas.compat import is_platform_windows + import pandas as pd from pandas import read_orc import pandas.util.testing as tm pytest.importorskip("pyarrow", minversion="0.13.0") +pytestmark = pytest.mark.skipif(is_platform_windows, "skipping on windows") + pytestmark = pytest.mark.filterwarnings( "ignore:RangeIndex.* is deprecated:DeprecationWarning" ) From 39b578d0a3cfe4f0228bd6b9dcd7aaadf0c5b019 Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Sun, 8 Dec 2019 12:16:17 -0500 Subject: [PATCH 17/19] actually skip on windows --- doc/source/user_guide/io.rst | 2 +- pandas/tests/io/test_orc.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/user_guide/io.rst b/doc/source/user_guide/io.rst index ebac916400d26..972f36aecad24 100644 --- a/doc/source/user_guide/io.rst +++ b/doc/source/user_guide/io.rst @@ -4868,7 +4868,7 @@ ORC Similar to the :ref:`parquet ` format, the `ORC Format `__ is a binary columnar serialization for data frames. It is designed to make reading data frames efficient. Pandas provides *only* a reader for the -ORC format, :func:`~pandas.read_orc`. This requires the ``pyarrow `__ library. +ORC format, :func:`~pandas.read_orc`. This requires the `pyarrow `__ library. .. _io.sql: diff --git a/pandas/tests/io/test_orc.py b/pandas/tests/io/test_orc.py index 42cac9093e030..82edb5ce51c5f 100644 --- a/pandas/tests/io/test_orc.py +++ b/pandas/tests/io/test_orc.py @@ -13,7 +13,7 @@ pytest.importorskip("pyarrow", minversion="0.13.0") -pytestmark = pytest.mark.skipif(is_platform_windows, "skipping on windows") +pytestmark = pytest.mark.skipif(is_platform_windows(), "skipping on windows") pytestmark = pytest.mark.filterwarnings( "ignore:RangeIndex.* is deprecated:DeprecationWarning" From 8a203a6f69d2626c55617a8488c4035e1dc77c42 Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Sun, 8 Dec 2019 15:16:29 -0500 Subject: [PATCH 18/19] skip on dep missing --- pandas/tests/io/test_orc.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pandas/tests/io/test_orc.py b/pandas/tests/io/test_orc.py index 82edb5ce51c5f..9f3ec274007d0 100644 --- a/pandas/tests/io/test_orc.py +++ b/pandas/tests/io/test_orc.py @@ -5,15 +5,12 @@ import numpy as np import pytest -from pandas.compat import is_platform_windows - import pandas as pd from pandas import read_orc import pandas.util.testing as tm pytest.importorskip("pyarrow", minversion="0.13.0") - -pytestmark = pytest.mark.skipif(is_platform_windows(), "skipping on windows") +pytest.importorskip("pyarrow.orc") pytestmark = pytest.mark.filterwarnings( "ignore:RangeIndex.* is deprecated:DeprecationWarning" From 884d61e74203fd6d64f08153b235f05a62d97806 Mon Sep 17 00:00:00 2001 From: Joris Van den Bossche Date: Wed, 11 Dec 2019 09:10:51 +0100 Subject: [PATCH 19/19] typo --- pandas/io/orc.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/io/orc.py b/pandas/io/orc.py index 02edd1416f0e3..bbefe447cb7fe 100644 --- a/pandas/io/orc.py +++ b/pandas/io/orc.py @@ -33,7 +33,7 @@ def read_orc( By file-like object, we refer to objects with a ``read()`` method, such as a file handler (e.g. via builtin ``open`` function) or ``StringIO``. - columns : list, default=None + columns : list, default None If not None, only these columns will be read from the file. **kwargs Any additional kwargs are passed to pyarrow. @@ -43,7 +43,7 @@ def read_orc( DataFrame """ - # we require a newer version of pyarrow thaN we support for parquet + # we require a newer version of pyarrow than we support for parquet import pyarrow if distutils.version.LooseVersion(pyarrow.__version__) < "0.13.0":