From 6793fe5684ef9bbce91202ef8ad0b143b0f061d2 Mon Sep 17 00:00:00 2001 From: Darek Date: Thu, 21 Mar 2024 10:58:39 -0400 Subject: [PATCH] Adding cloud options to scan_parquet (#173) * Adding cloud options to scan_parquet * Removing extra function * Removing extra , * Removing duplicated option --- Cargo.toml | 67 ++++++++++++++++++++++++++++++++++++++++++ __tests__/io.test.ts | 2 +- bun.lockb | Bin 0 -> 132386 bytes polars/io.ts | 59 +++++++++++++++++++++++++------------ src/lazy/dataframe.rs | 24 +++++++++++++-- 5 files changed, 129 insertions(+), 23 deletions(-) create mode 100755 bun.lockb diff --git a/Cargo.toml b/Cargo.toml index 9e780944..8df6ced9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -93,6 +93,73 @@ features = [ "cov", "group_by_list", "sql", + "binary_encoding", + "rolling_window", + "json", + "dynamic_group_by", + "zip_with", + "simd", + "lazy", + "strings", + "temporal", + "random", + "object", + "fmt", + "performant", + "dtype-full", + "rows", + "round_series", + "is_unique", + "is_in", + "is_first_distinct", + "asof_join", + "cross_join", + "dot_product", + "concat_str", + "row_hash", + "reinterpret", + "mode", + "extract_jsonpath", + "cum_agg", + "rolling_window", + "repeat_by", + "interpolate", + "ewma", + "rank", + "propagate_nans", + "diff", + "pct_change", + "moment", + "diagonal_concat", + "abs", + "dot_diagram", + "dataframe_arithmetic", + "json", + "string_encoding", + "product", + "ndarray", + "unique_counts", + "log", + "serde-lazy", + "partition_by", + "pivot", + "semi_anti_join", + "parquet", + "to_dummies", + "ipc", + "avro", + "list_eval", + "arg_where", + "timezones", + "peaks", + "string_pad", + "cov", + "group_by_list", + "http", + "cloud", + "aws", + "gcp", + "azure" ] git = "https://github.com/pola-rs/polars.git" rev = "3cf4897e679b056d17a235d48867035265d43cdc" diff --git a/__tests__/io.test.ts b/__tests__/io.test.ts index f5d8eafe..4e7ba909 100644 --- a/__tests__/io.test.ts +++ b/__tests__/io.test.ts @@ -271,7 +271,7 @@ describe("parquet", () => { }); test("scan:options", () => { - const df = pl.scanParquet(parquetpath, { numRows: 4 }).collectSync(); + const df = pl.scanParquet(parquetpath, { nRows: 4 }).collectSync(); expect(df.shape).toEqual({ height: 4, width: 4 }); }); }); diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..5f637beae36e13f89ebc4a83f5dc75a856341f97 GIT binary patch literal 132386 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 literal 0 HcmV?d00001 diff --git a/polars/io.ts b/polars/io.ts index b7e6c09d..4743f4fe 100644 --- a/polars/io.ts +++ b/polars/io.ts @@ -476,33 +476,54 @@ interface RowCount { } interface ScanParquetOptions { - columns?: string[] | number[]; - numRows?: number; + nRows?: number; + cache?: boolean; parallel?: "auto" | "columns" | "row_groups" | "none"; rowCount?: RowCount; - cache?: boolean; rechunk?: boolean; - hive_partitioning?: boolean; + lowMemory?: boolean; + useStatistics?: boolean; + hivePartitioning?: boolean; + cloudOptions?: Map; + retries?: number; } /** - * __Lazily read from a parquet file or multiple files via glob patterns.__ - * ___ + * Lazily read from a local or cloud-hosted parquet file (or files). + + This function allows the query optimizer to push down predicates and projections to + the scan level, typically increasing performance and reducing memory overhead. + * This allows the query optimizer to push down predicates and projections to the scan level, - * thereby potentially reducing memory overhead. - * @param path Path to a file or or glob pattern - * @param options.numRows Stop reading from parquet file after reading ``numRows``. - * @param options.cache Cache the result after reading. - * @param options.parallel Read the parquet file in parallel. The single threaded reader consumes less memory. - * @param options.rechunk In case of reading multiple files via a glob pattern rechunk the final DataFrame into contiguous memory chunks. + * thereby potentially reducing memory overhead. + * @param source - Path(s) to a file. If a single path is given, it can be a globbing pattern. + @param options.nRows - Stop reading from parquet file after reading `n_rows`. + @param options.rowIndexName - If not None, this will insert a row index column with the given name into the DataFrame + @param options.rowIndexOffset - Offset to start the row index column (only used if the name is set) + @param options.parallel : {'auto', 'columns', 'row_groups', 'none'} + This determines the direction of parallelism. 'auto' will try to determine the optimal direction. + @param options.useStatistics - Use statistics in the parquet to determine if pages can be skipped from reading. + @param options.hivePartitioning - Infer statistics and schema from hive partitioned URL and use them to prune reads. + @param options.rechunk - In case of reading multiple files via a glob pattern rechunk the final DataFrame into contiguous memory chunks. + @param options.lowMemory - Reduce memory pressure at the expense of performance. + @param options.cache - Cache the result after reading. + @param options.storageOptions - Options that indicate how to connect to a cloud provider. + If the cloud provider is not supported by Polars, the storage options are passed to `fsspec.open()`. + + The cloud providers currently supported are AWS, GCP, and Azure. + See supported keys here: + + * `aws `_ + * `gcp `_ + * `azure `_ + + If `storage_options` is not provided, Polars will try to infer the information from environment variables. + @param retries - Number of retries if accessing a cloud instance fails. */ -export function scanParquet(path: string, options: ScanParquetOptions = {}) { - const pliOptions: any = {}; - - pliOptions.nRows = options?.numRows; - pliOptions.rowCount = options?.rowCount; - pliOptions.parallel = options?.parallel ?? "auto"; - return _LazyDataFrame(pli.scanParquet(path, pliOptions)); +export function scanParquet(source: string, options: ScanParquetOptions = {}) { + const defaultOptions = { parallel: "auto" }; + const pliOptions = { ...defaultOptions, ...options }; + return _LazyDataFrame(pli.scanParquet(source, pliOptions)); } export interface ReadIPCOptions { diff --git a/src/lazy/dataframe.rs b/src/lazy/dataframe.rs index 7957ad41..fb4eb8f8 100644 --- a/src/lazy/dataframe.rs +++ b/src/lazy/dataframe.rs @@ -709,11 +709,11 @@ pub struct ScanParquetOptions { pub parallel: Wrap, pub row_count: Option, pub rechunk: Option, - pub row_count_name: Option, - pub row_count_offset: Option, pub low_memory: Option, pub use_statistics: Option, pub hive_partitioning: Option, + pub cloud_options: Option>, + pub retries: Option, } #[napi(catch_unwind)] @@ -725,7 +725,25 @@ pub fn scan_parquet(path: String, options: ScanParquetOptions) -> napi::Result = if let Some(o) = options.cloud_options { + let co: Vec<(String, String)> = o.into_iter().map(|kv: (String, String)| kv).collect(); + Some(CloudOptions::from_untyped_config(&path, co).map_err(JsPolarsErr::from)?) + } else { + None + }; + + let retries = options.retries.unwrap_or_else(|| 2) as usize; + if retries > 0 { + cloud_options = + cloud_options + .or_else(|| Some(CloudOptions::default())) + .map(|mut options| { + options.max_retries = retries; + options + }); + } + let hive_partitioning: bool = options.hive_partitioning.unwrap_or(false); let args = ScanArgsParquet { n_rows,