@loaders.gl/parquet 5.0.0-alpha.2 → 5.0.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/dist/bundled.d.ts +1 -1
- package/dist/bundled.d.ts.map +1 -1
- package/dist/bundled.js.map +1 -1
- package/dist/delta-format.d.ts +9 -0
- package/dist/delta-format.d.ts.map +1 -0
- package/dist/delta-format.js +12 -0
- package/dist/delta-format.js.map +1 -0
- package/dist/delta-source-loader-types.d.ts +27 -0
- package/dist/delta-source-loader-types.d.ts.map +1 -0
- package/dist/delta-source-loader-types.js +28 -0
- package/dist/delta-source-loader-types.js.map +1 -0
- package/dist/delta-source.d.ts +48 -0
- package/dist/delta-source.d.ts.map +1 -0
- package/dist/delta-source.js +222 -0
- package/dist/delta-source.js.map +1 -0
- package/dist/delta-types.d.ts +38 -0
- package/dist/delta-types.d.ts.map +1 -0
- package/dist/delta-types.js +5 -0
- package/dist/delta-types.js.map +1 -0
- package/dist/geoparquet-loader.js +1 -1
- package/dist/iceberg-rest-catalog.d.ts +49 -0
- package/dist/iceberg-rest-catalog.d.ts.map +1 -0
- package/dist/iceberg-rest-catalog.js +78 -0
- package/dist/iceberg-rest-catalog.js.map +1 -0
- package/dist/iceberg-table-source.d.ts +63 -0
- package/dist/iceberg-table-source.d.ts.map +1 -0
- package/dist/iceberg-table-source.js +797 -0
- package/dist/iceberg-table-source.js.map +1 -0
- package/dist/iceberg-types.d.ts +150 -0
- package/dist/iceberg-types.d.ts.map +1 -0
- package/dist/iceberg-types.js +5 -0
- package/dist/iceberg-types.js.map +1 -0
- package/dist/index.cjs +15005 -3143
- package/dist/index.cjs.map +3 -3
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/arrow/convert-schema-from-parquet.d.ts +3 -1
- package/dist/lib/arrow/convert-schema-from-parquet.d.ts.map +1 -1
- package/dist/lib/arrow/convert-schema-from-parquet.js +94 -19
- package/dist/lib/arrow/convert-schema-from-parquet.js.map +1 -1
- package/dist/lib/arrow/create-nested-arrow-vector.js +89 -0
- package/dist/lib/arrow/create-nested-arrow-vector.js.map +1 -1
- package/dist/lib/constants.js +1 -1
- package/dist/lib/encoders/encode-table-to-parquet-js.d.ts.map +1 -1
- package/dist/lib/encoders/encode-table-to-parquet-js.js +202 -7
- package/dist/lib/encoders/encode-table-to-parquet-js.js.map +1 -1
- package/dist/lib/geo/geoparquet-covering.d.ts +19 -0
- package/dist/lib/geo/geoparquet-covering.d.ts.map +1 -0
- package/dist/lib/geo/geoparquet-covering.js +137 -0
- package/dist/lib/geo/geoparquet-covering.js.map +1 -0
- package/dist/lib/geo/geospatial-metadata.d.ts.map +1 -1
- package/dist/lib/geo/geospatial-metadata.js +39 -13
- package/dist/lib/geo/geospatial-metadata.js.map +1 -1
- package/dist/lib/parquet-bloom-filter-planner.d.ts +16 -0
- package/dist/lib/parquet-bloom-filter-planner.d.ts.map +1 -0
- package/dist/lib/parquet-bloom-filter-planner.js +57 -0
- package/dist/lib/parquet-bloom-filter-planner.js.map +1 -0
- package/dist/lib/parquet-bloom-filter.d.ts +30 -0
- package/dist/lib/parquet-bloom-filter.d.ts.map +1 -0
- package/dist/lib/parquet-bloom-filter.js +289 -0
- package/dist/lib/parquet-bloom-filter.js.map +1 -0
- package/dist/lib/parquet-encryption.d.ts +80 -0
- package/dist/lib/parquet-encryption.d.ts.map +1 -0
- package/dist/lib/parquet-encryption.js +190 -0
- package/dist/lib/parquet-encryption.js.map +1 -0
- package/dist/lib/parquet-page-index.d.ts +34 -5
- package/dist/lib/parquet-page-index.d.ts.map +1 -1
- package/dist/lib/parquet-page-index.js +114 -28
- package/dist/lib/parquet-page-index.js.map +1 -1
- package/dist/lib/parquet-predicate.d.ts +5 -1
- package/dist/lib/parquet-predicate.d.ts.map +1 -1
- package/dist/lib/parquet-predicate.js +42 -14
- package/dist/lib/parquet-predicate.js.map +1 -1
- package/dist/lib/parquet-source-worker-decoder.d.ts +4 -1
- package/dist/lib/parquet-source-worker-decoder.d.ts.map +1 -1
- package/dist/lib/parquet-source-worker-decoder.js +83 -17
- package/dist/lib/parquet-source-worker-decoder.js.map +1 -1
- package/dist/lib/parquet-source-worker-types.d.ts +24 -0
- package/dist/lib/parquet-source-worker-types.d.ts.map +1 -1
- package/dist/lib/parsers/get-parquet-schema.d.ts.map +1 -1
- package/dist/lib/parsers/get-parquet-schema.js +3 -1
- package/dist/lib/parsers/get-parquet-schema.js.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-arrow-js.d.ts.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-arrow-js.js +327 -18
- package/dist/lib/parsers/parse-parquet-to-arrow-js.js.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-arrow.d.ts.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-arrow.js +5 -5
- package/dist/lib/parsers/parse-parquet-to-arrow.js.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-columns.d.ts.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-columns.js +3 -1
- package/dist/lib/parsers/parse-parquet-to-columns.js.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-json.d.ts.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-json.js +18 -2
- package/dist/lib/parsers/parse-parquet-to-json.js.map +1 -1
- package/dist/lib/slice-parquet-batch.d.ts +9 -0
- package/dist/lib/slice-parquet-batch.d.ts.map +1 -0
- package/dist/lib/slice-parquet-batch.js +28 -0
- package/dist/lib/slice-parquet-batch.js.map +1 -0
- package/dist/lib/sources/parquet-range-file.d.ts +1 -1
- package/dist/lib/sources/parquet-range-file.d.ts.map +1 -1
- package/dist/lib/sources/parquet-range-file.js +28 -22
- package/dist/lib/sources/parquet-range-file.js.map +1 -1
- package/dist/lib/utils/normalize-parquet-options.d.ts.map +1 -1
- package/dist/lib/utils/normalize-parquet-options.js +15 -1
- package/dist/lib/utils/normalize-parquet-options.js.map +1 -1
- package/dist/parquet-dataset-source.cjs +15766 -4896
- package/dist/parquet-dataset-source.cjs.map +3 -3
- package/dist/parquet-dataset-source.d.ts +31 -4
- package/dist/parquet-dataset-source.d.ts.map +1 -1
- package/dist/parquet-dataset-source.js +296 -74
- package/dist/parquet-dataset-source.js.map +1 -1
- package/dist/parquet-js-loader-types.d.ts +2 -0
- package/dist/parquet-js-loader-types.d.ts.map +1 -1
- package/dist/parquet-js-loader-types.js +2 -1
- package/dist/parquet-js-loader-types.js.map +1 -1
- package/dist/parquet-js-loader.d.ts +1 -0
- package/dist/parquet-js-loader.d.ts.map +1 -1
- package/dist/parquet-js-loader.js +2 -1
- package/dist/parquet-js-loader.js.map +1 -1
- package/dist/parquet-js-writer.d.ts +23 -2
- package/dist/parquet-js-writer.d.ts.map +1 -1
- package/dist/parquet-js-writer.js +1 -1
- package/dist/parquet-js-writer.js.map +1 -1
- package/dist/parquet-loader-base.js +1 -1
- package/dist/parquet-loader-options.d.ts +11 -0
- package/dist/parquet-loader-options.d.ts.map +1 -1
- package/dist/parquet-loader-options.js.map +1 -1
- package/dist/parquet-source-capabilities.d.ts +8 -1
- package/dist/parquet-source-capabilities.d.ts.map +1 -1
- package/dist/parquet-source-capabilities.js +10 -0
- package/dist/parquet-source-capabilities.js.map +1 -1
- package/dist/parquet-source-loader-types.d.ts +10 -0
- package/dist/parquet-source-loader-types.d.ts.map +1 -1
- package/dist/parquet-source-loader-types.js +11 -1
- package/dist/parquet-source-loader-types.js.map +1 -1
- package/dist/parquet-source-loader.cjs +14911 -4316
- package/dist/parquet-source-loader.cjs.map +3 -3
- package/dist/parquet-source-loader.d.ts +42 -4
- package/dist/parquet-source-loader.d.ts.map +1 -1
- package/dist/parquet-source-loader.js +585 -38
- package/dist/parquet-source-loader.js.map +1 -1
- package/dist/parquet-source-types.d.ts +180 -30
- package/dist/parquet-source-types.d.ts.map +1 -1
- package/dist/parquet-source-worker.js +7055 -6989
- package/dist/parquet-source-worker.js.map +4 -4
- package/dist/parquet-worker-node.cjs +8505 -1041
- package/dist/parquet-worker-node.cjs.map +4 -4
- package/dist/parquet-worker-url.js +5 -1
- package/dist/parquet-worker-url.js.map +1 -1
- package/dist/parquet-worker.js +289 -218
- package/dist/parquet-worker.js.map +4 -4
- package/dist/parquetjs/codecs/declare.d.ts +15 -0
- package/dist/parquetjs/codecs/declare.d.ts.map +1 -1
- package/dist/parquetjs/codecs/declare.js +10 -0
- package/dist/parquetjs/codecs/declare.js.map +1 -1
- package/dist/parquetjs/codecs/delta.d.ts.map +1 -1
- package/dist/parquetjs/codecs/delta.js +356 -7
- package/dist/parquetjs/codecs/delta.js.map +1 -1
- package/dist/parquetjs/codecs/index.d.ts.map +1 -1
- package/dist/parquetjs/codecs/index.js +4 -0
- package/dist/parquetjs/codecs/index.js.map +1 -1
- package/dist/parquetjs/codecs/plain.d.ts +1 -1
- package/dist/parquetjs/codecs/plain.d.ts.map +1 -1
- package/dist/parquetjs/codecs/plain.js +153 -12
- package/dist/parquetjs/codecs/plain.js.map +1 -1
- package/dist/parquetjs/codecs/rle.d.ts +4 -0
- package/dist/parquetjs/codecs/rle.d.ts.map +1 -1
- package/dist/parquetjs/codecs/rle.js +406 -3
- package/dist/parquetjs/codecs/rle.js.map +1 -1
- package/dist/parquetjs/compression.d.ts +9 -0
- package/dist/parquetjs/compression.d.ts.map +1 -1
- package/dist/parquetjs/compression.js +86 -67
- package/dist/parquetjs/compression.js.map +1 -1
- package/dist/parquetjs/encoder/dictionary-planner.d.ts.map +1 -1
- package/dist/parquetjs/encoder/dictionary-planner.js +5 -2
- package/dist/parquetjs/encoder/dictionary-planner.js.map +1 -1
- package/dist/parquetjs/encoder/parquet-encoder.d.ts +43 -1
- package/dist/parquetjs/encoder/parquet-encoder.d.ts.map +1 -1
- package/dist/parquetjs/encoder/parquet-encoder.js +691 -34
- package/dist/parquetjs/encoder/parquet-encoder.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/BoundingBox.d.ts +29 -0
- package/dist/parquetjs/parquet-thrift/BoundingBox.d.ts.map +1 -0
- package/dist/parquetjs/parquet-thrift/BoundingBox.js +85 -0
- package/dist/parquetjs/parquet-thrift/BoundingBox.js.map +1 -0
- package/dist/parquetjs/parquet-thrift/ColumnChunk.d.ts +5 -0
- package/dist/parquetjs/parquet-thrift/ColumnChunk.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/ColumnChunk.js +35 -0
- package/dist/parquetjs/parquet-thrift/ColumnChunk.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/ColumnCryptoMetaData.d.ts +35 -0
- package/dist/parquetjs/parquet-thrift/ColumnCryptoMetaData.d.ts.map +1 -0
- package/dist/parquetjs/parquet-thrift/ColumnCryptoMetaData.js +135 -0
- package/dist/parquetjs/parquet-thrift/ColumnCryptoMetaData.js.map +1 -0
- package/dist/parquetjs/parquet-thrift/ColumnMetaData.d.ts +10 -0
- package/dist/parquetjs/parquet-thrift/ColumnMetaData.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/ColumnMetaData.js +73 -0
- package/dist/parquetjs/parquet-thrift/ColumnMetaData.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/EncryptionAlgorithm.d.ts +22 -0
- package/dist/parquetjs/parquet-thrift/EncryptionAlgorithm.d.ts.map +1 -0
- package/dist/parquetjs/parquet-thrift/EncryptionAlgorithm.js +111 -0
- package/dist/parquetjs/parquet-thrift/EncryptionAlgorithm.js.map +1 -0
- package/dist/parquetjs/parquet-thrift/FileCryptoMetaData.d.ts +16 -0
- package/dist/parquetjs/parquet-thrift/FileCryptoMetaData.d.ts.map +1 -0
- package/dist/parquetjs/parquet-thrift/FileCryptoMetaData.js +57 -0
- package/dist/parquetjs/parquet-thrift/FileCryptoMetaData.js.map +1 -0
- package/dist/parquetjs/parquet-thrift/FileMetaData.d.ts +5 -0
- package/dist/parquetjs/parquet-thrift/FileMetaData.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/FileMetaData.js +35 -0
- package/dist/parquetjs/parquet-thrift/FileMetaData.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/GeospatialStatistics.d.ts +18 -0
- package/dist/parquetjs/parquet-thrift/GeospatialStatistics.d.ts.map +1 -0
- package/dist/parquetjs/parquet-thrift/GeospatialStatistics.js +62 -0
- package/dist/parquetjs/parquet-thrift/GeospatialStatistics.js.map +1 -0
- package/dist/parquetjs/parquet-thrift/SizeStatistics.d.ts +26 -0
- package/dist/parquetjs/parquet-thrift/SizeStatistics.d.ts.map +1 -0
- package/dist/parquetjs/parquet-thrift/SizeStatistics.js +85 -0
- package/dist/parquetjs/parquet-thrift/SizeStatistics.js.map +1 -0
- package/dist/parquetjs/parquet-thrift/index.d.ts +6 -0
- package/dist/parquetjs/parquet-thrift/index.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/index.js +6 -0
- package/dist/parquetjs/parquet-thrift/index.js.map +1 -1
- package/dist/parquetjs/parser/decoders.d.ts +10 -1
- package/dist/parquetjs/parser/decoders.d.ts.map +1 -1
- package/dist/parquetjs/parser/decoders.js +318 -14
- package/dist/parquetjs/parser/decoders.js.map +1 -1
- package/dist/parquetjs/parser/parquet-reader.d.ts +78 -12
- package/dist/parquetjs/parser/parquet-reader.d.ts.map +1 -1
- package/dist/parquetjs/parser/parquet-reader.js +605 -66
- package/dist/parquetjs/parser/parquet-reader.js.map +1 -1
- package/dist/parquetjs/schema/declare.d.ts +22 -3
- package/dist/parquetjs/schema/declare.d.ts.map +1 -1
- package/dist/parquetjs/schema/declare.js.map +1 -1
- package/dist/parquetjs/schema/schema.d.ts.map +1 -1
- package/dist/parquetjs/schema/schema.js +10 -0
- package/dist/parquetjs/schema/schema.js.map +1 -1
- package/dist/parquetjs/schema/shred.d.ts.map +1 -1
- package/dist/parquetjs/schema/shred.js +219 -11
- package/dist/parquetjs/schema/shred.js.map +1 -1
- package/dist/parquetjs/schema/types.js +19 -21
- package/dist/parquetjs/schema/types.js.map +1 -1
- package/dist/parquetjs/schema/variant.d.ts +3 -0
- package/dist/parquetjs/schema/variant.d.ts.map +1 -0
- package/dist/parquetjs/schema/variant.js +248 -0
- package/dist/parquetjs/schema/variant.js.map +1 -0
- package/dist/parquetjs/utils/crc32.d.ts +3 -0
- package/dist/parquetjs/utils/crc32.d.ts.map +1 -0
- package/dist/parquetjs/utils/crc32.js +15 -0
- package/dist/parquetjs/utils/crc32.js.map +1 -0
- package/dist/parquetjs/utils/read-utils.d.ts +11 -1
- package/dist/parquetjs/utils/read-utils.d.ts.map +1 -1
- package/dist/parquetjs/utils/read-utils.js +21 -1
- package/dist/parquetjs/utils/read-utils.js.map +1 -1
- package/dist/unbundled.d.ts +2 -1
- package/dist/unbundled.d.ts.map +1 -1
- package/dist/unbundled.js +1 -0
- package/dist/unbundled.js.map +1 -1
- package/package.json +36 -11
- package/src/bundled.ts +3 -0
- package/src/delta-format.ts +12 -0
- package/src/delta-source-loader-types.ts +40 -0
- package/src/delta-source.ts +305 -0
- package/src/delta-types.ts +40 -0
- package/src/iceberg-rest-catalog.ts +122 -0
- package/src/iceberg-table-source.ts +1037 -0
- package/src/iceberg-types.ts +165 -0
- package/src/index.ts +50 -1
- package/src/lib/arrow/convert-schema-from-parquet.ts +113 -19
- package/src/lib/arrow/create-nested-arrow-vector.ts +116 -0
- package/src/lib/encoders/encode-table-to-parquet-js.ts +268 -7
- package/src/lib/geo/geoparquet-covering.ts +201 -0
- package/src/lib/geo/geospatial-metadata.ts +42 -15
- package/src/lib/parquet-bloom-filter-planner.ts +86 -0
- package/src/lib/parquet-bloom-filter.ts +345 -0
- package/src/lib/parquet-encryption.ts +344 -0
- package/src/lib/parquet-page-index.ts +180 -34
- package/src/lib/parquet-predicate.ts +52 -16
- package/src/lib/parquet-source-worker-decoder.ts +116 -20
- package/src/lib/parquet-source-worker-types.ts +25 -0
- package/src/lib/parsers/get-parquet-schema.ts +3 -1
- package/src/lib/parsers/parse-parquet-to-arrow-js.ts +397 -17
- package/src/lib/parsers/parse-parquet-to-arrow.ts +4 -5
- package/src/lib/parsers/parse-parquet-to-columns.ts +3 -1
- package/src/lib/parsers/parse-parquet-to-json.ts +18 -2
- package/src/lib/slice-parquet-batch.ts +32 -0
- package/src/lib/sources/parquet-range-file.ts +35 -29
- package/src/lib/utils/normalize-parquet-options.ts +17 -1
- package/src/parquet-dataset-source.ts +397 -85
- package/src/parquet-js-loader-types.ts +1 -0
- package/src/parquet-js-loader.ts +2 -1
- package/src/parquet-js-writer.ts +30 -0
- package/src/parquet-loader-options.ts +11 -0
- package/src/parquet-source-capabilities.ts +18 -1
- package/src/parquet-source-loader-types.ts +10 -0
- package/src/parquet-source-loader.ts +929 -52
- package/src/parquet-source-types.ts +197 -28
- package/src/parquet-worker-url.ts +6 -1
- package/src/parquetjs/codecs/declare.ts +27 -0
- package/src/parquetjs/codecs/delta.ts +466 -6
- package/src/parquetjs/codecs/index.ts +4 -0
- package/src/parquetjs/codecs/plain.ts +177 -11
- package/src/parquetjs/codecs/rle.ts +573 -3
- package/src/parquetjs/compression.ts +102 -76
- package/src/parquetjs/encoder/dictionary-planner.ts +7 -2
- package/src/parquetjs/encoder/parquet-encoder.ts +1016 -38
- package/src/parquetjs/parquet-thrift/BoundingBox.ts +108 -0
- package/src/parquetjs/parquet-thrift/ColumnChunk.ts +35 -0
- package/src/parquetjs/parquet-thrift/ColumnCryptoMetaData.ts +139 -0
- package/src/parquetjs/parquet-thrift/ColumnMetaData.ts +73 -0
- package/src/parquetjs/parquet-thrift/EncryptionAlgorithm.ts +127 -0
- package/src/parquetjs/parquet-thrift/FileCryptoMetaData.ts +60 -0
- package/src/parquetjs/parquet-thrift/FileMetaData.ts +35 -0
- package/src/parquetjs/parquet-thrift/GeospatialStatistics.ts +68 -0
- package/src/parquetjs/parquet-thrift/SizeStatistics.ts +98 -0
- package/src/parquetjs/parquet-thrift/index.ts +6 -0
- package/src/parquetjs/parser/decoders.ts +451 -26
- package/src/parquetjs/parser/parquet-reader.ts +935 -87
- package/src/parquetjs/schema/declare.ts +22 -2
- package/src/parquetjs/schema/schema.ts +10 -0
- package/src/parquetjs/schema/shred.ts +238 -11
- package/src/parquetjs/schema/types.ts +16 -25
- package/src/parquetjs/schema/variant.ts +313 -0
- package/src/parquetjs/utils/crc32.ts +15 -0
- package/src/parquetjs/utils/read-utils.ts +26 -1
- package/src/unbundled.ts +14 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
/** Minimal Iceberg table metadata shape needed for read-only table discovery. */
|
|
6
|
+
export type IcebergTableMetadata = {
|
|
7
|
+
/** Iceberg metadata format version. */
|
|
8
|
+
readonly 'format-version': 1 | 2 | 3;
|
|
9
|
+
/** Table UUID when supplied by the writer. */
|
|
10
|
+
readonly 'table-uuid'?: string;
|
|
11
|
+
/** Root location used to resolve manifest and data-file paths. */
|
|
12
|
+
readonly location: string;
|
|
13
|
+
/** Current snapshot identifier, or `-1` when the table has no snapshot. */
|
|
14
|
+
readonly 'current-snapshot-id'?: number;
|
|
15
|
+
/** Snapshot sequence number. */
|
|
16
|
+
readonly 'last-sequence-number'?: number;
|
|
17
|
+
/** Metadata update time in milliseconds since the Unix epoch. */
|
|
18
|
+
readonly 'last-updated-ms'?: number;
|
|
19
|
+
/** Current schema identifier. */
|
|
20
|
+
readonly 'current-schema-id'?: number;
|
|
21
|
+
/** Schemas declared by the table metadata. */
|
|
22
|
+
readonly schemas?: readonly IcebergSchema[];
|
|
23
|
+
/** Partition specifications declared by the table metadata. */
|
|
24
|
+
readonly 'partition-specs'?: readonly IcebergPartitionSpec[];
|
|
25
|
+
/** Default partition specification identifier. */
|
|
26
|
+
readonly 'default-spec-id'?: number;
|
|
27
|
+
/** Table snapshots. */
|
|
28
|
+
readonly snapshots?: readonly IcebergSnapshot[];
|
|
29
|
+
/** Named snapshot references such as `main`, branches, and tags. */
|
|
30
|
+
readonly refs?: Readonly<Record<string, IcebergSnapshotReference>>;
|
|
31
|
+
/** Table properties. */
|
|
32
|
+
readonly properties?: Readonly<Record<string, string>>;
|
|
33
|
+
/** Additional Iceberg metadata fields retained for forward compatibility. */
|
|
34
|
+
readonly [key: string]: unknown;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/** Named Iceberg branch or tag reference. */
|
|
38
|
+
export type IcebergSnapshotReference = Readonly<Record<string, unknown>> & {
|
|
39
|
+
readonly 'snapshot-id': number;
|
|
40
|
+
readonly type?: 'branch' | 'tag' | string;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/** Iceberg schema metadata retained without imposing a schema-model dependency. */
|
|
44
|
+
export type IcebergSchema = Readonly<Record<string, unknown>> & {
|
|
45
|
+
readonly 'schema-id'?: number;
|
|
46
|
+
readonly fields?: readonly Readonly<Record<string, unknown>>[];
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/** Iceberg partition specification metadata. */
|
|
50
|
+
export type IcebergPartitionSpec = Readonly<Record<string, unknown>> & {
|
|
51
|
+
readonly 'spec-id'?: number;
|
|
52
|
+
readonly fields?: readonly Readonly<Record<string, unknown>>[];
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/** Iceberg snapshot metadata used to select a manifest list. */
|
|
56
|
+
export type IcebergSnapshot = Readonly<Record<string, unknown>> & {
|
|
57
|
+
readonly 'snapshot-id': number;
|
|
58
|
+
readonly 'sequence-number'?: number;
|
|
59
|
+
readonly 'manifest-list'?: string;
|
|
60
|
+
readonly 'schema-id'?: number;
|
|
61
|
+
readonly summary?: Readonly<Record<string, string>>;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/** One data or delete manifest referenced by an Iceberg manifest list. */
|
|
65
|
+
export type IcebergManifestFile = Readonly<Record<string, unknown>> & {
|
|
66
|
+
readonly manifest_path: string;
|
|
67
|
+
readonly manifest_length?: number;
|
|
68
|
+
readonly partition_spec_id?: number;
|
|
69
|
+
readonly content?: number | string;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
/** One data or delete file entry decoded from an Iceberg manifest. */
|
|
73
|
+
export type IcebergDataFile = Readonly<Record<string, unknown>> & {
|
|
74
|
+
readonly file_path: string;
|
|
75
|
+
readonly file_format: string;
|
|
76
|
+
readonly file_size_in_bytes?: number;
|
|
77
|
+
readonly record_count?: number;
|
|
78
|
+
readonly partition?: Readonly<Record<string, unknown>>;
|
|
79
|
+
readonly lower_bounds?: Readonly<Record<string, unknown>>;
|
|
80
|
+
readonly upper_bounds?: Readonly<Record<string, unknown>>;
|
|
81
|
+
readonly content?: number | string;
|
|
82
|
+
readonly referenced_data_file?: string;
|
|
83
|
+
readonly equality_ids?: readonly number[];
|
|
84
|
+
readonly sort_order_id?: number;
|
|
85
|
+
readonly data_sequence_number?: number;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
/** Parquet data-file plan produced by the Iceberg manifest reader. */
|
|
89
|
+
export type IcebergParquetFile = {
|
|
90
|
+
readonly data: string;
|
|
91
|
+
readonly fileSize?: number;
|
|
92
|
+
readonly recordCount?: number;
|
|
93
|
+
readonly partition?: Readonly<Record<string, unknown>>;
|
|
94
|
+
readonly lowerBounds?: Readonly<Record<string, unknown>>;
|
|
95
|
+
readonly upperBounds?: Readonly<Record<string, unknown>>;
|
|
96
|
+
/** Manifest path that contributed this file. */
|
|
97
|
+
readonly manifestPath?: string;
|
|
98
|
+
/** Partition specification identifier for this manifest. */
|
|
99
|
+
readonly partitionSpecId?: number;
|
|
100
|
+
/** Snapshot used to produce this plan. */
|
|
101
|
+
readonly snapshotId?: number;
|
|
102
|
+
/** Iceberg data sequence number when supplied by the manifest entry. */
|
|
103
|
+
readonly dataSequenceNumber?: number;
|
|
104
|
+
/** Schema identifier used by the snapshot that contributed this file. */
|
|
105
|
+
readonly schemaId?: number;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/** Planned Iceberg delete file retained for optional delete application during a scan. */
|
|
109
|
+
export type IcebergDeleteFile = {
|
|
110
|
+
/** URL or path of the delete file. */
|
|
111
|
+
readonly data: string;
|
|
112
|
+
/** Iceberg delete-file format, commonly `avro` or `puffin`. */
|
|
113
|
+
readonly format: string;
|
|
114
|
+
/** Delete content kind, such as position or equality deletes. */
|
|
115
|
+
readonly content?: number | string;
|
|
116
|
+
/** Referenced data file for a position delete file. */
|
|
117
|
+
readonly referencedDataFile?: string;
|
|
118
|
+
/** Field IDs used by an equality delete file. */
|
|
119
|
+
readonly equalityFieldIds?: readonly number[];
|
|
120
|
+
/** File size from the manifest. */
|
|
121
|
+
readonly fileSize?: number;
|
|
122
|
+
/** Record count from the manifest. */
|
|
123
|
+
readonly recordCount?: number;
|
|
124
|
+
/** Partition values from the manifest. */
|
|
125
|
+
readonly partition?: Readonly<Record<string, unknown>>;
|
|
126
|
+
/** Manifest path that contributed this delete file. */
|
|
127
|
+
readonly manifestPath?: string;
|
|
128
|
+
/** Partition specification identifier for this manifest. */
|
|
129
|
+
readonly partitionSpecId?: number;
|
|
130
|
+
/** Snapshot used to produce this plan. */
|
|
131
|
+
readonly snapshotId?: number;
|
|
132
|
+
/** Schema identifier used by the snapshot that contributed this delete file. */
|
|
133
|
+
readonly schemaId?: number;
|
|
134
|
+
/** Iceberg data sequence number associated with this delete file. */
|
|
135
|
+
readonly dataSequenceNumber?: number;
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
/** Files selected from one Iceberg snapshot before delete application. */
|
|
139
|
+
export type IcebergScanPlan = {
|
|
140
|
+
/** Active Parquet data files selected from data manifests. */
|
|
141
|
+
readonly dataFiles: readonly IcebergParquetFile[];
|
|
142
|
+
/** Delete files discovered from delete manifests. */
|
|
143
|
+
readonly deleteFiles: readonly IcebergDeleteFile[];
|
|
144
|
+
/** Snapshot identifier used to build the plan. */
|
|
145
|
+
readonly snapshotId?: number;
|
|
146
|
+
/** Named snapshot reference used to build this plan, when supplied. */
|
|
147
|
+
readonly snapshotRef?: string;
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
/** Axis-aligned geographic bounds in `[minX, minY, maxX, maxY]` order. */
|
|
151
|
+
export type IcebergBoundingBox = readonly [number, number, number, number];
|
|
152
|
+
|
|
153
|
+
/** Conservative spatial filter used for Iceberg file-level pruning. */
|
|
154
|
+
export type IcebergSpatialFilter = {
|
|
155
|
+
/** Top-level geometry column or Iceberg field name whose bounds are being queried. */
|
|
156
|
+
readonly column: string;
|
|
157
|
+
/** Query envelope in `[minX, minY, maxX, maxY]` order. */
|
|
158
|
+
readonly bbox: IcebergBoundingBox;
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
/** Options for constructing a read-only Iceberg table source. */
|
|
162
|
+
export type IcebergTableSourceOptions = {
|
|
163
|
+
/** HTTP headers forwarded to metadata requests. */
|
|
164
|
+
readonly headers?: HeadersInit;
|
|
165
|
+
};
|
package/src/index.ts
CHANGED
|
@@ -16,13 +16,19 @@ export type {
|
|
|
16
16
|
ParquetBatch,
|
|
17
17
|
ParquetBatchMetadata,
|
|
18
18
|
ParquetBatchProvenance,
|
|
19
|
+
ParquetBoundingBox,
|
|
19
20
|
ParquetColumnChunkMetadata,
|
|
20
21
|
ParquetColumnChunkStatistics,
|
|
22
|
+
ParquetColumnChunkSizeStatistics,
|
|
23
|
+
ParquetGeospatialBoundingBox,
|
|
24
|
+
ParquetGeospatialStatistics,
|
|
21
25
|
ParquetDatasetBatch,
|
|
22
26
|
ParquetDatasetBatchProvenance,
|
|
23
27
|
ParquetDatasetBoundingBox,
|
|
28
|
+
ParquetDatasetExplain,
|
|
24
29
|
ParquetDatasetFile,
|
|
25
30
|
ParquetDatasetFileCollection,
|
|
31
|
+
ParquetDatasetFileScanPlan,
|
|
26
32
|
ParquetDatasetFileProvider,
|
|
27
33
|
ParquetDatasetFileQuery,
|
|
28
34
|
ParquetDatasetFiles,
|
|
@@ -32,6 +38,7 @@ export type {
|
|
|
32
38
|
ParquetDatasetTelemetry,
|
|
33
39
|
ParquetMetadataRequestOptions,
|
|
34
40
|
ParquetObjectVersion,
|
|
41
|
+
ParquetPageScanPlan,
|
|
35
42
|
ParquetComparisonPredicate,
|
|
36
43
|
ParquetInPredicate,
|
|
37
44
|
ParquetLogicalPredicate,
|
|
@@ -43,22 +50,49 @@ export type {
|
|
|
43
50
|
ParquetRangeRequestOptions,
|
|
44
51
|
ParquetReadOptions,
|
|
45
52
|
ParquetRowGroupMetadata,
|
|
53
|
+
ParquetSortingColumn,
|
|
46
54
|
ParquetSourceBatch,
|
|
47
55
|
ParquetSourceLoaderOptions,
|
|
48
56
|
ParquetSourceMetadata,
|
|
49
57
|
ParquetSourceReadOptions,
|
|
58
|
+
ParquetSourceExplain,
|
|
50
59
|
ParquetTelemetry,
|
|
51
60
|
ParquetTelemetryEvent
|
|
52
61
|
} from './parquet-source-types';
|
|
53
62
|
export {
|
|
63
|
+
PARQUET_TABLE_QUERY_CAPABILITIES,
|
|
54
64
|
PARQUET_SOURCE_CAPABILITIES,
|
|
55
65
|
type ParquetSourceCapabilities
|
|
56
66
|
} from './parquet-source-capabilities';
|
|
57
67
|
|
|
58
68
|
export {ParquetWriter} from './parquet-writer';
|
|
59
|
-
export type {
|
|
69
|
+
export type {
|
|
70
|
+
ParquetJSWriterEncoding,
|
|
71
|
+
ParquetJSWriterOptions,
|
|
72
|
+
ParquetSortingColumnOption,
|
|
73
|
+
ParquetWriterEncryptionOptions,
|
|
74
|
+
ParquetWriterFooterSignatureOptions
|
|
75
|
+
} from './parquet-js-writer';
|
|
60
76
|
export {ParquetJSWriter} from './parquet-js-writer';
|
|
61
77
|
|
|
78
|
+
export {
|
|
79
|
+
decodeParquetColumnIndex,
|
|
80
|
+
decodeParquetPageStatisticsValue,
|
|
81
|
+
canUseParquetPageIndexForColumn,
|
|
82
|
+
type ParquetPageStatistics
|
|
83
|
+
} from './lib/parquet-page-index';
|
|
84
|
+
export {
|
|
85
|
+
createParquetModuleAad,
|
|
86
|
+
decryptParquetModule,
|
|
87
|
+
encryptParquetModule,
|
|
88
|
+
createParquetFooterSignature,
|
|
89
|
+
readParquetEncryptedModule,
|
|
90
|
+
verifyParquetFooterSignature,
|
|
91
|
+
type ParquetDecryptModuleOptions,
|
|
92
|
+
type ParquetEncryptionAlgorithm,
|
|
93
|
+
type ParquetKeyRetriever
|
|
94
|
+
} from './lib/parquet-encryption';
|
|
95
|
+
|
|
62
96
|
// EXPERIMENTAL - expose the internal parquetjs API
|
|
63
97
|
|
|
64
98
|
export {preloadCompressions} from './parquetjs/compression';
|
|
@@ -71,3 +105,18 @@ export {
|
|
|
71
105
|
convertParquetSchema,
|
|
72
106
|
convertParquetSchema as convertParquetToArrowSchema
|
|
73
107
|
} from './lib/arrow/convert-schema-from-parquet';
|
|
108
|
+
|
|
109
|
+
export {
|
|
110
|
+
checkParquetSplitBlockBloomFilter,
|
|
111
|
+
decodeParquetSplitBlockBloomFilter,
|
|
112
|
+
encodeParquetBloomFilterValue,
|
|
113
|
+
encodeParquetSplitBlockBloomFilter,
|
|
114
|
+
hashParquetBloomFilterValue,
|
|
115
|
+
insertParquetSplitBlockBloomFilter,
|
|
116
|
+
type ParquetBloomFilterPhysicalType,
|
|
117
|
+
type ParquetSplitBlockBloomFilter
|
|
118
|
+
} from './lib/parquet-bloom-filter';
|
|
119
|
+
export {
|
|
120
|
+
getParquetBloomFilterProbes,
|
|
121
|
+
type ParquetBloomFilterProbe
|
|
122
|
+
} from './lib/parquet-bloom-filter-planner';
|
|
@@ -52,9 +52,10 @@ export const PARQUET_TYPE_MAPPING: {[type in ParquetType]: DataType} = {
|
|
|
52
52
|
|
|
53
53
|
export function convertParquetSchema(
|
|
54
54
|
parquetSchema: ParquetSchema,
|
|
55
|
-
parquetMetadata: FileMetaData | null
|
|
55
|
+
parquetMetadata: FileMetaData | null,
|
|
56
|
+
options?: {int96AsTimestamp?: boolean}
|
|
56
57
|
): Schema {
|
|
57
|
-
const fields = getFields(parquetSchema.schema);
|
|
58
|
+
const fields = getFields(parquetSchema.schema, options);
|
|
58
59
|
const metadata = parquetMetadata && getSchemaMetadata(parquetMetadata);
|
|
59
60
|
|
|
60
61
|
const schema: Schema = {
|
|
@@ -65,31 +66,28 @@ export function convertParquetSchema(
|
|
|
65
66
|
return schema;
|
|
66
67
|
}
|
|
67
68
|
|
|
68
|
-
function getFields(schema: SchemaDefinition): Field[] {
|
|
69
|
+
function getFields(schema: SchemaDefinition, options?: {int96AsTimestamp?: boolean}): Field[] {
|
|
69
70
|
const fields: Field[] = [];
|
|
70
71
|
|
|
71
72
|
for (const name in schema) {
|
|
72
|
-
fields.push(getField(name, schema[name]));
|
|
73
|
+
fields.push(getField(name, schema[name], options));
|
|
73
74
|
}
|
|
74
75
|
|
|
75
76
|
return fields;
|
|
76
77
|
}
|
|
77
78
|
|
|
78
79
|
/** Converts one Parquet field, preserving repeated values as Arrow lists. */
|
|
79
|
-
function getField(
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
:
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
nullable: Boolean(field.optional),
|
|
91
|
-
metadata: getFieldMetadata(field)
|
|
92
|
-
};
|
|
80
|
+
function getField(
|
|
81
|
+
name: string,
|
|
82
|
+
field: FieldDefinition,
|
|
83
|
+
options?: {int96AsTimestamp?: boolean}
|
|
84
|
+
): Field {
|
|
85
|
+
const elementField: Field = {
|
|
86
|
+
name,
|
|
87
|
+
type: getFieldValueType(field, options),
|
|
88
|
+
nullable: Boolean(field.optional),
|
|
89
|
+
metadata: getFieldMetadata(field)
|
|
90
|
+
};
|
|
93
91
|
|
|
94
92
|
if (!field.repeated) {
|
|
95
93
|
return elementField;
|
|
@@ -106,8 +104,95 @@ function getField(name: string, field: FieldDefinition): Field {
|
|
|
106
104
|
};
|
|
107
105
|
}
|
|
108
106
|
|
|
107
|
+
/** Converts a nested Parquet definition into its corresponding Arrow data type. */
|
|
108
|
+
function getFieldValueType(
|
|
109
|
+
field: FieldDefinition,
|
|
110
|
+
options?: {int96AsTimestamp?: boolean}
|
|
111
|
+
): DataType {
|
|
112
|
+
if (!field.fields) {
|
|
113
|
+
return getFieldType(field, options);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (field.logicalType?.type === 'LIST') {
|
|
117
|
+
const element = field.fields.list?.fields?.element || field.fields.element;
|
|
118
|
+
if (!element) {
|
|
119
|
+
// Preserve unusual legacy LIST layouts as structs. Their group names and
|
|
120
|
+
// repetition levels are still available to the row-materialization path.
|
|
121
|
+
return {type: 'struct', children: getFields(field.fields, options)};
|
|
122
|
+
}
|
|
123
|
+
if (
|
|
124
|
+
(element.logicalType?.type === 'LIST' &&
|
|
125
|
+
(!isStandardListDefinition(element) || element.optional !== false)) ||
|
|
126
|
+
(element.logicalType?.type === 'MAP' &&
|
|
127
|
+
(!isStandardMapDefinition(element) || element.optional !== false))
|
|
128
|
+
) {
|
|
129
|
+
// Preserve nested legacy wrappers. Arrow's high-level List/Map type
|
|
130
|
+
// cannot describe the historical wrapper shape without changing the
|
|
131
|
+
// object-row contract used by existing callers.
|
|
132
|
+
return {type: 'struct', children: getFields(field.fields, options)};
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
type: 'list',
|
|
136
|
+
children: [
|
|
137
|
+
{
|
|
138
|
+
name: 'element',
|
|
139
|
+
type: getFieldValueType(element, options),
|
|
140
|
+
nullable: Boolean(element.optional)
|
|
141
|
+
}
|
|
142
|
+
]
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (field.logicalType?.type === 'MAP') {
|
|
147
|
+
const entry = field.fields.key_value?.fields || field.fields;
|
|
148
|
+
const key = entry?.key;
|
|
149
|
+
const value = entry?.value;
|
|
150
|
+
if (!key || !value) {
|
|
151
|
+
// Preserve unusual legacy MAP layouts as structs rather than rejecting a
|
|
152
|
+
// file whose converted annotation does not follow the standard wrapper.
|
|
153
|
+
return {type: 'struct', children: getFields(field.fields, options)};
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
type: 'map',
|
|
157
|
+
keysSorted: false,
|
|
158
|
+
children: [
|
|
159
|
+
{
|
|
160
|
+
name: 'entries',
|
|
161
|
+
type: {
|
|
162
|
+
type: 'struct',
|
|
163
|
+
children: [
|
|
164
|
+
{name: 'key', type: getFieldValueType(key, options), nullable: false},
|
|
165
|
+
{
|
|
166
|
+
name: 'value',
|
|
167
|
+
type: getFieldValueType(value, options),
|
|
168
|
+
nullable: Boolean(value.optional)
|
|
169
|
+
}
|
|
170
|
+
]
|
|
171
|
+
},
|
|
172
|
+
nullable: false
|
|
173
|
+
}
|
|
174
|
+
]
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return {type: 'struct', children: getFields(field.fields, options)};
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/** Returns whether a nested LIST follows the standard list/list/element wrapper. */
|
|
182
|
+
function isStandardListDefinition(field: FieldDefinition): boolean {
|
|
183
|
+
return Boolean(field.fields?.list?.fields?.element);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/** Returns whether a nested MAP follows the standard map/key_value/key/value wrapper. */
|
|
187
|
+
function isStandardMapDefinition(field: FieldDefinition): boolean {
|
|
188
|
+
return Boolean(field.fields?.key_value?.fields?.key && field.fields.key_value.fields.value);
|
|
189
|
+
}
|
|
190
|
+
|
|
109
191
|
/** Returns the exact serialized Arrow type for one decoded Parquet field. */
|
|
110
|
-
function getFieldType(field: FieldDefinition): DataType {
|
|
192
|
+
function getFieldType(field: FieldDefinition, options?: {int96AsTimestamp?: boolean}): DataType {
|
|
193
|
+
if (field.type === 'INT96' && options?.int96AsTimestamp) {
|
|
194
|
+
return 'timestamp-nanosecond';
|
|
195
|
+
}
|
|
111
196
|
if (field.logicalType?.type === 'DECIMAL') {
|
|
112
197
|
const precision = field.precision ?? field.presision;
|
|
113
198
|
const scale = field.scale;
|
|
@@ -129,6 +214,15 @@ function getFieldType(field: FieldDefinition): DataType {
|
|
|
129
214
|
function getFieldMetadata(field: FieldDefinition): Record<string, string> | undefined {
|
|
130
215
|
let metadata: Record<string, string> | undefined;
|
|
131
216
|
|
|
217
|
+
if (
|
|
218
|
+
field.logicalType?.type === 'VARIANT' &&
|
|
219
|
+
field.logicalType.specificationVersion !== undefined
|
|
220
|
+
) {
|
|
221
|
+
metadata = {
|
|
222
|
+
'parquet.variant.specification_version': String(field.logicalType.specificationVersion)
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
|
|
132
226
|
for (const key in field) {
|
|
133
227
|
const fieldValue = field[key];
|
|
134
228
|
if (
|
|
@@ -416,6 +416,16 @@ function createSelectedPrimitiveData(
|
|
|
416
416
|
columnData: ParquetColumnChunk,
|
|
417
417
|
selected: SelectedLeafValues
|
|
418
418
|
): arrow.Data | undefined {
|
|
419
|
+
const directData = createSelectedPrimitiveArrayView(
|
|
420
|
+
arrowType,
|
|
421
|
+
parquetField,
|
|
422
|
+
columnData,
|
|
423
|
+
selected
|
|
424
|
+
);
|
|
425
|
+
if (directData) {
|
|
426
|
+
return arrow.makeData({type: arrowType, data: directData, nullCount: 0} as any);
|
|
427
|
+
}
|
|
428
|
+
|
|
419
429
|
const data = createNestedPrimitiveArray(arrowType, parquetField, selected.length);
|
|
420
430
|
if (!data) {
|
|
421
431
|
return undefined;
|
|
@@ -437,6 +447,75 @@ function createSelectedPrimitiveData(
|
|
|
437
447
|
} as any);
|
|
438
448
|
}
|
|
439
449
|
|
|
450
|
+
/** Reuses a contiguous decoded primitive range when nested selection needs no null expansion. */
|
|
451
|
+
function createSelectedPrimitiveArrayView(
|
|
452
|
+
arrowType: arrow.DataType,
|
|
453
|
+
parquetField: ParquetField,
|
|
454
|
+
columnData: ParquetColumnChunk,
|
|
455
|
+
selected: SelectedLeafValues
|
|
456
|
+
): NestedPrimitiveArrowArray | undefined {
|
|
457
|
+
if (selected.nullCount || selected.length !== selected.valueCount) {
|
|
458
|
+
return undefined;
|
|
459
|
+
}
|
|
460
|
+
const values = getMatchingNestedPrimitiveArray(arrowType, parquetField, columnData.values);
|
|
461
|
+
return values?.subarray(
|
|
462
|
+
selected.firstValueIndex,
|
|
463
|
+
selected.firstValueIndex + selected.valueCount
|
|
464
|
+
) as NestedPrimitiveArrowArray | undefined;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
/** Returns decoded nested values when their physical array exactly matches the Arrow type. */
|
|
468
|
+
function getMatchingNestedPrimitiveArray(
|
|
469
|
+
arrowType: arrow.DataType,
|
|
470
|
+
parquetField: ParquetField,
|
|
471
|
+
values: ParquetColumnChunk['values']
|
|
472
|
+
): NestedPrimitiveArrowArray | undefined {
|
|
473
|
+
if (
|
|
474
|
+
parquetField.primitiveType === 'FLOAT' &&
|
|
475
|
+
arrowType instanceof arrow.Float32 &&
|
|
476
|
+
values instanceof Float32Array
|
|
477
|
+
) {
|
|
478
|
+
return values;
|
|
479
|
+
}
|
|
480
|
+
if (
|
|
481
|
+
parquetField.primitiveType === 'DOUBLE' &&
|
|
482
|
+
arrowType instanceof arrow.Float64 &&
|
|
483
|
+
values instanceof Float64Array
|
|
484
|
+
) {
|
|
485
|
+
return values;
|
|
486
|
+
}
|
|
487
|
+
if (parquetField.primitiveType === 'INT32') {
|
|
488
|
+
if (arrowType instanceof arrow.Int8 && values instanceof Int8Array) return values;
|
|
489
|
+
if (arrowType instanceof arrow.Int16 && values instanceof Int16Array) return values;
|
|
490
|
+
if (
|
|
491
|
+
(arrowType instanceof arrow.Int32 ||
|
|
492
|
+
arrowType instanceof arrow.DateDay ||
|
|
493
|
+
arrowType instanceof arrow.TimeMillisecond) &&
|
|
494
|
+
values instanceof Int32Array
|
|
495
|
+
) {
|
|
496
|
+
return values;
|
|
497
|
+
}
|
|
498
|
+
if (arrowType instanceof arrow.Uint8 && values instanceof Uint8Array) return values;
|
|
499
|
+
if (arrowType instanceof arrow.Uint16 && values instanceof Uint16Array) return values;
|
|
500
|
+
if (arrowType instanceof arrow.Uint32 && values instanceof Uint32Array) return values;
|
|
501
|
+
}
|
|
502
|
+
if (parquetField.primitiveType === 'INT64') {
|
|
503
|
+
if (
|
|
504
|
+
(arrowType instanceof arrow.Int64 ||
|
|
505
|
+
arrowType instanceof arrow.TimeMicrosecond ||
|
|
506
|
+
arrowType instanceof arrow.TimeNanosecond ||
|
|
507
|
+
arrowType instanceof arrow.TimestampMillisecond ||
|
|
508
|
+
arrowType instanceof arrow.TimestampMicrosecond ||
|
|
509
|
+
arrowType instanceof arrow.TimestampNanosecond) &&
|
|
510
|
+
values instanceof BigInt64Array
|
|
511
|
+
) {
|
|
512
|
+
return values;
|
|
513
|
+
}
|
|
514
|
+
if (arrowType instanceof arrow.Uint64 && values instanceof BigUint64Array) return values;
|
|
515
|
+
}
|
|
516
|
+
return undefined;
|
|
517
|
+
}
|
|
518
|
+
|
|
440
519
|
/** Allocates the Arrow array matching an unconverted physical Parquet primitive. */
|
|
441
520
|
function createNestedPrimitiveArray(
|
|
442
521
|
arrowType: arrow.DataType,
|
|
@@ -517,6 +596,9 @@ function createSelectedByteData(
|
|
|
517
596
|
if (!supportsNestedByteData(arrowType, parquetField)) {
|
|
518
597
|
return undefined;
|
|
519
598
|
}
|
|
599
|
+
if (columnData.byteArrayData) {
|
|
600
|
+
return createSelectedBufferedByteData(arrowType, columnData, selected);
|
|
601
|
+
}
|
|
520
602
|
|
|
521
603
|
const byteValues = columnData.values as Uint8Array[];
|
|
522
604
|
const valueOffsets = new Int32Array(selected.length + 1);
|
|
@@ -556,6 +638,36 @@ function createSelectedByteData(
|
|
|
556
638
|
} as any);
|
|
557
639
|
}
|
|
558
640
|
|
|
641
|
+
/** Creates selected nested Arrow bytes from the decoder's compact physical value buffer. */
|
|
642
|
+
function createSelectedBufferedByteData(
|
|
643
|
+
arrowType: arrow.DataType,
|
|
644
|
+
columnData: ParquetColumnChunk,
|
|
645
|
+
selected: SelectedLeafValues
|
|
646
|
+
): arrow.Data {
|
|
647
|
+
const byteArrayData = columnData.byteArrayData!;
|
|
648
|
+
const valueOffsets = new Int32Array(selected.length + 1);
|
|
649
|
+
let sourceValueIndex = selected.firstValueIndex;
|
|
650
|
+
let dataByteLength = 0;
|
|
651
|
+
for (let outputIndex = 0; outputIndex < selected.length; outputIndex++) {
|
|
652
|
+
if (!selected.nullBitmap || selected.nullBitmap[outputIndex >> 3] & (1 << (outputIndex & 7))) {
|
|
653
|
+
dataByteLength +=
|
|
654
|
+
byteArrayData.valueOffsets[sourceValueIndex + 1] -
|
|
655
|
+
byteArrayData.valueOffsets[sourceValueIndex];
|
|
656
|
+
sourceValueIndex++;
|
|
657
|
+
}
|
|
658
|
+
valueOffsets[outputIndex + 1] = dataByteLength;
|
|
659
|
+
}
|
|
660
|
+
const firstByteOffset = byteArrayData.valueOffsets[selected.firstValueIndex];
|
|
661
|
+
const lastByteOffset = byteArrayData.valueOffsets[selected.firstValueIndex + selected.valueCount];
|
|
662
|
+
return arrow.makeData({
|
|
663
|
+
type: arrowType,
|
|
664
|
+
valueOffsets,
|
|
665
|
+
data: byteArrayData.data.subarray(firstByteOffset, lastByteOffset),
|
|
666
|
+
nullBitmap: selected.nullBitmap,
|
|
667
|
+
nullCount: selected.nullCount
|
|
668
|
+
} as any);
|
|
669
|
+
}
|
|
670
|
+
|
|
559
671
|
/** Returns whether one Parquet byte leaf maps directly to Arrow Utf8 or Binary. */
|
|
560
672
|
function supportsNestedByteData(arrowType: arrow.DataType, parquetField: ParquetField): boolean {
|
|
561
673
|
if (arrowType instanceof arrow.Utf8) {
|
|
@@ -564,6 +676,10 @@ function supportsNestedByteData(arrowType: arrow.DataType, parquetField: Parquet
|
|
|
564
676
|
return (
|
|
565
677
|
arrowType instanceof arrow.Binary &&
|
|
566
678
|
(!parquetField.originalType ||
|
|
679
|
+
parquetField.originalType === 'JSON' ||
|
|
680
|
+
parquetField.originalType === 'BSON' ||
|
|
681
|
+
parquetField.originalType === 'INTERVAL' ||
|
|
682
|
+
parquetField.originalType === 'VARIANT' ||
|
|
567
683
|
parquetField.originalType === 'GEOMETRY' ||
|
|
568
684
|
parquetField.originalType === 'GEOGRAPHY') &&
|
|
569
685
|
(parquetField.primitiveType === 'BYTE_ARRAY' ||
|