@@ -52,6 +52,24 @@ def _polars_csv_symbols() -> Dict[str, Any]:
5252 }
5353
5454
55+ def _polars_orc_symbols () -> Dict [str , Any ]:
56+ """Symbols needed to resolve `polars.read_orc`'s type hints for casting reader hints."""
57+
58+ import fsspec
59+ import pyarrow
60+ from pandas import DataFrame
61+ from pandas ._typing import DtypeBackend , FilePath , ReadBuffer
62+
63+ return {
64+ "DataFrame" : DataFrame ,
65+ "DtypeBackend" : DtypeBackend ,
66+ "FilePath" : FilePath ,
67+ "fsspec" : fsspec ,
68+ "pyarrow" : pyarrow ,
69+ "ReadBuffer" : ReadBuffer ,
70+ }
71+
72+
5573def _polars_spreadsheet_symbols () -> Dict [str , Any ]:
5674 """Symbols needed to cast reader hint values for `polars.read_excel` and `polars.read_ods`."""
5775 from typing import Sequence
@@ -400,6 +418,31 @@ def read_spreadsheet(
400418 yield dlt .mark .with_table_name (rows , sheet_name )
401419
402420
421+ def read_orc (
422+ items : Iterator [FileItemDict ],
423+ ** kwargs ,
424+ ) -> Iterator [TDataItems ]:
425+ """Reader for ORC files."""
426+
427+ import pandas as pd
428+
429+ reader = pd .read_orc
430+
431+ kwargs = cast_kwargs_to_signature (reader , kwargs , symbols = _polars_orc_symbols ())
432+
433+ for file_obj in items :
434+ with file_obj .open () as f :
435+ rec = reader (f , dtype_backend = "pyarrow" , ** kwargs ).to_records (index = False )
436+ # Turn numpy recarray record into a Python dictionary.
437+ # https://gist.github.com/rlabbe/d574eeac63fd126b2fcd1dc390cc3257
438+ # https://stackoverflow.com/a/67324508
439+ if rec .dtype is None or rec .dtype .names is None :
440+ yield rec
441+ return
442+ result = {name : rec [name ] for name in rec .dtype .names }
443+ yield result
444+
445+
403446def read_jsonl (
404447 items : Iterator [FileItemDict ], chunksize : int = 1000
405448) -> Iterator [TDataItems ]:
@@ -642,6 +685,10 @@ def read_bson(self) -> DltResource:
642685 def read_msgpack (self ) -> DltResource :
643686 """MessagePack reader resource."""
644687
688+ @copy_sig (read_orc )
689+ def read_orc (self ) -> DltResource :
690+ """ORC reader resource (pyarrow)."""
691+
645692 @copy_sig (read_cbor )
646693 def read_cbor (self ) -> DltResource :
647694 """CBOR reader resource."""
0 commit comments