@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.
Files changed (267) hide show
  1. package/dist/bundled.d.ts +6 -0
  2. package/dist/bundled.d.ts.map +1 -0
  3. package/dist/bundled.js +7 -0
  4. package/dist/bundled.js.map +1 -0
  5. package/dist/geoparquet-loader-with-parser.d.ts +34 -0
  6. package/dist/geoparquet-loader-with-parser.d.ts.map +1 -0
  7. package/dist/geoparquet-loader-with-parser.js +52 -0
  8. package/dist/geoparquet-loader-with-parser.js.map +1 -0
  9. package/dist/geoparquet-loader.d.ts +61 -0
  10. package/dist/geoparquet-loader.d.ts.map +1 -0
  11. package/dist/geoparquet-loader.js +30 -0
  12. package/dist/geoparquet-loader.js.map +1 -0
  13. package/dist/index.cjs +5879 -5643
  14. package/dist/index.cjs.map +4 -4
  15. package/dist/index.d.ts +7 -7
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +5 -11
  18. package/dist/index.js.map +1 -1
  19. package/dist/lib/constants.d.ts +1 -1
  20. package/dist/lib/constants.js +2 -2
  21. package/dist/lib/constants.js.map +1 -1
  22. package/dist/lib/encoders/encode-arrow-to-parquet.d.ts +2 -2
  23. package/dist/lib/encoders/encode-arrow-to-parquet.d.ts.map +1 -1
  24. package/dist/lib/encoders/encode-arrow-to-parquet.js +3 -10
  25. package/dist/lib/encoders/encode-arrow-to-parquet.js.map +1 -1
  26. package/dist/lib/encoders/encode-table-to-parquet-js.d.ts +5 -0
  27. package/dist/lib/encoders/encode-table-to-parquet-js.d.ts.map +1 -0
  28. package/dist/lib/encoders/encode-table-to-parquet-js.js +149 -0
  29. package/dist/lib/encoders/encode-table-to-parquet-js.js.map +1 -0
  30. package/dist/lib/geo/geospatial-metadata.d.ts +67 -0
  31. package/dist/lib/geo/geospatial-metadata.d.ts.map +1 -0
  32. package/dist/lib/geo/geospatial-metadata.js +357 -0
  33. package/dist/lib/geo/geospatial-metadata.js.map +1 -0
  34. package/dist/lib/parsers/get-parquet-schema.d.ts.map +1 -1
  35. package/dist/lib/parsers/get-parquet-schema.js +3 -1
  36. package/dist/lib/parsers/get-parquet-schema.js.map +1 -1
  37. package/dist/lib/parsers/parse-geoparquet-to-geojson.d.ts +4 -4
  38. package/dist/lib/parsers/parse-geoparquet-to-geojson.d.ts.map +1 -1
  39. package/dist/lib/parsers/parse-geoparquet-to-geojson.js +19 -6
  40. package/dist/lib/parsers/parse-geoparquet-to-geojson.js.map +1 -1
  41. package/dist/lib/parsers/parse-parquet-tables.d.ts +50 -0
  42. package/dist/lib/parsers/parse-parquet-tables.d.ts.map +1 -0
  43. package/dist/lib/parsers/parse-parquet-tables.js +101 -0
  44. package/dist/lib/parsers/parse-parquet-tables.js.map +1 -0
  45. package/dist/lib/parsers/parse-parquet-to-arrow-js.d.ts +6 -0
  46. package/dist/lib/parsers/parse-parquet-to-arrow-js.d.ts.map +1 -0
  47. package/dist/lib/parsers/parse-parquet-to-arrow-js.js +23 -0
  48. package/dist/lib/parsers/parse-parquet-to-arrow-js.js.map +1 -0
  49. package/dist/lib/parsers/parse-parquet-to-arrow.d.ts +7 -7
  50. package/dist/lib/parsers/parse-parquet-to-arrow.d.ts.map +1 -1
  51. package/dist/lib/parsers/parse-parquet-to-arrow.js +45 -32
  52. package/dist/lib/parsers/parse-parquet-to-arrow.js.map +1 -1
  53. package/dist/lib/parsers/parse-parquet-to-columns.d.ts +3 -3
  54. package/dist/lib/parsers/parse-parquet-to-columns.d.ts.map +1 -1
  55. package/dist/lib/parsers/parse-parquet-to-columns.js +1 -4
  56. package/dist/lib/parsers/parse-parquet-to-columns.js.map +1 -1
  57. package/dist/lib/parsers/parse-parquet-to-json.d.ts +3 -3
  58. package/dist/lib/parsers/parse-parquet-to-json.d.ts.map +1 -1
  59. package/dist/lib/parsers/parse-parquet-to-json.js +77 -26
  60. package/dist/lib/parsers/parse-parquet-to-json.js.map +1 -1
  61. package/dist/lib/utils/load-wasm.d.ts +2 -2
  62. package/dist/lib/utils/load-wasm.d.ts.map +1 -1
  63. package/dist/lib/utils/load-wasm.js +7 -7
  64. package/dist/lib/utils/load-wasm.js.map +1 -1
  65. package/dist/lib/utils/make-stream-iterator.js +1 -1
  66. package/dist/lib/utils/make-stream-iterator.js.map +1 -1
  67. package/dist/lib/utils/normalize-parquet-options.d.ts +5 -0
  68. package/dist/lib/utils/normalize-parquet-options.d.ts.map +1 -0
  69. package/dist/lib/utils/normalize-parquet-options.js +11 -0
  70. package/dist/lib/utils/normalize-parquet-options.js.map +1 -0
  71. package/dist/parquet-format.d.ts +2 -0
  72. package/dist/parquet-format.d.ts.map +1 -1
  73. package/dist/parquet-format.js +2 -0
  74. package/dist/parquet-format.js.map +1 -1
  75. package/dist/parquet-js-loader.d.ts +57 -0
  76. package/dist/parquet-js-loader.d.ts.map +1 -0
  77. package/dist/parquet-js-loader.js +33 -0
  78. package/dist/parquet-js-loader.js.map +1 -0
  79. package/dist/parquet-js-writer.d.ts +34 -0
  80. package/dist/parquet-js-writer.d.ts.map +1 -0
  81. package/dist/parquet-js-writer.js +28 -0
  82. package/dist/parquet-js-writer.js.map +1 -0
  83. package/dist/parquet-loader-options.d.ts +56 -0
  84. package/dist/parquet-loader-options.d.ts.map +1 -0
  85. package/dist/parquet-loader-options.js +11 -0
  86. package/dist/parquet-loader-options.js.map +1 -0
  87. package/dist/parquet-loader-with-parser.d.ts +33 -0
  88. package/dist/parquet-loader-with-parser.d.ts.map +1 -0
  89. package/dist/parquet-loader-with-parser.js +40 -0
  90. package/dist/parquet-loader-with-parser.js.map +1 -0
  91. package/dist/parquet-loader.d.ts +62 -0
  92. package/dist/parquet-loader.d.ts.map +1 -0
  93. package/dist/parquet-loader.js +53 -0
  94. package/dist/parquet-loader.js.map +1 -0
  95. package/dist/parquet-wasm-loader-with-parser.d.ts +40 -0
  96. package/dist/parquet-wasm-loader-with-parser.d.ts.map +1 -0
  97. package/dist/parquet-wasm-loader-with-parser.js +68 -0
  98. package/dist/parquet-wasm-loader-with-parser.js.map +1 -0
  99. package/dist/parquet-writer.d.ts +10 -0
  100. package/dist/parquet-writer.d.ts.map +1 -0
  101. package/dist/parquet-writer.js +29 -0
  102. package/dist/parquet-writer.js.map +1 -0
  103. package/dist/parquet_wasm_bg.wasm +0 -0
  104. package/dist/parquetjs/codecs/declare.d.ts +2 -2
  105. package/dist/parquetjs/codecs/declare.d.ts.map +1 -1
  106. package/dist/parquetjs/codecs/dictionary.js +1 -1
  107. package/dist/parquetjs/codecs/dictionary.js.map +1 -1
  108. package/dist/parquetjs/codecs/plain.d.ts +1 -1
  109. package/dist/parquetjs/codecs/plain.d.ts.map +1 -1
  110. package/dist/parquetjs/codecs/plain.js +36 -41
  111. package/dist/parquetjs/codecs/plain.js.map +1 -1
  112. package/dist/parquetjs/codecs/rle.d.ts +1 -1
  113. package/dist/parquetjs/codecs/rle.d.ts.map +1 -1
  114. package/dist/parquetjs/codecs/rle.js +16 -21
  115. package/dist/parquetjs/codecs/rle.js.map +1 -1
  116. package/dist/parquetjs/compression.d.ts +2 -3
  117. package/dist/parquetjs/compression.d.ts.map +1 -1
  118. package/dist/parquetjs/compression.js +4 -105
  119. package/dist/parquetjs/compression.js.map +1 -1
  120. package/dist/parquetjs/encoder/parquet-encoder.d.ts +4 -4
  121. package/dist/parquetjs/encoder/parquet-encoder.d.ts.map +1 -1
  122. package/dist/parquetjs/encoder/parquet-encoder.js +38 -33
  123. package/dist/parquetjs/encoder/parquet-encoder.js.map +1 -1
  124. package/dist/parquetjs/parquet-thrift/ColumnIndex.js +1 -1
  125. package/dist/parquetjs/parquet-thrift/ColumnIndex.js.map +1 -1
  126. package/dist/parquetjs/parquet-thrift/index.d.ts +0 -1
  127. package/dist/parquetjs/parquet-thrift/index.d.ts.map +1 -1
  128. package/dist/parquetjs/parquet-thrift/index.js +0 -1
  129. package/dist/parquetjs/parquet-thrift/index.js.map +1 -1
  130. package/dist/parquetjs/parser/decoders.d.ts +1 -1
  131. package/dist/parquetjs/parser/decoders.d.ts.map +1 -1
  132. package/dist/parquetjs/parser/decoders.js +4 -22
  133. package/dist/parquetjs/parser/decoders.js.map +1 -1
  134. package/dist/parquetjs/parser/parquet-reader.d.ts +1 -1
  135. package/dist/parquetjs/parser/parquet-reader.d.ts.map +1 -1
  136. package/dist/parquetjs/parser/parquet-reader.js +9 -9
  137. package/dist/parquetjs/parser/parquet-reader.js.map +1 -1
  138. package/dist/parquetjs/schema/declare.d.ts +1 -1
  139. package/dist/parquetjs/schema/declare.d.ts.map +1 -1
  140. package/dist/parquetjs/schema/types.d.ts.map +1 -1
  141. package/dist/parquetjs/schema/types.js +36 -35
  142. package/dist/parquetjs/schema/types.js.map +1 -1
  143. package/dist/parquetjs/utils/binary-utils.d.ts +39 -0
  144. package/dist/parquetjs/utils/binary-utils.d.ts.map +1 -0
  145. package/dist/parquetjs/utils/binary-utils.js +102 -0
  146. package/dist/parquetjs/utils/binary-utils.js.map +1 -0
  147. package/dist/parquetjs/utils/file-utils.d.ts +1 -1
  148. package/dist/parquetjs/utils/file-utils.d.ts.map +1 -1
  149. package/dist/parquetjs/utils/file-utils.js +3 -3
  150. package/dist/parquetjs/utils/file-utils.js.map +1 -1
  151. package/dist/parquetjs/utils/read-utils.d.ts +4 -4
  152. package/dist/parquetjs/utils/read-utils.d.ts.map +1 -1
  153. package/dist/parquetjs/utils/read-utils.js +12 -17
  154. package/dist/parquetjs/utils/read-utils.js.map +1 -1
  155. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.d.ts +78 -0
  156. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.d.ts.map +1 -0
  157. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.js +213 -0
  158. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.js.map +1 -0
  159. package/dist/parquetjs/utils/uint8-array-compact-protocol.d.ts +78 -0
  160. package/dist/parquetjs/utils/uint8-array-compact-protocol.d.ts.map +1 -0
  161. package/dist/parquetjs/utils/uint8-array-compact-protocol.js +276 -0
  162. package/dist/parquetjs/utils/uint8-array-compact-protocol.js.map +1 -0
  163. package/dist/parquetjs/utils/uint8-array-transport.d.ts +25 -0
  164. package/dist/parquetjs/utils/uint8-array-transport.d.ts.map +1 -0
  165. package/dist/parquetjs/utils/uint8-array-transport.js +62 -0
  166. package/dist/parquetjs/utils/uint8-array-transport.js.map +1 -0
  167. package/dist/unbundled.d.ts +6 -0
  168. package/dist/unbundled.d.ts.map +1 -0
  169. package/dist/unbundled.js +7 -0
  170. package/dist/unbundled.js.map +1 -0
  171. package/package.json +21 -25
  172. package/src/bundled.ts +9 -0
  173. package/src/geoparquet-loader-with-parser.ts +95 -0
  174. package/src/geoparquet-loader.ts +54 -0
  175. package/src/index.ts +7 -25
  176. package/src/lib/constants.ts +1 -1
  177. package/src/lib/encoders/encode-arrow-to-parquet.ts +9 -15
  178. package/src/lib/encoders/encode-table-to-parquet-js.ts +199 -0
  179. package/src/lib/geo/geospatial-metadata.ts +507 -0
  180. package/src/lib/parsers/get-parquet-schema.ts +3 -1
  181. package/src/lib/parsers/parse-geoparquet-to-geojson.ts +27 -14
  182. package/src/lib/parsers/parse-parquet-tables.ts +137 -0
  183. package/src/lib/parsers/parse-parquet-to-arrow-js.ts +36 -0
  184. package/src/lib/parsers/parse-parquet-to-arrow.ts +63 -36
  185. package/src/lib/parsers/parse-parquet-to-columns.ts +6 -7
  186. package/src/lib/parsers/parse-parquet-to-json.ts +101 -33
  187. package/src/lib/utils/load-wasm.ts +16 -9
  188. package/src/lib/utils/make-stream-iterator.ts +1 -1
  189. package/src/lib/utils/normalize-parquet-options.ts +14 -0
  190. package/src/parquet-format.ts +2 -0
  191. package/src/parquet-js-loader.ts +43 -0
  192. package/src/parquet-js-writer.ts +52 -0
  193. package/src/parquet-loader-options.ts +63 -0
  194. package/src/parquet-loader-with-parser.ts +68 -0
  195. package/src/parquet-loader.ts +79 -0
  196. package/src/parquet-wasm-loader-with-parser.ts +115 -0
  197. package/src/parquet-writer.ts +44 -0
  198. package/src/parquetjs/codecs/declare.ts +2 -2
  199. package/src/parquetjs/codecs/dictionary.ts +1 -1
  200. package/src/parquetjs/codecs/plain.ts +67 -53
  201. package/src/parquetjs/codecs/rle.ts +20 -26
  202. package/src/parquetjs/compression.ts +7 -114
  203. package/src/parquetjs/encoder/parquet-encoder.ts +49 -43
  204. package/src/parquetjs/parquet-thrift/ColumnIndex.ts +1 -1
  205. package/src/parquetjs/parquet-thrift/index.ts +0 -2
  206. package/src/parquetjs/parser/decoders.ts +5 -23
  207. package/src/parquetjs/parser/parquet-reader.ts +10 -12
  208. package/src/parquetjs/schema/declare.ts +1 -1
  209. package/src/parquetjs/schema/types.ts +48 -40
  210. package/src/parquetjs/utils/binary-utils.ts +127 -0
  211. package/src/parquetjs/utils/file-utils.ts +4 -4
  212. package/src/parquetjs/utils/read-utils.ts +19 -34
  213. package/src/parquetjs/utils/uint8-array-compact-protocol-writer.ts +254 -0
  214. package/src/parquetjs/utils/uint8-array-compact-protocol.ts +322 -0
  215. package/src/parquetjs/utils/uint8-array-transport.ts +79 -0
  216. package/src/unbundled.ts +9 -0
  217. package/dist/parquet-arrow-loader.d.ts +0 -43
  218. package/dist/parquet-arrow-loader.d.ts.map +0 -1
  219. package/dist/parquet-arrow-loader.js +0 -49
  220. package/dist/parquet-arrow-loader.js.map +0 -1
  221. package/dist/parquet-arrow-writer.d.ts +0 -9
  222. package/dist/parquet-arrow-writer.d.ts.map +0 -1
  223. package/dist/parquet-arrow-writer.js +0 -23
  224. package/dist/parquet-arrow-writer.js.map +0 -1
  225. package/dist/parquet-json-loader.d.ts +0 -148
  226. package/dist/parquet-json-loader.d.ts.map +0 -1
  227. package/dist/parquet-json-loader.js +0 -106
  228. package/dist/parquet-json-loader.js.map +0 -1
  229. package/dist/parquet-json-writer.d.ts +0 -19
  230. package/dist/parquet-json-writer.d.ts.map +0 -1
  231. package/dist/parquet-json-writer.js +0 -20
  232. package/dist/parquet-json-writer.js.map +0 -1
  233. package/dist/polyfills/buffer/buffer-polyfill.browser.d.ts +0 -3
  234. package/dist/polyfills/buffer/buffer-polyfill.browser.d.ts.map +0 -1
  235. package/dist/polyfills/buffer/buffer-polyfill.browser.js +0 -12
  236. package/dist/polyfills/buffer/buffer-polyfill.browser.js.map +0 -1
  237. package/dist/polyfills/buffer/buffer-polyfill.node.d.ts +0 -3
  238. package/dist/polyfills/buffer/buffer-polyfill.node.d.ts.map +0 -1
  239. package/dist/polyfills/buffer/buffer-polyfill.node.js +0 -17
  240. package/dist/polyfills/buffer/buffer-polyfill.node.js.map +0 -1
  241. package/dist/polyfills/buffer/buffer.d.ts +0 -222
  242. package/dist/polyfills/buffer/buffer.d.ts.map +0 -1
  243. package/dist/polyfills/buffer/buffer.js +0 -1868
  244. package/dist/polyfills/buffer/buffer.js.map +0 -1
  245. package/dist/polyfills/buffer/index.d.ts +0 -4
  246. package/dist/polyfills/buffer/index.d.ts.map +0 -1
  247. package/dist/polyfills/buffer/index.js +0 -9
  248. package/dist/polyfills/buffer/index.js.map +0 -1
  249. package/dist/polyfills/buffer/install-buffer-polyfill.d.ts +0 -2
  250. package/dist/polyfills/buffer/install-buffer-polyfill.d.ts.map +0 -1
  251. package/dist/polyfills/buffer/install-buffer-polyfill.js +0 -10
  252. package/dist/polyfills/buffer/install-buffer-polyfill.js.map +0 -1
  253. package/dist/workers/parquet-json-worker.d.ts +0 -2
  254. package/dist/workers/parquet-json-worker.d.ts.map +0 -1
  255. package/dist/workers/parquet-json-worker.js +0 -7
  256. package/dist/workers/parquet-json-worker.js.map +0 -1
  257. package/src/parquet-arrow-loader.ts +0 -74
  258. package/src/parquet-arrow-writer.ts +0 -33
  259. package/src/parquet-json-loader.ts +0 -160
  260. package/src/parquet-json-writer.ts +0 -27
  261. package/src/parquetjs/modules.d.ts +0 -25
  262. package/src/polyfills/buffer/buffer-polyfill.browser.ts +0 -14
  263. package/src/polyfills/buffer/buffer-polyfill.node.ts +0 -19
  264. package/src/polyfills/buffer/buffer.ts +0 -2205
  265. package/src/polyfills/buffer/index.ts +0 -11
  266. package/src/polyfills/buffer/install-buffer-polyfill.ts +0 -12
  267. 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 Int64 from 'node-int64';
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<T> {
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
- // @ts-ignore Row buffer typings...
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
- // @ts-ignore
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
- // @ts-ignore
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: Buffer) => Promise<void>;
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: Buffer) => Promise<void>,
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: Buffer): Promise<void> {
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(Buffer.from(PARQUET_MAGIC));
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: Buffer;
377
+ page: Uint8Array;
377
378
  }> {
378
379
  /* encode repetition and definition levels */
379
- let rLevelsBuf: Buffer = Buffer.alloc(0);
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: Buffer = Buffer.alloc(0);
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 = Buffer.concat([rLevelsBuf, dLevelsBuf, valuesBuf] as Uint8Array[]);
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 = Buffer.concat([headerBuf, compressedBuf] as Uint8Array[]);
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: Buffer;
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: Buffer = Buffer.alloc(0);
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: Buffer = Buffer.alloc(0);
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 = Buffer.concat([headerBuf, rLevelsBuf, dLevelsBuf, compressedBuf] as Uint8Array[]);
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: Buffer;
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: Buffer[] = [];
503
- let pageBuf: Buffer;
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 = Buffer.concat(pages);
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 = Buffer.concat([pageBuf, serializeThrift(metadata)] as Uint8Array[]);
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: Buffer;
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 = Buffer.alloc(0);
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 = new Int64(Number(metadata.total_byte_size) + cchunkData.body.length);
575
+ metadata.total_byte_size = int64(Number(metadata.total_byte_size) + cchunkData.body.length);
575
576
 
576
- body = Buffer.concat([body, cchunkData.body] as Uint8Array[]);
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
- ): Buffer {
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 = Buffer.alloc(metadataEncoded.length + 8);
640
+ const footerEncoded = new Uint8Array(metadataEncoded.length + 8);
640
641
 
641
- metadataEncoded.copy(footerEncoded as Uint8Array);
642
- footerEncoded.writeUInt32LE(metadataEncoded.length, metadataEncoded.length);
643
- footerEncoded.write(PARQUET_MAGIC, metadataEncoded.length + 4);
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((c) => new Int64(+c));
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: 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((value) => dictionary[value]);
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.slice(dictCursor.offset, cursorEnd),
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
- // Makes it look a little easier
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 buffer = Buffer.from(arrayBuffer);
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 trailerBuf = Buffer.from(arrayBuffer);
157
+ const trailer = toUint8Array(arrayBuffer);
160
158
 
161
- const magic = trailerBuf.slice(4).toString();
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 = trailerBuf.readUInt32LE(0);
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 = Buffer.from(arrayBuffer2);
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 = Buffer.from(arrayBuffer);
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<string[]> {
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 = Buffer.from(arrayBuffer);
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);
@@ -66,7 +66,7 @@ export type OriginalType =
66
66
  | 'BSON' // 20
67
67
  | 'INTERVAL'; // 21
68
68
 
69
- export type ParquetDictionary = string[];
69
+ export type ParquetDictionary = any[];
70
70
 
71
71
  export interface SchemaDefinition {
72
72
  [string: string]: FieldDefinition;