@loaders.gl/scan 5.0.0-alpha.3 → 5.0.0-alpha.4
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/delta.cjs +401 -0
- package/dist/delta.cjs.map +2 -2
- package/dist/dist.min.js +7 -7
- package/dist/hudi.cjs +420 -1
- package/dist/hudi.cjs.map +3 -3
- package/dist/hudi.d.ts +4 -0
- package/dist/hudi.d.ts.map +1 -1
- package/dist/hudi.js +24 -1
- package/dist/hudi.js.map +1 -1
- package/dist/iceberg.cjs +401 -0
- package/dist/iceberg.cjs.map +3 -3
- package/dist/index.cjs +7 -7
- package/dist/index.cjs.map +1 -1
- package/dist/scan-engine.d.ts.map +1 -1
- package/dist/scan-engine.js +9 -7
- package/dist/scan-engine.js.map +1 -1
- package/package.json +8 -8
- package/src/hudi.ts +36 -1
- package/src/scan-engine.ts +11 -7
package/dist/hudi.d.ts
CHANGED
|
@@ -3,9 +3,13 @@ import { DataSource } from '@loaders.gl/loader-utils';
|
|
|
3
3
|
import type { ParquetDatasetBatch, ParquetDatasetExplain, ParquetDatasetReadOptions, ParquetPredicate, ParquetDatasetSourceOptions } from '@loaders.gl/parquet/parquet-source-types';
|
|
4
4
|
/** A physical Parquet base file recorded by a Hudi snapshot descriptor. */
|
|
5
5
|
export type HudiBaseFile = Readonly<{
|
|
6
|
+
/** Path or URL of the Parquet base file. */
|
|
6
7
|
path: string;
|
|
8
|
+
/** Compressed file size in bytes, when recorded by the descriptor. */
|
|
7
9
|
size?: number;
|
|
10
|
+
/** Number of records in the base file, when recorded by the descriptor. */
|
|
8
11
|
numRecords?: number;
|
|
12
|
+
/** Partition column values associated with the base file. */
|
|
9
13
|
partitionValues?: Readonly<Record<string, unknown>>;
|
|
10
14
|
}>;
|
|
11
15
|
/** Minimal, portable descriptor used by the Hudi proof of concept. */
|
package/dist/hudi.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hudi.d.ts","sourceRoot":"","sources":["../src/hudi.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,wBAAwB,EACxB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAA0B,UAAU,EAAC,MAAM,0BAA0B,CAAC;AAG7E,OAAO,KAAK,EACV,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,gBAAgB,EAChB,2BAA2B,EAC5B,MAAM,0CAA0C,CAAC;AAElD,2EAA2E;AAC3E,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACrD,CAAC,CAAC;AAEH,sEAAsE;AACtE,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAC5C,SAAS,CAAC,EAAE,eAAe,GAAG,eAAe,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;CAChC,CAAC,CAAC;AAEH,iFAAiF;AACjF,MAAM,MAAM,iBAAiB,GAAG,2BAA2B,GAAG;IAC5D,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,WAAW,CAAC;KACvB,CAAC;CACH,CAAC;AAEF,sDAAsD;AACtD,MAAM,MAAM,eAAe,GAAG,yBAAyB,CAAC;AAExD;;;;;GAKG;AACH,qBAAa,eACX,SAAQ,UAAU,CAAC,MAAM,GAAG,IAAI,EAAE,iBAAiB,CACnD,YACE,eAAe,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,EACtD,oBAAoB,CAAC,gBAAgB,CAAC;IAExC,OAAO,CAAC,iBAAiB,CAAgD;IAEzE,oEAAoE;gBACxD,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,GAAE,iBAAsB,EAAE,OAAO,CAAC,EAAE,OAAO;IAInF,uDAAuD;IACjD,aAAa,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAU1E,+EAA+E;IACzE,gBAAgB,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAmBvF,2EAA2E;IACrE,gBAAgB,CAAC,OAAO,GAAE,wBAA6B,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAsB1F,sEAAsE;IAChE,WAAW,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAIhF,4EAA4E;IAC5E,IAAI,CAAC,OAAO,GAAE,eAAoB,GAAG,aAAa,CAAC,mBAAmB,CAAC;IAIvE,uDAAuD;IACvD,IAAI,CAAC,OAAO,GAAE,eAAoB,GAAG,aAAa,CAAC,mBAAmB,CAAC;YAIzD,cAAc;
|
|
1
|
+
{"version":3,"file":"hudi.d.ts","sourceRoot":"","sources":["../src/hudi.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,wBAAwB,EACxB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAA0B,UAAU,EAAC,MAAM,0BAA0B,CAAC;AAG7E,OAAO,KAAK,EACV,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,gBAAgB,EAChB,2BAA2B,EAC5B,MAAM,0CAA0C,CAAC;AAElD,2EAA2E;AAC3E,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACrD,CAAC,CAAC;AAEH,sEAAsE;AACtE,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAC5C,SAAS,CAAC,EAAE,eAAe,GAAG,eAAe,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;CAChC,CAAC,CAAC;AAEH,iFAAiF;AACjF,MAAM,MAAM,iBAAiB,GAAG,2BAA2B,GAAG;IAC5D,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,WAAW,CAAC;KACvB,CAAC;CACH,CAAC;AAEF,sDAAsD;AACtD,MAAM,MAAM,eAAe,GAAG,yBAAyB,CAAC;AAExD;;;;;GAKG;AACH,qBAAa,eACX,SAAQ,UAAU,CAAC,MAAM,GAAG,IAAI,EAAE,iBAAiB,CACnD,YACE,eAAe,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,EACtD,oBAAoB,CAAC,gBAAgB,CAAC;IAExC,OAAO,CAAC,iBAAiB,CAAgD;IAEzE,oEAAoE;gBACxD,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,GAAE,iBAAsB,EAAE,OAAO,CAAC,EAAE,OAAO;IAInF,uDAAuD;IACjD,aAAa,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAU1E,+EAA+E;IACzE,gBAAgB,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAmBvF,2EAA2E;IACrE,gBAAgB,CAAC,OAAO,GAAE,wBAA6B,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAsB1F,sEAAsE;IAChE,WAAW,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAIhF,4EAA4E;IAC5E,IAAI,CAAC,OAAO,GAAE,eAAoB,GAAG,aAAa,CAAC,mBAAmB,CAAC;IAIvE,uDAAuD;IACvD,IAAI,CAAC,OAAO,GAAE,eAAoB,GAAG,aAAa,CAAC,mBAAmB,CAAC;YAIzD,cAAc;IA4D5B,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,wBAAwB;IAehC,OAAO,CAAC,eAAe;CAKxB"}
|
package/dist/hudi.js
CHANGED
|
@@ -75,7 +75,7 @@ export class HudiTableSource extends DataSource {
|
|
|
75
75
|
}
|
|
76
76
|
async loadDescriptor(signal) {
|
|
77
77
|
const text = typeof this.data === 'string'
|
|
78
|
-
? await (await this.fetch(this.
|
|
78
|
+
? await (await this.fetch(this.url, { headers: this.options.hudi?.headers, signal })).text()
|
|
79
79
|
: await this.data.text();
|
|
80
80
|
let descriptor;
|
|
81
81
|
try {
|
|
@@ -90,6 +90,29 @@ export class HudiTableSource extends DataSource {
|
|
|
90
90
|
if (!Array.isArray(files)) {
|
|
91
91
|
throw new Error('Hudi snapshot descriptor must contain a files array');
|
|
92
92
|
}
|
|
93
|
+
for (const [index, file] of files.entries()) {
|
|
94
|
+
if (!file || typeof file !== 'object' || Array.isArray(file)) {
|
|
95
|
+
throw new Error(`Hudi snapshot file at index ${index} must be an object`);
|
|
96
|
+
}
|
|
97
|
+
const value = file;
|
|
98
|
+
if (typeof value.path !== 'string' || !value.path) {
|
|
99
|
+
throw new Error(`Hudi snapshot file at index ${index} must contain a non-empty string path`);
|
|
100
|
+
}
|
|
101
|
+
if (value.size !== undefined &&
|
|
102
|
+
(typeof value.size !== 'number' || !Number.isFinite(value.size))) {
|
|
103
|
+
throw new Error(`Hudi snapshot file at index ${index} size must be a finite number`);
|
|
104
|
+
}
|
|
105
|
+
if (value.numRecords !== undefined &&
|
|
106
|
+
(typeof value.numRecords !== 'number' || !Number.isFinite(value.numRecords))) {
|
|
107
|
+
throw new Error(`Hudi snapshot file at index ${index} numRecords must be a finite number`);
|
|
108
|
+
}
|
|
109
|
+
if (value.partitionValues !== undefined &&
|
|
110
|
+
(!value.partitionValues ||
|
|
111
|
+
typeof value.partitionValues !== 'object' ||
|
|
112
|
+
Array.isArray(value.partitionValues))) {
|
|
113
|
+
throw new Error(`Hudi snapshot file at index ${index} partitionValues must be an object`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
93
116
|
const value = descriptor;
|
|
94
117
|
if (value.tableType &&
|
|
95
118
|
value.tableType !== 'COPY_ON_WRITE' &&
|
package/dist/hudi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hudi.js","sourceRoot":"","sources":["../src/hudi.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,+BAA+B;AAC/B,oCAAoC;AAUpC,OAAO,EAAC,uBAAuB,EAAE,UAAU,EAAC,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAC,oBAAoB,EAAC,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAC,gCAAgC,EAAC,MAAM,iDAAiD,CAAC;
|
|
1
|
+
{"version":3,"file":"hudi.js","sourceRoot":"","sources":["../src/hudi.ts"],"names":[],"mappings":"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"}
|
package/dist/iceberg.cjs
CHANGED
|
@@ -21102,6 +21102,201 @@ var init_decoders = __esm({
|
|
|
21102
21102
|
}
|
|
21103
21103
|
});
|
|
21104
21104
|
|
|
21105
|
+
// ../parquet/src/parquetjs/parser/encoded-pages.ts
|
|
21106
|
+
async function scanParquetEncodedPages(buffer, context) {
|
|
21107
|
+
const pages = [];
|
|
21108
|
+
let offset = 0;
|
|
21109
|
+
let dataPageOrdinal = 0;
|
|
21110
|
+
while (offset < buffer.byteLength) {
|
|
21111
|
+
const { pageHeader, length: headerByteLength } = decodePageHeader(buffer, offset);
|
|
21112
|
+
const bodyOffset = offset + headerByteLength;
|
|
21113
|
+
const bodyEnd = bodyOffset + pageHeader.compressed_page_size;
|
|
21114
|
+
if (pageHeader.compressed_page_size < 0 || pageHeader.uncompressed_page_size < 0 || bodyEnd > buffer.byteLength) {
|
|
21115
|
+
throw new Error("Parquet page extends beyond the available column-chunk buffer");
|
|
21116
|
+
}
|
|
21117
|
+
const compressedBody = buffer.subarray(bodyOffset, bodyEnd);
|
|
21118
|
+
verifyEncodedPageChecksum(compressedBody, pageHeader, context.verifyPageChecksums);
|
|
21119
|
+
const pageType = getThriftEnum(PageType, pageHeader.type);
|
|
21120
|
+
if (pageType === "DICTIONARY_PAGE") {
|
|
21121
|
+
pages.push(await createDictionaryPage(compressedBody, pageHeader, context));
|
|
21122
|
+
} else if (pageType === "DATA_PAGE") {
|
|
21123
|
+
pages.push(await createDataPageV1(compressedBody, pageHeader, context, dataPageOrdinal++));
|
|
21124
|
+
} else if (pageType === "DATA_PAGE_V2") {
|
|
21125
|
+
pages.push(await createDataPageV2(compressedBody, pageHeader, context, dataPageOrdinal++));
|
|
21126
|
+
} else {
|
|
21127
|
+
throw new Error(`Unsupported Parquet page type ${pageType}`);
|
|
21128
|
+
}
|
|
21129
|
+
offset = bodyEnd;
|
|
21130
|
+
}
|
|
21131
|
+
return pages;
|
|
21132
|
+
}
|
|
21133
|
+
async function createDictionaryPage(compressedBody, pageHeader, context) {
|
|
21134
|
+
const dictionaryHeader = pageHeader.dictionary_page_header;
|
|
21135
|
+
if (!dictionaryHeader) {
|
|
21136
|
+
throw new Error("Parquet dictionary page is missing its dictionary header");
|
|
21137
|
+
}
|
|
21138
|
+
const preserveCompression = shouldPreserveCompression(context);
|
|
21139
|
+
const data = preserveCompression ? compressedBody : await decompressPageBody(compressedBody, pageHeader.uncompressed_page_size, context);
|
|
21140
|
+
return Object.freeze({
|
|
21141
|
+
type: "dictionary",
|
|
21142
|
+
pageOrdinal: -1,
|
|
21143
|
+
encoding: getThriftEnum(Encoding, dictionaryHeader.encoding),
|
|
21144
|
+
compression: context.compression,
|
|
21145
|
+
compressionState: preserveCompression ? "compressed" : "decompressed",
|
|
21146
|
+
valueCount: dictionaryHeader.num_values,
|
|
21147
|
+
nonNullValueCount: dictionaryHeader.num_values,
|
|
21148
|
+
data,
|
|
21149
|
+
values: preserveCompression ? void 0 : createSection(0, data.byteLength),
|
|
21150
|
+
compressedByteLength: pageHeader.compressed_page_size,
|
|
21151
|
+
uncompressedByteLength: pageHeader.uncompressed_page_size
|
|
21152
|
+
});
|
|
21153
|
+
}
|
|
21154
|
+
async function createDataPageV1(compressedBody, pageHeader, context, pageOrdinal) {
|
|
21155
|
+
const dataHeader = pageHeader.data_page_header;
|
|
21156
|
+
if (!dataHeader) {
|
|
21157
|
+
throw new Error("Parquet V1 data page is missing its data header");
|
|
21158
|
+
}
|
|
21159
|
+
const preserveCompression = shouldPreserveCompression(context);
|
|
21160
|
+
const data = preserveCompression ? compressedBody : await decompressPageBody(compressedBody, pageHeader.uncompressed_page_size, context);
|
|
21161
|
+
let repetitionLevels;
|
|
21162
|
+
let definitionLevels;
|
|
21163
|
+
let values;
|
|
21164
|
+
if (!preserveCompression) {
|
|
21165
|
+
let sectionOffset = 0;
|
|
21166
|
+
const repetitionLevelEncoding = getThriftEnum(Encoding, dataHeader.repetition_level_encoding);
|
|
21167
|
+
repetitionLevels = readV1LevelSection(
|
|
21168
|
+
data,
|
|
21169
|
+
sectionOffset,
|
|
21170
|
+
dataHeader.num_values,
|
|
21171
|
+
context.column.rLevelMax,
|
|
21172
|
+
repetitionLevelEncoding
|
|
21173
|
+
);
|
|
21174
|
+
sectionOffset = repetitionLevels.byteOffset + repetitionLevels.byteLength;
|
|
21175
|
+
const definitionLevelEncoding = getThriftEnum(Encoding, dataHeader.definition_level_encoding);
|
|
21176
|
+
definitionLevels = readV1LevelSection(
|
|
21177
|
+
data,
|
|
21178
|
+
sectionOffset,
|
|
21179
|
+
dataHeader.num_values,
|
|
21180
|
+
context.column.dLevelMax,
|
|
21181
|
+
definitionLevelEncoding
|
|
21182
|
+
);
|
|
21183
|
+
sectionOffset = definitionLevels.byteOffset + definitionLevels.byteLength;
|
|
21184
|
+
values = createSection(sectionOffset, data.byteLength - sectionOffset);
|
|
21185
|
+
}
|
|
21186
|
+
return Object.freeze({
|
|
21187
|
+
type: "data-v1",
|
|
21188
|
+
pageOrdinal,
|
|
21189
|
+
encoding: getThriftEnum(Encoding, dataHeader.encoding),
|
|
21190
|
+
repetitionLevelEncoding: getThriftEnum(Encoding, dataHeader.repetition_level_encoding),
|
|
21191
|
+
definitionLevelEncoding: getThriftEnum(Encoding, dataHeader.definition_level_encoding),
|
|
21192
|
+
compression: context.compression,
|
|
21193
|
+
compressionState: preserveCompression ? "compressed" : "decompressed",
|
|
21194
|
+
valueCount: dataHeader.num_values,
|
|
21195
|
+
data,
|
|
21196
|
+
repetitionLevels,
|
|
21197
|
+
definitionLevels,
|
|
21198
|
+
values,
|
|
21199
|
+
compressedByteLength: pageHeader.compressed_page_size,
|
|
21200
|
+
uncompressedByteLength: pageHeader.uncompressed_page_size
|
|
21201
|
+
});
|
|
21202
|
+
}
|
|
21203
|
+
async function createDataPageV2(compressedBody, pageHeader, context, pageOrdinal) {
|
|
21204
|
+
const dataHeader = pageHeader.data_page_header_v2;
|
|
21205
|
+
if (!dataHeader) {
|
|
21206
|
+
throw new Error("Parquet V2 data page is missing its data header");
|
|
21207
|
+
}
|
|
21208
|
+
const repetitionByteLength = dataHeader.repetition_levels_byte_length;
|
|
21209
|
+
const definitionByteLength = dataHeader.definition_levels_byte_length;
|
|
21210
|
+
const levelsByteLength = repetitionByteLength + definitionByteLength;
|
|
21211
|
+
if (levelsByteLength > compressedBody.byteLength) {
|
|
21212
|
+
throw new Error("Parquet V2 level sections extend beyond the page body");
|
|
21213
|
+
}
|
|
21214
|
+
const valuesAreCompressed = dataHeader.is_compressed !== false && context.compression !== "UNCOMPRESSED";
|
|
21215
|
+
const preserveCompression = valuesAreCompressed && shouldPreserveCompression(context);
|
|
21216
|
+
let data = compressedBody;
|
|
21217
|
+
if (valuesAreCompressed && !preserveCompression) {
|
|
21218
|
+
const uncompressedValuesByteLength = pageHeader.uncompressed_page_size - levelsByteLength;
|
|
21219
|
+
if (uncompressedValuesByteLength < 0) {
|
|
21220
|
+
throw new Error("Invalid Parquet V2 uncompressed value length");
|
|
21221
|
+
}
|
|
21222
|
+
const values = await context.decompressPage(
|
|
21223
|
+
compressedBody.subarray(levelsByteLength),
|
|
21224
|
+
uncompressedValuesByteLength
|
|
21225
|
+
);
|
|
21226
|
+
data = new Uint8Array(levelsByteLength + values.byteLength);
|
|
21227
|
+
data.set(compressedBody.subarray(0, levelsByteLength));
|
|
21228
|
+
data.set(values, levelsByteLength);
|
|
21229
|
+
}
|
|
21230
|
+
return Object.freeze({
|
|
21231
|
+
type: "data-v2",
|
|
21232
|
+
pageOrdinal,
|
|
21233
|
+
encoding: getThriftEnum(Encoding, dataHeader.encoding),
|
|
21234
|
+
repetitionLevelEncoding: "RLE",
|
|
21235
|
+
definitionLevelEncoding: "RLE",
|
|
21236
|
+
compression: context.compression,
|
|
21237
|
+
compressionState: preserveCompression ? "compressed" : "decompressed",
|
|
21238
|
+
valueCount: dataHeader.num_values,
|
|
21239
|
+
nonNullValueCount: dataHeader.num_values - dataHeader.num_nulls,
|
|
21240
|
+
data,
|
|
21241
|
+
repetitionLevels: createSection(0, repetitionByteLength),
|
|
21242
|
+
definitionLevels: createSection(repetitionByteLength, definitionByteLength),
|
|
21243
|
+
values: createSection(levelsByteLength, data.byteLength - levelsByteLength),
|
|
21244
|
+
compressedByteLength: pageHeader.compressed_page_size,
|
|
21245
|
+
uncompressedByteLength: pageHeader.uncompressed_page_size
|
|
21246
|
+
});
|
|
21247
|
+
}
|
|
21248
|
+
function shouldPreserveCompression(context) {
|
|
21249
|
+
var _a;
|
|
21250
|
+
return context.compression !== "UNCOMPRESSED" && Boolean((_a = context.preserveCompression) == null ? void 0 : _a.has(context.compression));
|
|
21251
|
+
}
|
|
21252
|
+
async function decompressPageBody(compressedBody, uncompressedByteLength, context) {
|
|
21253
|
+
if (context.compression === "UNCOMPRESSED") return compressedBody;
|
|
21254
|
+
return await context.decompressPage(compressedBody, uncompressedByteLength);
|
|
21255
|
+
}
|
|
21256
|
+
function readV1LevelSection(data, offset, valueCount, maxLevel, encoding) {
|
|
21257
|
+
if (maxLevel === 0) return createSection(offset, 0);
|
|
21258
|
+
if (encoding === "RLE") {
|
|
21259
|
+
if (offset + 4 > data.byteLength) {
|
|
21260
|
+
throw new Error("Parquet V1 RLE level stream is missing its length prefix");
|
|
21261
|
+
}
|
|
21262
|
+
const byteLength = readUInt32LE(data, offset);
|
|
21263
|
+
const byteOffset = offset + 4;
|
|
21264
|
+
assertSectionBounds(data, byteOffset, byteLength);
|
|
21265
|
+
return createSection(byteOffset, byteLength);
|
|
21266
|
+
}
|
|
21267
|
+
if (encoding === "BIT_PACKED") {
|
|
21268
|
+
const byteLength = Math.ceil(valueCount / 8) * getBitWidth(maxLevel);
|
|
21269
|
+
assertSectionBounds(data, offset, byteLength);
|
|
21270
|
+
return createSection(offset, byteLength);
|
|
21271
|
+
}
|
|
21272
|
+
throw new Error(`Unsupported Parquet V1 level encoding ${encoding}`);
|
|
21273
|
+
}
|
|
21274
|
+
function createSection(byteOffset, byteLength) {
|
|
21275
|
+
return Object.freeze({ byteOffset, byteLength });
|
|
21276
|
+
}
|
|
21277
|
+
function assertSectionBounds(data, byteOffset, byteLength) {
|
|
21278
|
+
if (byteOffset < 0 || byteLength < 0 || byteOffset + byteLength > data.byteLength) {
|
|
21279
|
+
throw new Error("Parquet page section extends beyond the page body");
|
|
21280
|
+
}
|
|
21281
|
+
}
|
|
21282
|
+
function verifyEncodedPageChecksum(compressedBody, pageHeader, verifyPageChecksums = false) {
|
|
21283
|
+
if (!verifyPageChecksums || pageHeader.crc === void 0) return;
|
|
21284
|
+
const expected = pageHeader.crc >>> 0;
|
|
21285
|
+
const actual = crc322(compressedBody);
|
|
21286
|
+
if (actual !== expected) {
|
|
21287
|
+
throw new Error(`Parquet page checksum mismatch: expected ${expected}, calculated ${actual}`);
|
|
21288
|
+
}
|
|
21289
|
+
}
|
|
21290
|
+
var init_encoded_pages = __esm({
|
|
21291
|
+
"../parquet/src/parquetjs/parser/encoded-pages.ts"() {
|
|
21292
|
+
"use strict";
|
|
21293
|
+
init_parquet_thrift();
|
|
21294
|
+
init_crc32();
|
|
21295
|
+
init_binary_utils();
|
|
21296
|
+
init_read_utils();
|
|
21297
|
+
}
|
|
21298
|
+
});
|
|
21299
|
+
|
|
21105
21300
|
// ../parquet/src/lib/parquet-encryption.ts
|
|
21106
21301
|
function readParquetEncryptedModule(buffer, offset = 0) {
|
|
21107
21302
|
if (offset + 4 > buffer.length) {
|
|
@@ -21344,6 +21539,7 @@ var init_parquet_reader = __esm({
|
|
|
21344
21539
|
"use strict";
|
|
21345
21540
|
init_schema();
|
|
21346
21541
|
init_decoders();
|
|
21542
|
+
init_encoded_pages();
|
|
21347
21543
|
init_shred();
|
|
21348
21544
|
init_compression2();
|
|
21349
21545
|
init_constants();
|
|
@@ -21830,6 +22026,50 @@ var init_parquet_reader = __esm({
|
|
|
21830
22026
|
columnData: Object.fromEntries(columnEntries)
|
|
21831
22027
|
};
|
|
21832
22028
|
}
|
|
22029
|
+
/**
|
|
22030
|
+
* Reads selected column chunks as encoded page descriptors without materializing values.
|
|
22031
|
+
*
|
|
22032
|
+
* Page headers, encryption, checksums, and optional decompression remain reader concerns. Value,
|
|
22033
|
+
* dictionary, and level decoding is deliberately left to the downstream consumer.
|
|
22034
|
+
*/
|
|
22035
|
+
async readRowGroupEncodedPages(schema, rowGroup, columnList, preserveCompression, signal, rowGroupOrdinal = 0) {
|
|
22036
|
+
await this.resolveColumnMetadata(rowGroup, rowGroupOrdinal, columnList);
|
|
22037
|
+
const selectedColumnChunks = [];
|
|
22038
|
+
for (let columnOrdinal = 0; columnOrdinal < rowGroup.columns.length; columnOrdinal++) {
|
|
22039
|
+
const columnChunk = rowGroup.columns[columnOrdinal];
|
|
22040
|
+
const path = getColumnChunkPath(columnChunk);
|
|
22041
|
+
if (columnList.length > 0 && (!path || fieldIndexOf(columnList, path) < 0)) continue;
|
|
22042
|
+
const physicalColumnOrdinal = getPhysicalColumnOrdinal(columnChunk, columnOrdinal);
|
|
22043
|
+
const metadata = columnChunk.meta_data || await this.getColumnMetadata(columnChunk, rowGroupOrdinal, physicalColumnOrdinal);
|
|
22044
|
+
if (columnList.length === 0 || fieldIndexOf(columnList, metadata.path_in_schema) >= 0) {
|
|
22045
|
+
selectedColumnChunks.push({
|
|
22046
|
+
columnChunk,
|
|
22047
|
+
metadata,
|
|
22048
|
+
columnOrdinal: physicalColumnOrdinal
|
|
22049
|
+
});
|
|
22050
|
+
}
|
|
22051
|
+
}
|
|
22052
|
+
const columns = [];
|
|
22053
|
+
for (let batchStart = 0; batchStart < selectedColumnChunks.length; batchStart += MAXIMUM_CONCURRENT_COLUMN_READS) {
|
|
22054
|
+
columns.push(
|
|
22055
|
+
...await Promise.all(
|
|
22056
|
+
selectedColumnChunks.slice(batchStart, batchStart + MAXIMUM_CONCURRENT_COLUMN_READS).map(async ({ columnChunk, metadata, columnOrdinal }) => {
|
|
22057
|
+
const encodedColumn = await this.readColumnChunkEncodedPages(
|
|
22058
|
+
schema,
|
|
22059
|
+
columnChunk,
|
|
22060
|
+
preserveCompression,
|
|
22061
|
+
signal,
|
|
22062
|
+
rowGroupOrdinal,
|
|
22063
|
+
columnOrdinal,
|
|
22064
|
+
metadata
|
|
22065
|
+
);
|
|
22066
|
+
return encodedColumn;
|
|
22067
|
+
})
|
|
22068
|
+
)
|
|
22069
|
+
);
|
|
22070
|
+
}
|
|
22071
|
+
return Object.freeze(columns);
|
|
22072
|
+
}
|
|
21833
22073
|
/** Reads independently materializable non-repeated columns for one row range using page indexes. */
|
|
21834
22074
|
async readRowGroupRange(schema, rowGroup, columnList, rowRange, pageLocations, signal, rowGroupOrdinal = 0) {
|
|
21835
22075
|
await this.resolveColumnMetadata(rowGroup, rowGroupOrdinal, columnList);
|
|
@@ -22022,6 +22262,99 @@ var init_parquet_reader = __esm({
|
|
|
22022
22262
|
) : chunkBuffer.subarray(pagesRelativeOffset, pagesRelativeOffset + pagesSize);
|
|
22023
22263
|
return await decodeDataPages(pagesBuf, { ...context, dictionary });
|
|
22024
22264
|
}
|
|
22265
|
+
/** Reads one column chunk as encoded dictionaries, levels, and values for deferred decoding. */
|
|
22266
|
+
async readColumnChunkEncodedPages(schema, columnChunk, preserveCompression, signal, rowGroupOrdinal = 0, columnOrdinal = 0, resolvedMetadata) {
|
|
22267
|
+
if (columnChunk.file_path !== void 0 && columnChunk.file_path !== null) {
|
|
22268
|
+
throw new Error("external references are not supported");
|
|
22269
|
+
}
|
|
22270
|
+
const metadata = resolvedMetadata || columnChunk.meta_data;
|
|
22271
|
+
if (!metadata) throw new Error("Parquet column metadata is missing");
|
|
22272
|
+
const field = schema.findField(metadata.path_in_schema);
|
|
22273
|
+
const physicalType = getThriftEnum(Type, metadata.type);
|
|
22274
|
+
if (physicalType !== field.primitiveType) {
|
|
22275
|
+
throw new Error(`chunk type not matching schema: ${physicalType}`);
|
|
22276
|
+
}
|
|
22277
|
+
const compression = getThriftEnum(CompressionCodec, metadata.codec);
|
|
22278
|
+
const dataPageOffset = Number(metadata.data_page_offset);
|
|
22279
|
+
const dictionaryPageOffset = metadata.dictionary_page_offset;
|
|
22280
|
+
const validDictionaryPageOffset = dictionaryPageOffset !== void 0 && Number(dictionaryPageOffset) > 0 ? Number(dictionaryPageOffset) : void 0;
|
|
22281
|
+
const chunkOffset = Math.min(dataPageOffset, validDictionaryPageOffset ?? dataPageOffset);
|
|
22282
|
+
const chunkEnd = chunkOffset + Number(metadata.total_compressed_size);
|
|
22283
|
+
const chunkByteLength = Math.min(
|
|
22284
|
+
this.file.size - chunkOffset,
|
|
22285
|
+
Math.max(0, chunkEnd - chunkOffset)
|
|
22286
|
+
);
|
|
22287
|
+
const chunkBuffer = await this.readBytes(chunkOffset, chunkByteLength, signal);
|
|
22288
|
+
const dataPageRelativeOffset = dataPageOffset - chunkOffset;
|
|
22289
|
+
const dataPageByteLength = Math.min(
|
|
22290
|
+
chunkBuffer.byteLength - dataPageRelativeOffset,
|
|
22291
|
+
Math.max(0, chunkEnd - dataPageOffset)
|
|
22292
|
+
);
|
|
22293
|
+
const context = {
|
|
22294
|
+
column: field,
|
|
22295
|
+
compression,
|
|
22296
|
+
decompressPage: this.getPageDecompressor(compression),
|
|
22297
|
+
preserveCompression,
|
|
22298
|
+
verifyPageChecksums: this.props.verifyPageChecksums
|
|
22299
|
+
};
|
|
22300
|
+
let dictionary;
|
|
22301
|
+
if (validDictionaryPageOffset !== void 0) {
|
|
22302
|
+
const dictionaryRelativeOffset = validDictionaryPageOffset - chunkOffset;
|
|
22303
|
+
const dictionaryByteLength = Math.min(
|
|
22304
|
+
Math.max(0, dataPageOffset - validDictionaryPageOffset),
|
|
22305
|
+
chunkBuffer.byteLength - dictionaryRelativeOffset,
|
|
22306
|
+
this.props.defaultDictionarySize
|
|
22307
|
+
);
|
|
22308
|
+
const dictionaryBuffer = chunkBuffer.subarray(
|
|
22309
|
+
dictionaryRelativeOffset,
|
|
22310
|
+
dictionaryRelativeOffset + dictionaryByteLength
|
|
22311
|
+
);
|
|
22312
|
+
const plaintextDictionaryBuffer = columnChunk.crypto_metadata ? await this.decryptColumnPages(
|
|
22313
|
+
dictionaryBuffer,
|
|
22314
|
+
{
|
|
22315
|
+
type: physicalType,
|
|
22316
|
+
rLevelMax: field.rLevelMax,
|
|
22317
|
+
dLevelMax: field.dLevelMax,
|
|
22318
|
+
compression,
|
|
22319
|
+
column: field
|
|
22320
|
+
},
|
|
22321
|
+
rowGroupOrdinal,
|
|
22322
|
+
columnOrdinal,
|
|
22323
|
+
this.getColumnKeyMetadata(columnChunk),
|
|
22324
|
+
true
|
|
22325
|
+
) : dictionaryBuffer;
|
|
22326
|
+
dictionary = (await scanParquetEncodedPages(plaintextDictionaryBuffer, context))[0];
|
|
22327
|
+
}
|
|
22328
|
+
const dataPageBuffer = chunkBuffer.subarray(
|
|
22329
|
+
dataPageRelativeOffset,
|
|
22330
|
+
dataPageRelativeOffset + dataPageByteLength
|
|
22331
|
+
);
|
|
22332
|
+
const plaintextDataPageBuffer = columnChunk.crypto_metadata ? await this.decryptColumnPages(
|
|
22333
|
+
dataPageBuffer,
|
|
22334
|
+
{
|
|
22335
|
+
type: physicalType,
|
|
22336
|
+
rLevelMax: field.rLevelMax,
|
|
22337
|
+
dLevelMax: field.dLevelMax,
|
|
22338
|
+
compression,
|
|
22339
|
+
column: field
|
|
22340
|
+
},
|
|
22341
|
+
rowGroupOrdinal,
|
|
22342
|
+
columnOrdinal,
|
|
22343
|
+
this.getColumnKeyMetadata(columnChunk)
|
|
22344
|
+
) : dataPageBuffer;
|
|
22345
|
+
const pages = await scanParquetEncodedPages(plaintextDataPageBuffer, context);
|
|
22346
|
+
return Object.freeze({
|
|
22347
|
+
path: Object.freeze([...metadata.path_in_schema]),
|
|
22348
|
+
physicalType,
|
|
22349
|
+
typeLength: field.typeLength,
|
|
22350
|
+
maxRepetitionLevel: field.rLevelMax,
|
|
22351
|
+
maxDefinitionLevel: field.dLevelMax,
|
|
22352
|
+
compression,
|
|
22353
|
+
valueCount: Number(metadata.num_values),
|
|
22354
|
+
dictionary,
|
|
22355
|
+
pages: Object.freeze(pages)
|
|
22356
|
+
});
|
|
22357
|
+
}
|
|
22025
22358
|
/** Decrypts the length-prefixed page header and data modules in one column chunk. */
|
|
22026
22359
|
async decryptColumnPages(encryptedPages, context, rowGroupOrdinal, columnOrdinal, keyMetadata, includesDictionary = false, dataPageOrdinalStart = 0) {
|
|
22027
22360
|
if (!this.encryptionContext || !this.props.keyRetriever) {
|
|
@@ -22845,6 +23178,7 @@ var init_parquet_source_loader = __esm({
|
|
|
22845
23178
|
init_src6();
|
|
22846
23179
|
init_src2();
|
|
22847
23180
|
init_src4();
|
|
23181
|
+
init_src5();
|
|
22848
23182
|
init_get_parquet_schema();
|
|
22849
23183
|
init_geoparquet_covering();
|
|
22850
23184
|
init_parquet_bloom_filter();
|
|
@@ -22998,6 +23332,73 @@ var init_parquet_source_loader = __esm({
|
|
|
22998
23332
|
scan(options = {}) {
|
|
22999
23333
|
return this.read(options);
|
|
23000
23334
|
}
|
|
23335
|
+
/**
|
|
23336
|
+
* Reads candidate encoded pages without decoding values or constructing Arrow arrays.
|
|
23337
|
+
*
|
|
23338
|
+
* Footer statistics and Bloom filters prune complete row groups. Any exact predicate or spatial
|
|
23339
|
+
* filter is returned as residual work, and its hidden columns are included in the page batch.
|
|
23340
|
+
*/
|
|
23341
|
+
async *readPages(options = {}) {
|
|
23342
|
+
const readOptions = this.getReadOptions({
|
|
23343
|
+
rowGroups: options.rowGroups,
|
|
23344
|
+
columns: options.columns,
|
|
23345
|
+
rowGroupFilter: options.rowGroupFilter,
|
|
23346
|
+
predicate: options.predicate,
|
|
23347
|
+
bbox: options.bbox,
|
|
23348
|
+
geometryColumn: options.geometryColumn,
|
|
23349
|
+
signal: options.signal
|
|
23350
|
+
});
|
|
23351
|
+
const readContext = createReadAbortContext(readOptions.signal);
|
|
23352
|
+
this.activeReadControllers.add(readContext.abortController);
|
|
23353
|
+
try {
|
|
23354
|
+
const initialization = await this.getInitialization(readContext.abortController.signal);
|
|
23355
|
+
await this.getCompressionInitialization();
|
|
23356
|
+
throwIfAborted2(readContext.abortController.signal);
|
|
23357
|
+
const physicalPlan = await this.planRowGroups(
|
|
23358
|
+
initialization,
|
|
23359
|
+
readOptions,
|
|
23360
|
+
readContext.abortController.signal
|
|
23361
|
+
);
|
|
23362
|
+
const projectedColumns = normalizeColumns(readOptions.columns, initialization.schema);
|
|
23363
|
+
const predicateColumns = physicalPlan.predicate ? getParquetPredicateColumns(physicalPlan.predicate) : [];
|
|
23364
|
+
const geoMetadata = readOptions.bbox ? getGeoMetadata(initialization.schema.metadata) : void 0;
|
|
23365
|
+
const geometryColumn = readOptions.bbox ? readOptions.geometryColumn || (geoMetadata == null ? void 0 : geoMetadata.primary_column) : void 0;
|
|
23366
|
+
const filterColumns = [
|
|
23367
|
+
.../* @__PURE__ */ new Set([...predicateColumns, ...geometryColumn ? [geometryColumn] : []])
|
|
23368
|
+
];
|
|
23369
|
+
const decodedColumns = projectedColumns.length === 0 ? [] : [.../* @__PURE__ */ new Set([...projectedColumns, ...filterColumns])];
|
|
23370
|
+
const columnList = decodedColumns.map((column) => [column]);
|
|
23371
|
+
const preserveCompression = new Set(options.preserveCompression ?? []);
|
|
23372
|
+
const residualFilter = readOptions.predicate || readOptions.bbox ? Object.freeze({
|
|
23373
|
+
predicate: readOptions.predicate,
|
|
23374
|
+
bbox: readOptions.bbox,
|
|
23375
|
+
geometryColumn
|
|
23376
|
+
}) : void 0;
|
|
23377
|
+
for (const rowGroupIndex of physicalPlan.rowGroupIndices) {
|
|
23378
|
+
throwIfAborted2(readContext.abortController.signal);
|
|
23379
|
+
const columns = await initialization.reader.readRowGroupEncodedPages(
|
|
23380
|
+
initialization.parquetSchema,
|
|
23381
|
+
initialization.fileMetadata.row_groups[rowGroupIndex],
|
|
23382
|
+
columnList,
|
|
23383
|
+
preserveCompression,
|
|
23384
|
+
readContext.abortController.signal,
|
|
23385
|
+
rowGroupIndex
|
|
23386
|
+
);
|
|
23387
|
+
yield Object.freeze({
|
|
23388
|
+
shape: "parquet-encoded-pages",
|
|
23389
|
+
rowGroup: initialization.metadata.rowGroups[rowGroupIndex],
|
|
23390
|
+
projectedColumns: Object.freeze([...projectedColumns]),
|
|
23391
|
+
filterColumns: Object.freeze(filterColumns),
|
|
23392
|
+
columns,
|
|
23393
|
+
residualFilter
|
|
23394
|
+
});
|
|
23395
|
+
}
|
|
23396
|
+
} finally {
|
|
23397
|
+
readContext.abortController.abort();
|
|
23398
|
+
readContext.removeSignalListener();
|
|
23399
|
+
this.activeReadControllers.delete(readContext.abortController);
|
|
23400
|
+
}
|
|
23401
|
+
}
|
|
23001
23402
|
/** Returns a copy of cumulative transport, decode, conversion, and pruning telemetry. */
|
|
23002
23403
|
getTelemetry() {
|
|
23003
23404
|
return Object.freeze({ ...this.telemetry });
|