@loaders.gl/parquet 4.4.2 → 5.0.0-alpha.1
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/dist/bundled.d.ts +6 -0
- package/dist/bundled.d.ts.map +1 -0
- package/dist/bundled.js +7 -0
- package/dist/bundled.js.map +1 -0
- package/dist/geoparquet-loader-with-parser.d.ts +34 -0
- package/dist/geoparquet-loader-with-parser.d.ts.map +1 -0
- package/dist/geoparquet-loader-with-parser.js +52 -0
- package/dist/geoparquet-loader-with-parser.js.map +1 -0
- package/dist/geoparquet-loader.d.ts +61 -0
- package/dist/geoparquet-loader.d.ts.map +1 -0
- package/dist/geoparquet-loader.js +30 -0
- package/dist/geoparquet-loader.js.map +1 -0
- package/dist/index.cjs +5879 -5643
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -11
- package/dist/index.js.map +1 -1
- package/dist/lib/constants.d.ts +1 -1
- package/dist/lib/constants.js +2 -2
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/encoders/encode-arrow-to-parquet.d.ts +2 -2
- package/dist/lib/encoders/encode-arrow-to-parquet.d.ts.map +1 -1
- package/dist/lib/encoders/encode-arrow-to-parquet.js +3 -10
- package/dist/lib/encoders/encode-arrow-to-parquet.js.map +1 -1
- package/dist/lib/encoders/encode-table-to-parquet-js.d.ts +5 -0
- package/dist/lib/encoders/encode-table-to-parquet-js.d.ts.map +1 -0
- package/dist/lib/encoders/encode-table-to-parquet-js.js +149 -0
- package/dist/lib/encoders/encode-table-to-parquet-js.js.map +1 -0
- package/dist/lib/geo/geospatial-metadata.d.ts +67 -0
- package/dist/lib/geo/geospatial-metadata.d.ts.map +1 -0
- package/dist/lib/geo/geospatial-metadata.js +357 -0
- package/dist/lib/geo/geospatial-metadata.js.map +1 -0
- 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-geoparquet-to-geojson.d.ts +4 -4
- package/dist/lib/parsers/parse-geoparquet-to-geojson.d.ts.map +1 -1
- package/dist/lib/parsers/parse-geoparquet-to-geojson.js +19 -6
- package/dist/lib/parsers/parse-geoparquet-to-geojson.js.map +1 -1
- package/dist/lib/parsers/parse-parquet-tables.d.ts +50 -0
- package/dist/lib/parsers/parse-parquet-tables.d.ts.map +1 -0
- package/dist/lib/parsers/parse-parquet-tables.js +101 -0
- package/dist/lib/parsers/parse-parquet-tables.js.map +1 -0
- package/dist/lib/parsers/parse-parquet-to-arrow-js.d.ts +6 -0
- package/dist/lib/parsers/parse-parquet-to-arrow-js.d.ts.map +1 -0
- package/dist/lib/parsers/parse-parquet-to-arrow-js.js +23 -0
- package/dist/lib/parsers/parse-parquet-to-arrow-js.js.map +1 -0
- package/dist/lib/parsers/parse-parquet-to-arrow.d.ts +7 -7
- package/dist/lib/parsers/parse-parquet-to-arrow.d.ts.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-arrow.js +45 -32
- package/dist/lib/parsers/parse-parquet-to-arrow.js.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-columns.d.ts +3 -3
- package/dist/lib/parsers/parse-parquet-to-columns.d.ts.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-columns.js +1 -4
- package/dist/lib/parsers/parse-parquet-to-columns.js.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-json.d.ts +3 -3
- package/dist/lib/parsers/parse-parquet-to-json.d.ts.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-json.js +77 -26
- package/dist/lib/parsers/parse-parquet-to-json.js.map +1 -1
- package/dist/lib/utils/load-wasm.d.ts +2 -2
- package/dist/lib/utils/load-wasm.d.ts.map +1 -1
- package/dist/lib/utils/load-wasm.js +7 -7
- package/dist/lib/utils/load-wasm.js.map +1 -1
- package/dist/lib/utils/make-stream-iterator.js +1 -1
- package/dist/lib/utils/make-stream-iterator.js.map +1 -1
- package/dist/lib/utils/normalize-parquet-options.d.ts +5 -0
- package/dist/lib/utils/normalize-parquet-options.d.ts.map +1 -0
- package/dist/lib/utils/normalize-parquet-options.js +11 -0
- package/dist/lib/utils/normalize-parquet-options.js.map +1 -0
- package/dist/parquet-format.d.ts +2 -0
- package/dist/parquet-format.d.ts.map +1 -1
- package/dist/parquet-format.js +2 -0
- package/dist/parquet-format.js.map +1 -1
- package/dist/parquet-js-loader.d.ts +57 -0
- package/dist/parquet-js-loader.d.ts.map +1 -0
- package/dist/parquet-js-loader.js +33 -0
- package/dist/parquet-js-loader.js.map +1 -0
- package/dist/parquet-js-writer.d.ts +34 -0
- package/dist/parquet-js-writer.d.ts.map +1 -0
- package/dist/parquet-js-writer.js +28 -0
- package/dist/parquet-js-writer.js.map +1 -0
- package/dist/parquet-loader-options.d.ts +56 -0
- package/dist/parquet-loader-options.d.ts.map +1 -0
- package/dist/parquet-loader-options.js +11 -0
- package/dist/parquet-loader-options.js.map +1 -0
- package/dist/parquet-loader-with-parser.d.ts +33 -0
- package/dist/parquet-loader-with-parser.d.ts.map +1 -0
- package/dist/parquet-loader-with-parser.js +40 -0
- package/dist/parquet-loader-with-parser.js.map +1 -0
- package/dist/parquet-loader.d.ts +62 -0
- package/dist/parquet-loader.d.ts.map +1 -0
- package/dist/parquet-loader.js +53 -0
- package/dist/parquet-loader.js.map +1 -0
- package/dist/parquet-wasm-loader-with-parser.d.ts +40 -0
- package/dist/parquet-wasm-loader-with-parser.d.ts.map +1 -0
- package/dist/parquet-wasm-loader-with-parser.js +68 -0
- package/dist/parquet-wasm-loader-with-parser.js.map +1 -0
- package/dist/parquet-writer.d.ts +10 -0
- package/dist/parquet-writer.d.ts.map +1 -0
- package/dist/parquet-writer.js +29 -0
- package/dist/parquet-writer.js.map +1 -0
- package/dist/parquet_wasm_bg.wasm +0 -0
- package/dist/parquetjs/codecs/declare.d.ts +2 -2
- package/dist/parquetjs/codecs/declare.d.ts.map +1 -1
- package/dist/parquetjs/codecs/dictionary.js +1 -1
- package/dist/parquetjs/codecs/dictionary.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 +36 -41
- package/dist/parquetjs/codecs/plain.js.map +1 -1
- package/dist/parquetjs/codecs/rle.d.ts +1 -1
- package/dist/parquetjs/codecs/rle.d.ts.map +1 -1
- package/dist/parquetjs/codecs/rle.js +16 -21
- package/dist/parquetjs/codecs/rle.js.map +1 -1
- package/dist/parquetjs/compression.d.ts +2 -3
- package/dist/parquetjs/compression.d.ts.map +1 -1
- package/dist/parquetjs/compression.js +4 -105
- package/dist/parquetjs/compression.js.map +1 -1
- package/dist/parquetjs/encoder/parquet-encoder.d.ts +4 -4
- package/dist/parquetjs/encoder/parquet-encoder.d.ts.map +1 -1
- package/dist/parquetjs/encoder/parquet-encoder.js +38 -33
- package/dist/parquetjs/encoder/parquet-encoder.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/ColumnIndex.js +1 -1
- package/dist/parquetjs/parquet-thrift/ColumnIndex.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/index.d.ts +0 -1
- package/dist/parquetjs/parquet-thrift/index.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/index.js +0 -1
- package/dist/parquetjs/parquet-thrift/index.js.map +1 -1
- package/dist/parquetjs/parser/decoders.d.ts +1 -1
- package/dist/parquetjs/parser/decoders.d.ts.map +1 -1
- package/dist/parquetjs/parser/decoders.js +4 -22
- package/dist/parquetjs/parser/decoders.js.map +1 -1
- package/dist/parquetjs/parser/parquet-reader.d.ts +1 -1
- package/dist/parquetjs/parser/parquet-reader.d.ts.map +1 -1
- package/dist/parquetjs/parser/parquet-reader.js +9 -9
- package/dist/parquetjs/parser/parquet-reader.js.map +1 -1
- package/dist/parquetjs/schema/declare.d.ts +1 -1
- package/dist/parquetjs/schema/declare.d.ts.map +1 -1
- package/dist/parquetjs/schema/types.d.ts.map +1 -1
- package/dist/parquetjs/schema/types.js +36 -35
- package/dist/parquetjs/schema/types.js.map +1 -1
- package/dist/parquetjs/utils/binary-utils.d.ts +39 -0
- package/dist/parquetjs/utils/binary-utils.d.ts.map +1 -0
- package/dist/parquetjs/utils/binary-utils.js +102 -0
- package/dist/parquetjs/utils/binary-utils.js.map +1 -0
- package/dist/parquetjs/utils/file-utils.d.ts +1 -1
- package/dist/parquetjs/utils/file-utils.d.ts.map +1 -1
- package/dist/parquetjs/utils/file-utils.js +3 -3
- package/dist/parquetjs/utils/file-utils.js.map +1 -1
- package/dist/parquetjs/utils/read-utils.d.ts +4 -4
- package/dist/parquetjs/utils/read-utils.d.ts.map +1 -1
- package/dist/parquetjs/utils/read-utils.js +12 -17
- package/dist/parquetjs/utils/read-utils.js.map +1 -1
- package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.d.ts +78 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.d.ts.map +1 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.js +213 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.js.map +1 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol.d.ts +78 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol.d.ts.map +1 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol.js +276 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol.js.map +1 -0
- package/dist/parquetjs/utils/uint8-array-transport.d.ts +25 -0
- package/dist/parquetjs/utils/uint8-array-transport.d.ts.map +1 -0
- package/dist/parquetjs/utils/uint8-array-transport.js +62 -0
- package/dist/parquetjs/utils/uint8-array-transport.js.map +1 -0
- package/dist/unbundled.d.ts +6 -0
- package/dist/unbundled.d.ts.map +1 -0
- package/dist/unbundled.js +7 -0
- package/dist/unbundled.js.map +1 -0
- package/package.json +21 -25
- package/src/bundled.ts +9 -0
- package/src/geoparquet-loader-with-parser.ts +95 -0
- package/src/geoparquet-loader.ts +54 -0
- package/src/index.ts +7 -25
- package/src/lib/constants.ts +1 -1
- package/src/lib/encoders/encode-arrow-to-parquet.ts +9 -15
- package/src/lib/encoders/encode-table-to-parquet-js.ts +199 -0
- package/src/lib/geo/geospatial-metadata.ts +507 -0
- package/src/lib/parsers/get-parquet-schema.ts +3 -1
- package/src/lib/parsers/parse-geoparquet-to-geojson.ts +27 -14
- package/src/lib/parsers/parse-parquet-tables.ts +137 -0
- package/src/lib/parsers/parse-parquet-to-arrow-js.ts +36 -0
- package/src/lib/parsers/parse-parquet-to-arrow.ts +63 -36
- package/src/lib/parsers/parse-parquet-to-columns.ts +6 -7
- package/src/lib/parsers/parse-parquet-to-json.ts +101 -33
- package/src/lib/utils/load-wasm.ts +16 -9
- package/src/lib/utils/make-stream-iterator.ts +1 -1
- package/src/lib/utils/normalize-parquet-options.ts +14 -0
- package/src/parquet-format.ts +2 -0
- package/src/parquet-js-loader.ts +43 -0
- package/src/parquet-js-writer.ts +52 -0
- package/src/parquet-loader-options.ts +63 -0
- package/src/parquet-loader-with-parser.ts +68 -0
- package/src/parquet-loader.ts +79 -0
- package/src/parquet-wasm-loader-with-parser.ts +115 -0
- package/src/parquet-writer.ts +44 -0
- package/src/parquetjs/codecs/declare.ts +2 -2
- package/src/parquetjs/codecs/dictionary.ts +1 -1
- package/src/parquetjs/codecs/plain.ts +67 -53
- package/src/parquetjs/codecs/rle.ts +20 -26
- package/src/parquetjs/compression.ts +7 -114
- package/src/parquetjs/encoder/parquet-encoder.ts +49 -43
- package/src/parquetjs/parquet-thrift/ColumnIndex.ts +1 -1
- package/src/parquetjs/parquet-thrift/index.ts +0 -2
- package/src/parquetjs/parser/decoders.ts +5 -23
- package/src/parquetjs/parser/parquet-reader.ts +10 -12
- package/src/parquetjs/schema/declare.ts +1 -1
- package/src/parquetjs/schema/types.ts +48 -40
- package/src/parquetjs/utils/binary-utils.ts +127 -0
- package/src/parquetjs/utils/file-utils.ts +4 -4
- package/src/parquetjs/utils/read-utils.ts +19 -34
- package/src/parquetjs/utils/uint8-array-compact-protocol-writer.ts +254 -0
- package/src/parquetjs/utils/uint8-array-compact-protocol.ts +322 -0
- package/src/parquetjs/utils/uint8-array-transport.ts +79 -0
- package/src/unbundled.ts +9 -0
- package/dist/parquet-arrow-loader.d.ts +0 -43
- package/dist/parquet-arrow-loader.d.ts.map +0 -1
- package/dist/parquet-arrow-loader.js +0 -49
- package/dist/parquet-arrow-loader.js.map +0 -1
- package/dist/parquet-arrow-writer.d.ts +0 -9
- package/dist/parquet-arrow-writer.d.ts.map +0 -1
- package/dist/parquet-arrow-writer.js +0 -23
- package/dist/parquet-arrow-writer.js.map +0 -1
- package/dist/parquet-json-loader.d.ts +0 -148
- package/dist/parquet-json-loader.d.ts.map +0 -1
- package/dist/parquet-json-loader.js +0 -106
- package/dist/parquet-json-loader.js.map +0 -1
- package/dist/parquet-json-writer.d.ts +0 -19
- package/dist/parquet-json-writer.d.ts.map +0 -1
- package/dist/parquet-json-writer.js +0 -20
- package/dist/parquet-json-writer.js.map +0 -1
- package/dist/polyfills/buffer/buffer-polyfill.browser.d.ts +0 -3
- package/dist/polyfills/buffer/buffer-polyfill.browser.d.ts.map +0 -1
- package/dist/polyfills/buffer/buffer-polyfill.browser.js +0 -12
- package/dist/polyfills/buffer/buffer-polyfill.browser.js.map +0 -1
- package/dist/polyfills/buffer/buffer-polyfill.node.d.ts +0 -3
- package/dist/polyfills/buffer/buffer-polyfill.node.d.ts.map +0 -1
- package/dist/polyfills/buffer/buffer-polyfill.node.js +0 -17
- package/dist/polyfills/buffer/buffer-polyfill.node.js.map +0 -1
- package/dist/polyfills/buffer/buffer.d.ts +0 -222
- package/dist/polyfills/buffer/buffer.d.ts.map +0 -1
- package/dist/polyfills/buffer/buffer.js +0 -1868
- package/dist/polyfills/buffer/buffer.js.map +0 -1
- package/dist/polyfills/buffer/index.d.ts +0 -4
- package/dist/polyfills/buffer/index.d.ts.map +0 -1
- package/dist/polyfills/buffer/index.js +0 -9
- package/dist/polyfills/buffer/index.js.map +0 -1
- package/dist/polyfills/buffer/install-buffer-polyfill.d.ts +0 -2
- package/dist/polyfills/buffer/install-buffer-polyfill.d.ts.map +0 -1
- package/dist/polyfills/buffer/install-buffer-polyfill.js +0 -10
- package/dist/polyfills/buffer/install-buffer-polyfill.js.map +0 -1
- package/dist/workers/parquet-json-worker.d.ts +0 -2
- package/dist/workers/parquet-json-worker.d.ts.map +0 -1
- package/dist/workers/parquet-json-worker.js +0 -7
- package/dist/workers/parquet-json-worker.js.map +0 -1
- package/src/parquet-arrow-loader.ts +0 -74
- package/src/parquet-arrow-writer.ts +0 -33
- package/src/parquet-json-loader.ts +0 -160
- package/src/parquet-json-writer.ts +0 -27
- package/src/parquetjs/modules.d.ts +0 -25
- package/src/polyfills/buffer/buffer-polyfill.browser.ts +0 -14
- package/src/polyfills/buffer/buffer-polyfill.node.ts +0 -19
- package/src/polyfills/buffer/buffer.ts +0 -2205
- package/src/polyfills/buffer/index.ts +0 -11
- package/src/polyfills/buffer/install-buffer-polyfill.ts +0 -12
- package/src/workers/parquet-json-worker.ts +0 -8
|
@@ -37,12 +37,14 @@ import {
|
|
|
37
37
|
} from '../parquet-thrift/index';
|
|
38
38
|
import {osopen, oswrite, osclose} from '../utils/file-utils';
|
|
39
39
|
import {getBitWidth, serializeThrift} from '../utils/read-utils';
|
|
40
|
-
import
|
|
40
|
+
import {concatUint8Arrays, encodeUtf8, writeUInt32LE} from '../utils/binary-utils';
|
|
41
|
+
import {CompactInt64} from '../utils/uint8-array-compact-protocol';
|
|
41
42
|
|
|
42
43
|
/**
|
|
43
44
|
* Parquet File Magic String
|
|
44
45
|
*/
|
|
45
46
|
const PARQUET_MAGIC = 'PAR1';
|
|
47
|
+
const PARQUET_MAGIC_BYTES = encodeUtf8(PARQUET_MAGIC);
|
|
46
48
|
|
|
47
49
|
/**
|
|
48
50
|
* Parquet File Format Version
|
|
@@ -82,7 +84,7 @@ export interface ParquetEncoderOptions {
|
|
|
82
84
|
* are written.
|
|
83
85
|
*/
|
|
84
86
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
85
|
-
export class ParquetEncoder<
|
|
87
|
+
export class ParquetEncoder<_T> {
|
|
86
88
|
/**
|
|
87
89
|
* Convenience method to create a new buffered parquet writer that writes to
|
|
88
90
|
* the specified file
|
|
@@ -126,8 +128,7 @@ export class ParquetEncoder<T> {
|
|
|
126
128
|
) {
|
|
127
129
|
this.schema = schema;
|
|
128
130
|
this.envelopeWriter = envelopeWriter;
|
|
129
|
-
|
|
130
|
-
this.rowBuffer = {};
|
|
131
|
+
this.rowBuffer = schema.rowGroup();
|
|
131
132
|
this.rowGroupSize = opts.rowGroupSize || PARQUET_DEFAULT_ROW_GROUP_SIZE;
|
|
132
133
|
this.closed = false;
|
|
133
134
|
this.userMetadata = {};
|
|
@@ -156,8 +157,8 @@ export class ParquetEncoder<T> {
|
|
|
156
157
|
}
|
|
157
158
|
Shred.shredRecord(this.schema, row, this.rowBuffer);
|
|
158
159
|
if (this.rowBuffer.rowCount >= this.rowGroupSize) {
|
|
159
|
-
|
|
160
|
-
this.rowBuffer =
|
|
160
|
+
await this.envelopeWriter.writeRowGroup(this.rowBuffer);
|
|
161
|
+
this.rowBuffer = this.schema.rowGroup();
|
|
161
162
|
}
|
|
162
163
|
}
|
|
163
164
|
|
|
@@ -175,8 +176,8 @@ export class ParquetEncoder<T> {
|
|
|
175
176
|
this.closed = true;
|
|
176
177
|
|
|
177
178
|
if (this.rowBuffer.rowCount > 0 || this.rowBuffer.rowCount >= this.rowGroupSize) {
|
|
178
|
-
|
|
179
|
-
this.rowBuffer =
|
|
179
|
+
await this.envelopeWriter.writeRowGroup(this.rowBuffer);
|
|
180
|
+
this.rowBuffer = this.schema.rowGroup();
|
|
180
181
|
}
|
|
181
182
|
|
|
182
183
|
await this.envelopeWriter.writeFooter(this.userMetadata);
|
|
@@ -236,7 +237,7 @@ export class ParquetEnvelopeWriter {
|
|
|
236
237
|
}
|
|
237
238
|
|
|
238
239
|
public schema: ParquetSchema;
|
|
239
|
-
public write: (buf:
|
|
240
|
+
public write: (buf: Uint8Array) => Promise<void>;
|
|
240
241
|
public close: () => Promise<void>;
|
|
241
242
|
public offset: number;
|
|
242
243
|
public rowCount: number;
|
|
@@ -246,7 +247,7 @@ export class ParquetEnvelopeWriter {
|
|
|
246
247
|
|
|
247
248
|
constructor(
|
|
248
249
|
schema: ParquetSchema,
|
|
249
|
-
writeFn: (buf:
|
|
250
|
+
writeFn: (buf: Uint8Array) => Promise<void>,
|
|
250
251
|
closeFn: () => Promise<void>,
|
|
251
252
|
fileOffset: number,
|
|
252
253
|
opts: ParquetEncoderOptions
|
|
@@ -261,7 +262,7 @@ export class ParquetEnvelopeWriter {
|
|
|
261
262
|
this.useDataPageV2 = 'useDataPageV2' in opts ? Boolean(opts.useDataPageV2) : false;
|
|
262
263
|
}
|
|
263
264
|
|
|
264
|
-
writeSection(buf:
|
|
265
|
+
writeSection(buf: Uint8Array): Promise<void> {
|
|
265
266
|
this.offset += buf.length;
|
|
266
267
|
return this.write(buf);
|
|
267
268
|
}
|
|
@@ -270,7 +271,7 @@ export class ParquetEnvelopeWriter {
|
|
|
270
271
|
* Encode the parquet file header
|
|
271
272
|
*/
|
|
272
273
|
writeHeader(): Promise<void> {
|
|
273
|
-
return this.writeSection(
|
|
274
|
+
return this.writeSection(PARQUET_MAGIC_BYTES);
|
|
274
275
|
}
|
|
275
276
|
|
|
276
277
|
/**
|
|
@@ -373,10 +374,10 @@ async function encodeDataPage(
|
|
|
373
374
|
): Promise<{
|
|
374
375
|
header: PageHeader;
|
|
375
376
|
headerSize: number;
|
|
376
|
-
page:
|
|
377
|
+
page: Uint8Array;
|
|
377
378
|
}> {
|
|
378
379
|
/* encode repetition and definition levels */
|
|
379
|
-
let rLevelsBuf:
|
|
380
|
+
let rLevelsBuf: Uint8Array = new Uint8Array(0);
|
|
380
381
|
if (column.rLevelMax > 0) {
|
|
381
382
|
rLevelsBuf = encodeValues(PARQUET_RDLVL_TYPE, PARQUET_RDLVL_ENCODING, data.rlevels, {
|
|
382
383
|
bitWidth: getBitWidth(column.rLevelMax)
|
|
@@ -384,7 +385,7 @@ async function encodeDataPage(
|
|
|
384
385
|
});
|
|
385
386
|
}
|
|
386
387
|
|
|
387
|
-
let dLevelsBuf:
|
|
388
|
+
let dLevelsBuf: Uint8Array = new Uint8Array(0);
|
|
388
389
|
if (column.dLevelMax > 0) {
|
|
389
390
|
dLevelsBuf = encodeValues(PARQUET_RDLVL_TYPE, PARQUET_RDLVL_ENCODING, data.dlevels, {
|
|
390
391
|
bitWidth: getBitWidth(column.dLevelMax)
|
|
@@ -398,7 +399,7 @@ async function encodeDataPage(
|
|
|
398
399
|
bitWidth: column.typeLength
|
|
399
400
|
});
|
|
400
401
|
|
|
401
|
-
const dataBuf =
|
|
402
|
+
const dataBuf = concatUint8Arrays([rLevelsBuf, dLevelsBuf, valuesBuf]);
|
|
402
403
|
|
|
403
404
|
// compression = column.compression === 'UNCOMPRESSED' ? (compression || 'UNCOMPRESSED') : column.compression;
|
|
404
405
|
const compressedBuf = await Compression.deflate(column.compression!, dataBuf);
|
|
@@ -418,7 +419,7 @@ async function encodeDataPage(
|
|
|
418
419
|
|
|
419
420
|
/* concat page header, repetition and definition levels and values */
|
|
420
421
|
const headerBuf = serializeThrift(header);
|
|
421
|
-
const page =
|
|
422
|
+
const page = concatUint8Arrays([headerBuf, compressedBuf]);
|
|
422
423
|
|
|
423
424
|
return {header, headerSize: headerBuf.length, page};
|
|
424
425
|
}
|
|
@@ -433,7 +434,7 @@ async function encodeDataPageV2(
|
|
|
433
434
|
): Promise<{
|
|
434
435
|
header: PageHeader;
|
|
435
436
|
headerSize: number;
|
|
436
|
-
page:
|
|
437
|
+
page: Uint8Array;
|
|
437
438
|
}> {
|
|
438
439
|
/* encode values */
|
|
439
440
|
const valuesBuf = encodeValues(column.primitiveType!, column.encoding!, data.values, {
|
|
@@ -445,7 +446,7 @@ async function encodeDataPageV2(
|
|
|
445
446
|
const compressedBuf = await Compression.deflate(column.compression!, valuesBuf);
|
|
446
447
|
|
|
447
448
|
/* encode repetition and definition levels */
|
|
448
|
-
let rLevelsBuf:
|
|
449
|
+
let rLevelsBuf: Uint8Array = new Uint8Array(0);
|
|
449
450
|
if (column.rLevelMax > 0) {
|
|
450
451
|
rLevelsBuf = encodeValues(PARQUET_RDLVL_TYPE, PARQUET_RDLVL_ENCODING, data.rlevels, {
|
|
451
452
|
bitWidth: getBitWidth(column.rLevelMax),
|
|
@@ -453,7 +454,7 @@ async function encodeDataPageV2(
|
|
|
453
454
|
});
|
|
454
455
|
}
|
|
455
456
|
|
|
456
|
-
let dLevelsBuf:
|
|
457
|
+
let dLevelsBuf: Uint8Array = new Uint8Array(0);
|
|
457
458
|
if (column.dLevelMax > 0) {
|
|
458
459
|
dLevelsBuf = encodeValues(PARQUET_RDLVL_TYPE, PARQUET_RDLVL_ENCODING, data.dlevels, {
|
|
459
460
|
bitWidth: getBitWidth(column.dLevelMax),
|
|
@@ -479,7 +480,7 @@ async function encodeDataPageV2(
|
|
|
479
480
|
|
|
480
481
|
/* concat page header, repetition and definition levels and values */
|
|
481
482
|
const headerBuf = serializeThrift(header);
|
|
482
|
-
const page =
|
|
483
|
+
const page = concatUint8Arrays([headerBuf, rLevelsBuf, dLevelsBuf, compressedBuf]);
|
|
483
484
|
return {header, headerSize: headerBuf.length, page};
|
|
484
485
|
}
|
|
485
486
|
|
|
@@ -492,15 +493,15 @@ async function encodeColumnChunk(
|
|
|
492
493
|
offset: number,
|
|
493
494
|
opts: ParquetEncoderOptions
|
|
494
495
|
): Promise<{
|
|
495
|
-
body:
|
|
496
|
+
body: Uint8Array;
|
|
496
497
|
metadata: ColumnMetaData;
|
|
497
498
|
metadataOffset: number;
|
|
498
499
|
}> {
|
|
499
500
|
const data = buffer.columnData[column.path.join()];
|
|
500
501
|
const baseOffset = (opts.baseOffset || 0) + offset;
|
|
501
502
|
/* encode data page(s) */
|
|
502
|
-
// const pages:
|
|
503
|
-
let pageBuf:
|
|
503
|
+
// const pages: Uint8Array[] = [];
|
|
504
|
+
let pageBuf: Uint8Array;
|
|
504
505
|
// tslint:disable-next-line:variable-name
|
|
505
506
|
let total_uncompressed_size = 0;
|
|
506
507
|
// tslint:disable-next-line:variable-name
|
|
@@ -515,17 +516,17 @@ async function encodeColumnChunk(
|
|
|
515
516
|
total_compressed_size += result.header.compressed_page_size + result.headerSize;
|
|
516
517
|
}
|
|
517
518
|
|
|
518
|
-
// const pagesBuf =
|
|
519
|
+
// const pagesBuf = concatUint8Arrays(pages);
|
|
519
520
|
// const compression = column.compression === 'UNCOMPRESSED' ? (opts.compression || 'UNCOMPRESSED') : column.compression;
|
|
520
521
|
|
|
521
522
|
/* prepare metadata header */
|
|
522
523
|
const metadata = new ColumnMetaData({
|
|
523
524
|
path_in_schema: column.path,
|
|
524
|
-
num_values: data.count,
|
|
525
|
-
data_page_offset: baseOffset,
|
|
525
|
+
num_values: int64(data.count),
|
|
526
|
+
data_page_offset: int64(baseOffset),
|
|
526
527
|
encodings: [],
|
|
527
|
-
total_uncompressed_size, // : pagesBuf.length,
|
|
528
|
-
total_compressed_size,
|
|
528
|
+
total_uncompressed_size: int64(total_uncompressed_size), // : pagesBuf.length,
|
|
529
|
+
total_compressed_size: int64(total_compressed_size),
|
|
529
530
|
type: Type[column.primitiveType!],
|
|
530
531
|
codec: CompressionCodec[column.compression!]
|
|
531
532
|
});
|
|
@@ -536,7 +537,7 @@ async function encodeColumnChunk(
|
|
|
536
537
|
|
|
537
538
|
/* concat metadata header and data pages */
|
|
538
539
|
const metadataOffset = baseOffset + pageBuf.length;
|
|
539
|
-
const body =
|
|
540
|
+
const body = concatUint8Arrays([pageBuf, serializeThrift(metadata)]);
|
|
540
541
|
return {body, metadata, metadataOffset};
|
|
541
542
|
}
|
|
542
543
|
|
|
@@ -548,16 +549,16 @@ async function encodeRowGroup(
|
|
|
548
549
|
data: ParquetRowGroup,
|
|
549
550
|
opts: ParquetEncoderOptions
|
|
550
551
|
): Promise<{
|
|
551
|
-
body:
|
|
552
|
+
body: Uint8Array;
|
|
552
553
|
metadata: RowGroup;
|
|
553
554
|
}> {
|
|
554
555
|
const metadata = new RowGroup({
|
|
555
|
-
num_rows: data.rowCount,
|
|
556
|
+
num_rows: int64(data.rowCount),
|
|
556
557
|
columns: [],
|
|
557
|
-
total_byte_size: 0
|
|
558
|
+
total_byte_size: int64(0)
|
|
558
559
|
});
|
|
559
560
|
|
|
560
|
-
let body =
|
|
561
|
+
let body: Uint8Array = new Uint8Array(0);
|
|
561
562
|
for (const field of schema.fieldList) {
|
|
562
563
|
if (field.isNested) {
|
|
563
564
|
continue; // eslint-disable-line no-continue
|
|
@@ -566,14 +567,14 @@ async function encodeRowGroup(
|
|
|
566
567
|
const cchunkData = await encodeColumnChunk(field, data, body.length, opts);
|
|
567
568
|
|
|
568
569
|
const cchunk = new ColumnChunk({
|
|
569
|
-
file_offset: cchunkData.metadataOffset,
|
|
570
|
+
file_offset: int64(cchunkData.metadataOffset),
|
|
570
571
|
meta_data: cchunkData.metadata
|
|
571
572
|
});
|
|
572
573
|
|
|
573
574
|
metadata.columns.push(cchunk);
|
|
574
|
-
metadata.total_byte_size =
|
|
575
|
+
metadata.total_byte_size = int64(Number(metadata.total_byte_size) + cchunkData.body.length);
|
|
575
576
|
|
|
576
|
-
body =
|
|
577
|
+
body = concatUint8Arrays([body, cchunkData.body]);
|
|
577
578
|
}
|
|
578
579
|
|
|
579
580
|
return {body, metadata};
|
|
@@ -587,11 +588,11 @@ function encodeFooter(
|
|
|
587
588
|
rowCount: number,
|
|
588
589
|
rowGroups: RowGroup[],
|
|
589
590
|
userMetadata: Record<string, string>
|
|
590
|
-
):
|
|
591
|
+
): Uint8Array {
|
|
591
592
|
const metadata = new FileMetaData({
|
|
592
593
|
version: PARQUET_VERSION,
|
|
593
594
|
created_by: 'parquets',
|
|
594
|
-
num_rows: rowCount,
|
|
595
|
+
num_rows: int64(rowCount),
|
|
595
596
|
row_groups: rowGroups,
|
|
596
597
|
schema: [],
|
|
597
598
|
key_value_metadata: []
|
|
@@ -636,10 +637,15 @@ function encodeFooter(
|
|
|
636
637
|
}
|
|
637
638
|
|
|
638
639
|
const metadataEncoded = serializeThrift(metadata);
|
|
639
|
-
const footerEncoded =
|
|
640
|
+
const footerEncoded = new Uint8Array(metadataEncoded.length + 8);
|
|
640
641
|
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
footerEncoded.
|
|
642
|
+
footerEncoded.set(metadataEncoded);
|
|
643
|
+
writeUInt32LE(footerEncoded, metadataEncoded.length, metadataEncoded.length);
|
|
644
|
+
footerEncoded.set(PARQUET_MAGIC_BYTES, metadataEncoded.length + 4);
|
|
644
645
|
return footerEncoded;
|
|
645
646
|
}
|
|
647
|
+
|
|
648
|
+
/** Wrap a writer metadata number in the thrift int64 compatibility object. */
|
|
649
|
+
function int64(value: number): any {
|
|
650
|
+
return new CompactInt64(BigInt(value));
|
|
651
|
+
}
|
|
@@ -60,7 +60,7 @@ export class ColumnIndex {
|
|
|
60
60
|
);
|
|
61
61
|
}
|
|
62
62
|
if (args != null && args.null_counts != null) {
|
|
63
|
-
this.null_counts = args.null_counts.map(
|
|
63
|
+
this.null_counts = args.null_counts.map(c => new Int64(+c));
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
public write(output: thrift.TProtocol): void {
|
|
@@ -10,8 +10,6 @@
|
|
|
10
10
|
* Autogenerated by @creditkarma/thrift-typescript v3.7.2
|
|
11
11
|
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
|
|
12
12
|
*/
|
|
13
|
-
export {Buffer} from '../../polyfills/buffer/install-buffer-polyfill';
|
|
14
|
-
|
|
15
13
|
export {TBufferedTransport, TCompactProtocol, TFramedTransport} from 'thrift';
|
|
16
14
|
|
|
17
15
|
export * from './Type';
|
|
@@ -35,7 +35,7 @@ import {decodePageHeader, getThriftEnum, getBitWidth} from '../utils/read-utils'
|
|
|
35
35
|
* @returns parquet data page data
|
|
36
36
|
*/
|
|
37
37
|
export async function decodeDataPages(
|
|
38
|
-
buffer:
|
|
38
|
+
buffer: Uint8Array,
|
|
39
39
|
context: ParquetReaderContext
|
|
40
40
|
): Promise<ParquetColumnChunk> {
|
|
41
41
|
const cursor: CursorBuffer = {
|
|
@@ -76,7 +76,7 @@ export async function decodeDataPages(
|
|
|
76
76
|
// of 'PLAIN' encoding because all values are already in place
|
|
77
77
|
if (dictionary.length && valueEncoding !== 'PLAIN') {
|
|
78
78
|
// eslint-disable-next-line no-loop-func
|
|
79
|
-
page.values = page.values.map(
|
|
79
|
+
page.values = page.values.map(value => dictionary[value]);
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
for (let index = 0; index < page.rlevels.length; index++) {
|
|
@@ -187,7 +187,7 @@ export function decodeSchema(
|
|
|
187
187
|
const type = getThriftEnum(Type, schemaElement.type!);
|
|
188
188
|
let logicalType = type;
|
|
189
189
|
|
|
190
|
-
if (schemaElement.converted_type) {
|
|
190
|
+
if (schemaElement.converted_type !== undefined && schemaElement.converted_type !== null) {
|
|
191
191
|
logicalType = getThriftEnum(ConvertedType, schemaElement.converted_type);
|
|
192
192
|
}
|
|
193
193
|
|
|
@@ -435,7 +435,7 @@ async function decodeDictionaryPage(
|
|
|
435
435
|
if (context.compression !== 'UNCOMPRESSED') {
|
|
436
436
|
const valuesBuf = await decompress(
|
|
437
437
|
context.compression,
|
|
438
|
-
dictCursor.buffer.
|
|
438
|
+
dictCursor.buffer.subarray(dictCursor.offset),
|
|
439
439
|
pageHeader.uncompressed_page_size
|
|
440
440
|
);
|
|
441
441
|
|
|
@@ -459,23 +459,5 @@ async function decodeDictionaryPage(
|
|
|
459
459
|
context as ParquetCodecOptions
|
|
460
460
|
);
|
|
461
461
|
|
|
462
|
-
|
|
463
|
-
let values: any[];
|
|
464
|
-
if (context?.preserveBinary) {
|
|
465
|
-
values = decodedDictionaryValues.map((d) => preserveBinary(d));
|
|
466
|
-
} else {
|
|
467
|
-
values = decodedDictionaryValues.map((d) => d.toString());
|
|
468
|
-
}
|
|
469
|
-
return values;
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
function preserveBinary(d: any): ArrayBuffer | ArrayBufferView | string {
|
|
473
|
-
if (ArrayBuffer.isView(d)) {
|
|
474
|
-
return d;
|
|
475
|
-
}
|
|
476
|
-
// Convert to ArrayBuffer
|
|
477
|
-
if (Buffer.isBuffer(d)) {
|
|
478
|
-
return new Uint8Array(d.buffer, d.byteOffset, d.byteLength).slice().buffer;
|
|
479
|
-
}
|
|
480
|
-
return d.toString();
|
|
462
|
+
return decodedDictionaryValues;
|
|
481
463
|
}
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
ParquetReaderContext
|
|
21
21
|
} from '../schema/declare';
|
|
22
22
|
import {decodeFileMetadata, getThriftEnum, fieldIndexOf} from '../utils/read-utils';
|
|
23
|
+
import {decodeString, readUInt32LE, toUint8Array} from '../utils/binary-utils';
|
|
23
24
|
|
|
24
25
|
export type ParquetReaderProps = {
|
|
25
26
|
defaultDictionarySize?: number;
|
|
@@ -82,9 +83,7 @@ export class ParquetReader {
|
|
|
82
83
|
/** Iterate over the raw row groups */
|
|
83
84
|
async *rowGroupIterator(props?: ParquetIterationProps) {
|
|
84
85
|
// Ensure strings are nested in arrays
|
|
85
|
-
const columnList: string[][] = (props?.columnList || []).map((x)
|
|
86
|
-
Array.isArray(x) ? x : [x]
|
|
87
|
-
);
|
|
86
|
+
const columnList: string[][] = (props?.columnList || []).map(x => (Array.isArray(x) ? x : [x]));
|
|
88
87
|
|
|
89
88
|
const metadata = await this.getFileMetadata();
|
|
90
89
|
const schema = await this.getSchema();
|
|
@@ -140,8 +139,7 @@ export class ParquetReader {
|
|
|
140
139
|
/** Metadata is stored in the footer */
|
|
141
140
|
async readHeader(): Promise<void> {
|
|
142
141
|
const arrayBuffer = await this.file.read(0, PARQUET_MAGIC.length);
|
|
143
|
-
const
|
|
144
|
-
const magic = buffer.toString();
|
|
142
|
+
const magic = decodeString(toUint8Array(arrayBuffer));
|
|
145
143
|
switch (magic) {
|
|
146
144
|
case PARQUET_MAGIC:
|
|
147
145
|
break;
|
|
@@ -156,21 +154,21 @@ export class ParquetReader {
|
|
|
156
154
|
async readFooter(): Promise<FileMetaData> {
|
|
157
155
|
const trailerLen = PARQUET_MAGIC.length + 4;
|
|
158
156
|
const arrayBuffer = await this.file.read(this.file.size - trailerLen, trailerLen);
|
|
159
|
-
const
|
|
157
|
+
const trailer = toUint8Array(arrayBuffer);
|
|
160
158
|
|
|
161
|
-
const magic =
|
|
159
|
+
const magic = decodeString(trailer, 4);
|
|
162
160
|
if (magic !== PARQUET_MAGIC) {
|
|
163
161
|
throw new Error(`Not a valid parquet file (magic="${magic})`);
|
|
164
162
|
}
|
|
165
163
|
|
|
166
|
-
const metadataSize =
|
|
164
|
+
const metadataSize = readUInt32LE(trailer, 0);
|
|
167
165
|
const metadataOffset = this.file.size - metadataSize - trailerLen;
|
|
168
166
|
if (metadataOffset < PARQUET_MAGIC.length) {
|
|
169
167
|
throw new Error(`Invalid metadata size ${metadataOffset}`);
|
|
170
168
|
}
|
|
171
169
|
|
|
172
170
|
const arrayBuffer2 = await this.file.read(metadataOffset, metadataSize);
|
|
173
|
-
const metadataBuf =
|
|
171
|
+
const metadataBuf = toUint8Array(arrayBuffer2);
|
|
174
172
|
// let metadata = new parquet_thrift.FileMetaData();
|
|
175
173
|
// parquet_util.decodeThrift(metadata, metadataBuf);
|
|
176
174
|
|
|
@@ -253,7 +251,7 @@ export class ParquetReader {
|
|
|
253
251
|
|
|
254
252
|
dictionary = context.dictionary?.length ? context.dictionary : dictionary;
|
|
255
253
|
const arrayBuffer = await this.file.read(pagesOffset, pagesSize);
|
|
256
|
-
const pagesBuf =
|
|
254
|
+
const pagesBuf = toUint8Array(arrayBuffer);
|
|
257
255
|
return await decodeDataPages(pagesBuf, {...context, dictionary});
|
|
258
256
|
}
|
|
259
257
|
|
|
@@ -268,7 +266,7 @@ export class ParquetReader {
|
|
|
268
266
|
dictionaryPageOffset: number,
|
|
269
267
|
context: ParquetReaderContext,
|
|
270
268
|
pagesOffset: number
|
|
271
|
-
): Promise<
|
|
269
|
+
): Promise<any[]> {
|
|
272
270
|
if (dictionaryPageOffset === 0) {
|
|
273
271
|
// dictionarySize = Math.min(this.fileSize - pagesOffset, this.defaultDictionarySize);
|
|
274
272
|
// pagesBuf = await this.read(pagesOffset, dictionarySize);
|
|
@@ -285,7 +283,7 @@ export class ParquetReader {
|
|
|
285
283
|
this.props.defaultDictionarySize
|
|
286
284
|
);
|
|
287
285
|
const arrayBuffer = await this.file.read(dictionaryPageOffset, dictionarySize);
|
|
288
|
-
const pagesBuf =
|
|
286
|
+
const pagesBuf = toUint8Array(arrayBuffer);
|
|
289
287
|
|
|
290
288
|
const cursor = {buffer: pagesBuf, offset: 0, size: pagesBuf.length};
|
|
291
289
|
const decodedPage = await decodePage(cursor, context);
|