@knockdata/objectexplorer 0.4.7 → 0.5.0
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/app/assets/WorkerParser.js +146 -126
- package/app/assets/index.css +1 -1
- package/app/assets/index.js +473 -110
- package/app/assets/is.js +1 -1
- package/app/assets/lightgbmc.wasm +0 -0
- package/app/assets/search-worker.js +1 -1
- package/demo/agent.db +0 -0
- package/demo/climate-classic.nc +0 -0
- package/demo/climate.h5 +0 -0
- package/demo/climate.nc +0 -0
- package/demo/delta/README.md +89 -0
- package/demo/delta/checkpoint/_delta_log/00000000000000000000.json +4 -0
- package/demo/delta/checkpoint/_delta_log/00000000000000000001.json +2 -0
- package/demo/delta/checkpoint/_delta_log/00000000000000000002.json +2 -0
- package/demo/delta/checkpoint/_delta_log/00000000000000000003.json +2 -0
- package/demo/delta/checkpoint/_delta_log/00000000000000000004.json +2 -0
- package/demo/delta/checkpoint/_delta_log/00000000000000000005.json +2 -0
- package/demo/delta/checkpoint/_delta_log/00000000000000000006.json +2 -0
- package/demo/delta/checkpoint/_delta_log/00000000000000000007.checkpoint.parquet +0 -0
- package/demo/delta/checkpoint/_delta_log/00000000000000000007.json +2 -0
- package/demo/delta/checkpoint/_delta_log/_last_checkpoint +1 -0
- package/demo/delta/checkpoint/part-00000-0b6af41d-e5a8-4636-bbb9-933386f1e95e-c000.snappy.parquet +0 -0
- package/demo/delta/checkpoint/part-00000-371ba9d3-7e90-4786-b364-0f32602fb3eb-c000.snappy.parquet +0 -0
- package/demo/delta/checkpoint/part-00000-400e799c-ee2c-4382-95bd-c0d2e78582f4-c000.snappy.parquet +0 -0
- package/demo/delta/checkpoint/part-00000-49faa527-fda9-47d4-bff7-7ebe782cba09-c000.snappy.parquet +0 -0
- package/demo/delta/checkpoint/part-00000-7dd28ad4-da00-4d40-9b12-148c7de6ec1f-c000.snappy.parquet +0 -0
- package/demo/delta/checkpoint/part-00000-c340b163-272e-4791-8b89-c8f9ab9ac2c6-c000.snappy.parquet +0 -0
- package/demo/delta/checkpoint/part-00000-d9a43e09-e3fb-408c-b14b-19043435ea0c-c000.snappy.parquet +0 -0
- package/demo/delta/checkpoint/part-00000-f0d26828-6932-41a4-a807-e2bc4ef0b1fa-c000.snappy.parquet +0 -0
- package/demo/delta/mapped/_delta_log/00000000000000000000.json +3 -0
- package/demo/delta/mapped/part-00000-mapped.parquet +0 -0
- package/demo/delta/partition/_delta_log/00000000000000000000.json +6 -0
- package/demo/delta/partition/_delta_log/00000000000000000001.json +3 -0
- package/demo/delta/partition/region=east/part-00000-967adb21-c6cc-4a66-b438-080e1d082e23-c000.snappy.parquet +0 -0
- package/demo/delta/partition/region=north/part-00000-23d9cdb9-7dfd-4ff2-9b4a-16a908b0d2a7-c000.zstd.parquet +0 -0
- package/demo/delta/partition/region=north/part-00000-37b07708-d258-40eb-ae1a-1e9888944793-c000.snappy.parquet +0 -0
- package/demo/delta/partition/region=south/part-00000-ca593487-a99f-4806-9104-73be2fa14dd7-c000.snappy.parquet +0 -0
- package/demo/delta/sales/_delta_log/00000000000000000000.json +4 -0
- package/demo/delta/sales/_delta_log/00000000000000000001.json +3 -0
- package/demo/delta/sales/_delta_log/00000000000000000002.json +3 -0
- package/demo/delta/sales/part-00000-05185265-6ab9-46d7-ba8a-4468426d0732-c000.snappy.parquet +0 -0
- package/demo/delta/sales/part-00000-327fad08-9437-4709-b8c8-378c6e02770c-c000.zstd.parquet +0 -0
- package/demo/delta/sales/part-00000-409fe61a-75ba-4adf-b6cb-346cfeccdd5e-c000.snappy.parquet +0 -0
- package/demo/delta/vector/_delta_log/00000000000000000000.json +4 -0
- package/demo/delta/vector/_delta_log/00000000000000000001.json +3 -0
- package/demo/delta/vector/_delta_log/00000000000000000002.json +2 -0
- package/demo/delta/vector/deletion_vector_00000000-0000-4000-8000-0000000000d7.bin +0 -0
- package/demo/delta/vector/part-00000-8e0b0895-990f-4e24-bf8f-89e44621b789-c000.zstd.parquet +0 -0
- package/demo/delta/vector/part-00000-ca79def4-5fb3-4549-b03d-4e2fea31b64e-c000.snappy.parquet +0 -0
- package/demo/hudi/README.md +92 -0
- package/demo/hudi/inflight/b1a2c3d4-0000-4000-8000-00000000e301-0_0-1-0_20260817120000000.parquet +0 -0
- package/demo/hudi/inflight/b1a2c3d4-0000-4000-8000-00000000e301-0_0-1-0_20260817120100000.parquet +0 -0
- package/demo/hudi/mor/b1a2c3d4-0000-4000-8000-00000000e401-0_0-1-0_20260817120000000.parquet +0 -0
- package/demo/hudi/partition/region=east/b1a2c3d4-0000-4000-8000-00000000e103-0_0-1-0_20260817120000000.parquet +0 -0
- package/demo/hudi/partition/region=north/b1a2c3d4-0000-4000-8000-00000000e101-0_0-1-0_20260817120000000.parquet +0 -0
- package/demo/hudi/partition/region=north/b1a2c3d4-0000-4000-8000-00000000e101-0_0-1-0_20260817120100000.parquet +0 -0
- package/demo/hudi/partition/region=south/b1a2c3d4-0000-4000-8000-00000000e102-0_0-1-0_20260817120000000.parquet +0 -0
- package/demo/hudi/replace/b1a2c3d4-0000-4000-8000-00000000e201-0_0-1-0_20260817120000000.parquet +0 -0
- package/demo/hudi/replace/b1a2c3d4-0000-4000-8000-00000000e202-0_0-1-0_20260817120100000.parquet +0 -0
- package/demo/hudi/sales/b1a2c3d4-0000-4000-8000-00000000e001-0_0-1-0_20260817120000000.parquet +0 -0
- package/demo/hudi/sales/b1a2c3d4-0000-4000-8000-00000000e001-0_0-1-0_20260817120100000.parquet +0 -0
- package/demo/hudi/sales/b1a2c3d4-0000-4000-8000-00000000e001-0_0-1-0_20260817120200000.parquet +0 -0
- package/demo/iceberg/README.md +80 -0
- package/demo/iceberg/equality/data/00000-0-6762229c-bca3-4c19-8088-f5e8fd37939e.parquet +0 -0
- package/demo/iceberg/equality/data/equality-delete.parquet +0 -0
- package/demo/iceberg/equality/metadata/00000-3898835a-27a8-4802-9fd8-25bf74eb05e9.metadata.json +1 -0
- package/demo/iceberg/equality/metadata/00001-bff789d6-a3b8-40b0-adf6-ab42edc90384.metadata.json +1 -0
- package/demo/iceberg/equality/metadata/00002-delete.metadata.json +115 -0
- package/demo/iceberg/equality/metadata/6762229c-bca3-4c19-8088-f5e8fd37939e-m0.avro +0 -0
- package/demo/iceberg/equality/metadata/delete-6727406315757390782-m0.avro +0 -0
- package/demo/iceberg/equality/metadata/snap-6727406315757390781-0-6762229c-bca3-4c19-8088-f5e8fd37939e.avro +0 -0
- package/demo/iceberg/equality/metadata/snap-6727406315757390782-0-delete.avro +0 -0
- package/demo/iceberg/evolved/data/00000-0-257f0a82-aa89-49ca-ab08-2e15d7a6ce61.parquet +0 -0
- package/demo/iceberg/evolved/data/00000-0-f612a2cc-fd42-4fe7-8f30-849c886ed42f.parquet +0 -0
- package/demo/iceberg/evolved/metadata/00000-7b1ee4a6-d23e-4597-a952-1faeae2c6631.metadata.json +1 -0
- package/demo/iceberg/evolved/metadata/00001-f82a6028-170f-4c99-9f69-dc9c5db7706f.metadata.json +1 -0
- package/demo/iceberg/evolved/metadata/00002-5751d450-f81a-453c-b1c1-7c0ecb3b847a.metadata.json +1 -0
- package/demo/iceberg/evolved/metadata/00003-b392ee5d-33c3-4c03-9448-941481157646.metadata.json +1 -0
- package/demo/iceberg/evolved/metadata/257f0a82-aa89-49ca-ab08-2e15d7a6ce61-m0.avro +0 -0
- package/demo/iceberg/evolved/metadata/f612a2cc-fd42-4fe7-8f30-849c886ed42f-m0.avro +0 -0
- package/demo/iceberg/evolved/metadata/snap-1074794464454607928-0-f612a2cc-fd42-4fe7-8f30-849c886ed42f.avro +0 -0
- package/demo/iceberg/evolved/metadata/snap-4829795160162008264-0-257f0a82-aa89-49ca-ab08-2e15d7a6ce61.avro +0 -0
- package/demo/iceberg/hadoop/data/00000-0-01fd755b-8ea2-4aed-9a21-07e07fcf34bc.parquet +0 -0
- package/demo/iceberg/hadoop/metadata/01fd755b-8ea2-4aed-9a21-07e07fcf34bc-m0.avro +0 -0
- package/demo/iceberg/hadoop/metadata/snap-1143458465259875935-0-01fd755b-8ea2-4aed-9a21-07e07fcf34bc.avro +0 -0
- package/demo/iceberg/hadoop/metadata/v1.metadata.json +1 -0
- package/demo/iceberg/hadoop/metadata/version-hint.text +1 -0
- package/demo/iceberg/partition/data/region_part=east/00000-2-2d48a1ff-55ba-4bae-9c6b-8732d8323bd7.parquet +0 -0
- package/demo/iceberg/partition/data/region_part=north/00000-0-2d48a1ff-55ba-4bae-9c6b-8732d8323bd7.parquet +0 -0
- package/demo/iceberg/partition/data/region_part=south/00000-1-2d48a1ff-55ba-4bae-9c6b-8732d8323bd7.parquet +0 -0
- package/demo/iceberg/partition/metadata/00000-cde33df7-2164-4f3a-ac15-10aab9c841ac.metadata.json +1 -0
- package/demo/iceberg/partition/metadata/00001-49f1d5a2-0111-4c83-b71c-6a84ffc1eeb4.metadata.json +1 -0
- package/demo/iceberg/partition/metadata/00002-455a595a-b069-4002-b1f6-bd89611f483c.metadata.json +1 -0
- package/demo/iceberg/partition/metadata/2d48a1ff-55ba-4bae-9c6b-8732d8323bd7-m0.avro +0 -0
- package/demo/iceberg/partition/metadata/snap-5440112098897409547-0-2d48a1ff-55ba-4bae-9c6b-8732d8323bd7.avro +0 -0
- package/demo/iceberg/position/data/00000-0-8d1a982c-c1b7-47d9-a584-de646ada36b6.parquet +0 -0
- package/demo/iceberg/position/data/position-delete.parquet +0 -0
- package/demo/iceberg/position/metadata/00000-0c9f7b09-cbc3-4933-b0a8-01d8a809916e.metadata.json +1 -0
- package/demo/iceberg/position/metadata/00001-8fc1224a-057c-4848-9c74-9c4e592c3545.metadata.json +1 -0
- package/demo/iceberg/position/metadata/00002-delete.metadata.json +115 -0
- package/demo/iceberg/position/metadata/8d1a982c-c1b7-47d9-a584-de646ada36b6-m0.avro +0 -0
- package/demo/iceberg/position/metadata/delete-8554796374254190465-m0.avro +0 -0
- package/demo/iceberg/position/metadata/snap-8554796374254190464-0-8d1a982c-c1b7-47d9-a584-de646ada36b6.avro +0 -0
- package/demo/iceberg/position/metadata/snap-8554796374254190465-0-delete.avro +0 -0
- package/demo/iceberg/sales/data/00000-0-16494fa7-6997-413a-83c6-bfc6d53f3da5.parquet +0 -0
- package/demo/iceberg/sales/data/00000-0-c22c4051-1631-419a-a3dd-a4869ef05b86.parquet +0 -0
- package/demo/iceberg/sales/metadata/00000-82dd52ff-dd85-4033-b71a-c16358a1926e.metadata.json +1 -0
- package/demo/iceberg/sales/metadata/00001-357f9784-8695-4b85-8f06-fd34b1785c06.metadata.json +1 -0
- package/demo/iceberg/sales/metadata/00002-8f9af95b-ee34-4114-a3b8-39e98282ea32.metadata.json +1 -0
- package/demo/iceberg/sales/metadata/16494fa7-6997-413a-83c6-bfc6d53f3da5-m0.avro +0 -0
- package/demo/iceberg/sales/metadata/c22c4051-1631-419a-a3dd-a4869ef05b86-m0.avro +0 -0
- package/demo/iceberg/sales/metadata/c22c4051-1631-419a-a3dd-a4869ef05b86-m1.avro +0 -0
- package/demo/iceberg/sales/metadata/snap-1906855036599627199-0-c22c4051-1631-419a-a3dd-a4869ef05b86.avro +0 -0
- package/demo/iceberg/sales/metadata/snap-7501977550537779287-0-16494fa7-6997-413a-83c6-bfc6d53f3da5.avro +0 -0
- package/demo/iceberg/vector/data/00000-0-9197c8ae-ba1a-4385-9ea5-0c6678edc498.parquet +0 -0
- package/demo/iceberg/vector/data/deletion-vector.puffin +0 -0
- package/demo/iceberg/vector/metadata/00000-10309d54-e9b9-4ca0-a876-a1a04af25990.metadata.json +64 -0
- package/demo/iceberg/vector/metadata/00001-11587d2c-50b6-4300-9319-79fc00683da5.metadata.json +100 -0
- package/demo/iceberg/vector/metadata/00002-delete.metadata.json +115 -0
- package/demo/iceberg/vector/metadata/9197c8ae-ba1a-4385-9ea5-0c6678edc498-m0.avro +0 -0
- package/demo/iceberg/vector/metadata/delete-1190645659349152089-m0.avro +0 -0
- package/demo/iceberg/vector/metadata/snap-1190645659349152088-0-9197c8ae-ba1a-4385-9ea5-0c6678edc498.avro +0 -0
- package/demo/iceberg/vector/metadata/snap-1190645659349152089-0-delete.avro +0 -0
- package/demo/nl_train_stations.arrow +0 -0
- package/demo/nl_train_stations.avro +0 -0
- package/demo/nl_train_stations.orc +0 -0
- package/demo/sample.duckdb +0 -0
- package/demo/test.csv +7 -0
- package/demo/test.json +6 -0
- package/demo/test.orc +0 -0
- package/demo/wide.csv +3 -0
- package/package.json +1 -1
- package/server/WebServer.mjs +276 -263
|
Binary file
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Hudi reference tables
|
|
2
|
+
|
|
3
|
+
Five Apache Hudi tables, each one holding a single thing a reader has to get right. They exist
|
|
4
|
+
because `server/src/duckdb` reads Hudi itself, and these are what say it reads it correctly.
|
|
5
|
+
|
|
6
|
+
```
|
|
7
|
+
hudi/
|
|
8
|
+
sales insert, modify, delete — the file group is rewritten by every commit
|
|
9
|
+
partition a file group per partition, and a commit that touches only one of them
|
|
10
|
+
replace a replacecommit, which retires whole file groups at once
|
|
11
|
+
inflight a commit that never completed, whose parquet is on disk anyway
|
|
12
|
+
mor merge on read: a base file, and log files holding everything since
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Regenerate with `uv run objectexplorer/reference/data/generate-hudi.py`. Instant times and file ids
|
|
16
|
+
are constants rather than fresh uuids, so regenerating changes nothing and
|
|
17
|
+
`server/test/hudi-golden.json` stays valid.
|
|
18
|
+
|
|
19
|
+
## The names are the metadata
|
|
20
|
+
|
|
21
|
+
Delta keeps a log and Iceberg keeps a chain. Hudi writes most of the answer into the file names:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
sales/
|
|
25
|
+
.hoodie/
|
|
26
|
+
20260817120000000.commit insert
|
|
27
|
+
20260817120100000.commit modify
|
|
28
|
+
20260817120200000.commit delete
|
|
29
|
+
hoodie.properties the table's type, key and version
|
|
30
|
+
b1a2…e001-0_0-1-0_20260817120000000.parquet 4 rows, written by the first commit
|
|
31
|
+
b1a2…e001-0_0-1-0_20260817120100000.parquet 4 rows, written by the second
|
|
32
|
+
b1a2…e001-0_0-1-0_20260817120200000.parquet 2 rows, written by the third — live
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
A base file is `<fileId>_<writeToken>_<instant>.parquet`. Every file with the same file id is one
|
|
36
|
+
**file group** — the same rows rewritten — and the newest instant among them is the one the table
|
|
37
|
+
is made of. The other two are older versions of it, sitting right there, which is why:
|
|
38
|
+
|
|
39
|
+
```sql
|
|
40
|
+
SELECT * FROM 'hudi/sales'; -- 2 rows, the table
|
|
41
|
+
SELECT * FROM 'hudi/sales/*.parquet'; -- 10 rows, three versions stacked
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Ten is 4 + 4 + 2. The `id = 2` row appears three times at two amounts, and the deleted `north` rows
|
|
45
|
+
come back. Nothing in the parquet files says which of them is current.
|
|
46
|
+
|
|
47
|
+
That first query has no function around the path on purpose. `server/src/duckdb/sql-expand.js` sees
|
|
48
|
+
a `.hoodie` in the folder and rewrites the query into the `read_parquet` it should have been.
|
|
49
|
+
|
|
50
|
+
`.hoodie` is what says which instants finished, and that is not decoration. `inflight` holds a write
|
|
51
|
+
that died: its parquet is on disk, its name looks like every other base file's, and only the
|
|
52
|
+
missing `20260817120100000.commit` says those four rows are not in the table.
|
|
53
|
+
|
|
54
|
+
## Merge on read
|
|
55
|
+
|
|
56
|
+
`mor` is the other half of Hudi. A change does not rewrite the base file — it is appended to a log
|
|
57
|
+
file beside it, in Hudi's own block format, and the rows the table has are the base file merged with
|
|
58
|
+
everything the logs said afterwards:
|
|
59
|
+
|
|
60
|
+
| block | instant | what it says |
|
|
61
|
+
|-----------------|-------------------|--------------------------------------------------|
|
|
62
|
+
| avro data | 20260817120100000 | `id = 2` now costs 95 |
|
|
63
|
+
| delete | 20260817120200000 | `id = 3` is gone |
|
|
64
|
+
| parquet data | 20260817120300000 | `id = 4` now costs 999 |
|
|
65
|
+
| avro data | 20260817120400000 | `id = 5` exists |
|
|
66
|
+
| command | 20260817120500000 | ...no it does not: rolls back 20260817120400000 |
|
|
67
|
+
|
|
68
|
+
Three rows come out of four on disk. A reader that only read the base file would answer with the
|
|
69
|
+
row that was deleted, the two rows that were changed, and none of what the logs added — and a
|
|
70
|
+
reader that read the blocks without honouring the rollback would invent a fifth row that no writer
|
|
71
|
+
ever committed.
|
|
72
|
+
|
|
73
|
+
The blocks are read by `server/src/duckdb/hudi-log.js`. An avro data block holds raw records with
|
|
74
|
+
the schema up in the block header, so it is wrapped back into the Avro container file it came out
|
|
75
|
+
of and duckdb reads it (`hudi-avro.js`) — the same move the Iceberg reader makes for a manifest.
|
|
76
|
+
|
|
77
|
+
## Written by hand
|
|
78
|
+
|
|
79
|
+
Hudi writes with Spark and there is no JVM here, so the generator writes the bytes itself. What
|
|
80
|
+
makes that trustworthy is hudi-rs, the reader behind the `hudi` package on PyPI: it opens every one
|
|
81
|
+
of these and its row counts are what the generator prints.
|
|
82
|
+
|
|
83
|
+
It gets through four of the five. hudi-rs 0.4.0 opens `HoodieDeleteRecord.avsc` from disk at run
|
|
84
|
+
time and its wheel ships without it, so `mor` is the one it declines — the same way `deltalake`
|
|
85
|
+
declines the Delta deletion vector fixture. The blocks either side of that delete are hudi-rs's own
|
|
86
|
+
answer, the delete block is written the way its source parses one, and `server/test/hudi.test.js`
|
|
87
|
+
reads all of it back.
|
|
88
|
+
|
|
89
|
+
Two small liberties, neither of which any reader can see: a rolled-back instant would also leave a
|
|
90
|
+
`.rollback` file in `.hoodie`, which is Avro rather than json and says nothing the command block in
|
|
91
|
+
the log does not; and there is no `.hoodie/metadata` table, which is an index of the listing a
|
|
92
|
+
reader can do for itself.
|
package/demo/hudi/inflight/b1a2c3d4-0000-4000-8000-00000000e301-0_0-1-0_20260817120000000.parquet
ADDED
|
Binary file
|
package/demo/hudi/inflight/b1a2c3d4-0000-4000-8000-00000000e301-0_0-1-0_20260817120100000.parquet
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/demo/hudi/replace/b1a2c3d4-0000-4000-8000-00000000e201-0_0-1-0_20260817120000000.parquet
ADDED
|
Binary file
|
package/demo/hudi/replace/b1a2c3d4-0000-4000-8000-00000000e202-0_0-1-0_20260817120100000.parquet
ADDED
|
Binary file
|
package/demo/hudi/sales/b1a2c3d4-0000-4000-8000-00000000e001-0_0-1-0_20260817120000000.parquet
ADDED
|
Binary file
|
package/demo/hudi/sales/b1a2c3d4-0000-4000-8000-00000000e001-0_0-1-0_20260817120100000.parquet
ADDED
|
Binary file
|
package/demo/hudi/sales/b1a2c3d4-0000-4000-8000-00000000e001-0_0-1-0_20260817120200000.parquet
ADDED
|
Binary file
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Iceberg reference tables
|
|
2
|
+
|
|
3
|
+
Seven Iceberg tables, each one holding a single thing a reader has to get right. They exist because
|
|
4
|
+
`server/src/duckdb` reads Iceberg itself now, and these are what say it reads it correctly.
|
|
5
|
+
|
|
6
|
+
```
|
|
7
|
+
iceberg/
|
|
8
|
+
sales an append, then a delete that rewrote the file it touched
|
|
9
|
+
partition identity partitioning, so a manifest carries the partition value
|
|
10
|
+
evolved a renamed column and an added one, so the files disagree about their schema
|
|
11
|
+
hadoop v1.metadata.json + version-hint.text, the layout with no catalog behind it
|
|
12
|
+
position merge-on-read position deletes
|
|
13
|
+
equality merge-on-read equality deletes
|
|
14
|
+
vector a v3 deletion vector, in a Puffin file
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Regenerate with `uv run objectexplorer/reference/data/generate-iceberg.py`. UUIDs and snapshot ids
|
|
18
|
+
change every time; shapes do not.
|
|
19
|
+
|
|
20
|
+
## The chain
|
|
21
|
+
|
|
22
|
+
Delta keeps a log. Iceberg keeps a chain, and a reader has to walk all of it:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
metadata/v1.metadata.json the schema, the partition specs, and every snapshot
|
|
26
|
+
└── snapshot the current one, named by current-snapshot-id
|
|
27
|
+
└── snap-<id>-….avro the manifest list: which manifests this snapshot is made of
|
|
28
|
+
└── <uuid>-m0.avro a manifest: which data files, and which delete files
|
|
29
|
+
└── data/….parquet the rows
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Nothing in `data/` says which snapshot it belongs to, so — exactly as with Delta — a wildcard over
|
|
33
|
+
`data/*.parquet` answers with every version of the table at once:
|
|
34
|
+
|
|
35
|
+
```sql
|
|
36
|
+
SELECT * FROM 'iceberg/sales'; -- 2 rows, the table
|
|
37
|
+
SELECT * FROM 'iceberg/sales/*.parquet'; -- 6 rows, both snapshots stacked
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
The first query has no function around the path on purpose. `server/src/duckdb/sql-expand.js` sees a
|
|
41
|
+
folder with a `metadata/` in it, walks the chain, and rewrites the query. There is no
|
|
42
|
+
`iceberg_scan()` any more, and no iceberg extension in the engine either.
|
|
43
|
+
|
|
44
|
+
## Three ways to delete a row
|
|
45
|
+
|
|
46
|
+
Iceberg can delete a row without rewriting the file it is in — *merge on read* — and it has three
|
|
47
|
+
spellings for it, which is why three of these fixtures exist.
|
|
48
|
+
|
|
49
|
+
| fixture | how the delete is recorded | what a reader must do |
|
|
50
|
+
|------------|--------------------------------------------|--------------------------------------------|
|
|
51
|
+
| `sales` | the file is rewritten without the row | nothing; just read the current files |
|
|
52
|
+
| `position` | a parquet of `(file_path, pos)` | drop those row numbers of that file |
|
|
53
|
+
| `equality` | a parquet of values, e.g. `id` | drop rows matching those values |
|
|
54
|
+
| `vector` | a roaring bitmap inside a Puffin file | decode it, drop those row numbers |
|
|
55
|
+
|
|
56
|
+
Which deletes apply to which data file is decided by sequence number, and the two rules differ by
|
|
57
|
+
one character — a difference that is not cosmetic:
|
|
58
|
+
|
|
59
|
+
- a **position** delete applies when `data.sequence_number <= delete.sequence_number`, so a delete
|
|
60
|
+
written in the same commit as its data file *does* apply;
|
|
61
|
+
- an **equality** delete applies when `data.sequence_number < delete.sequence_number`, so one
|
|
62
|
+
written in that same commit does *not*.
|
|
63
|
+
|
|
64
|
+
`position`, `equality` and `vector` are written by hand, because pyiceberg only ever rewrites whole
|
|
65
|
+
files. The manifests are real Avro written with `fastavro` (reusing the schema pyiceberg wrote), the
|
|
66
|
+
Puffin blob is built to the layout `delta-kernel-rs`'s Iceberg counterpart reads, and each one was
|
|
67
|
+
only trusted once duckdb's iceberg extension read it and agreed.
|
|
68
|
+
|
|
69
|
+
## Two things that bite
|
|
70
|
+
|
|
71
|
+
**Absolute paths.** Iceberg writes fully-qualified paths into its metadata and manifests, so a table
|
|
72
|
+
copied anywhere — another bucket, another machine, a git checkout — names files that are not there.
|
|
73
|
+
The generator rewrites them to wherever the fixture landed, and the reader resolves every recorded
|
|
74
|
+
path against the folder it was handed anyway. duckdb-iceberg calls this `allow_moved_paths`; for a
|
|
75
|
+
file browser it is not optional.
|
|
76
|
+
|
|
77
|
+
**Snapshot ids are int64.** They are routinely larger than `2^53`, so `JSON.parse` rounds them and
|
|
78
|
+
two snapshots can collide into one number. `position` and `vector` have snapshots exactly one apart
|
|
79
|
+
for precisely this reason — before the reader quoted those ids, it picked the older snapshot and
|
|
80
|
+
quietly returned the undeleted rows.
|
|
Binary file
|
|
Binary file
|
package/demo/iceberg/equality/metadata/00000-3898835a-27a8-4802-9fd8-25bf74eb05e9.metadata.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"location":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/equality","table-uuid":"98a7b63e-3fff-42e4-9244-27f8e01b8e55","last-updated-ms":1786970727979,"last-column-id":4,"schemas":[{"type":"struct","fields":[{"id":1,"name":"id","type":"long","required":false},{"id":2,"name":"region","type":"string","required":false},{"id":3,"name":"product","type":"string","required":false},{"id":4,"name":"amount","type":"double","required":false}],"schema-id":0,"identifier-field-ids":[]}],"current-schema-id":0,"partition-specs":[{"spec-id":0,"fields":[]}],"default-spec-id":0,"last-partition-id":999,"properties":{},"snapshots":[],"snapshot-log":[],"metadata-log":[],"sort-orders":[{"order-id":0,"fields":[]}],"default-sort-order-id":0,"refs":{},"statistics":[],"partition-statistics":[],"format-version":2,"last-sequence-number":0}
|
package/demo/iceberg/equality/metadata/00001-bff789d6-a3b8-40b0-adf6-ab42edc90384.metadata.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"location":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/equality","table-uuid":"98a7b63e-3fff-42e4-9244-27f8e01b8e55","last-updated-ms":1786970727982,"last-column-id":4,"schemas":[{"type":"struct","fields":[{"id":1,"name":"id","type":"long","required":false},{"id":2,"name":"region","type":"string","required":false},{"id":3,"name":"product","type":"string","required":false},{"id":4,"name":"amount","type":"double","required":false}],"schema-id":0,"identifier-field-ids":[]}],"current-schema-id":0,"partition-specs":[{"spec-id":0,"fields":[]}],"default-spec-id":0,"last-partition-id":999,"properties":{},"current-snapshot-id":6727406315757390781,"snapshots":[{"snapshot-id":6727406315757390781,"sequence-number":1,"timestamp-ms":1786970727982,"manifest-list":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/equality/metadata/snap-6727406315757390781-0-6762229c-bca3-4c19-8088-f5e8fd37939e.avro","summary":{"operation":"append","added-files-size":"1716","added-data-files":"1","added-records":"4","total-data-files":"1","total-delete-files":"0","total-records":"4","total-files-size":"1716","total-position-deletes":"0","total-equality-deletes":"0"},"schema-id":0}],"snapshot-log":[{"snapshot-id":6727406315757390781,"timestamp-ms":1786970727982}],"metadata-log":[{"metadata-file":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/equality/metadata/00000-3898835a-27a8-4802-9fd8-25bf74eb05e9.metadata.json","timestamp-ms":1786970727979}],"sort-orders":[{"order-id":0,"fields":[]}],"default-sort-order-id":0,"refs":{"main":{"snapshot-id":6727406315757390781,"type":"branch"}},"statistics":[],"partition-statistics":[],"format-version":2,"last-sequence-number":1}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
{
|
|
2
|
+
"location": "file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/equality",
|
|
3
|
+
"table-uuid": "98a7b63e-3fff-42e4-9244-27f8e01b8e55",
|
|
4
|
+
"last-updated-ms": 1786970727982,
|
|
5
|
+
"last-column-id": 4,
|
|
6
|
+
"schemas": [
|
|
7
|
+
{
|
|
8
|
+
"type": "struct",
|
|
9
|
+
"fields": [
|
|
10
|
+
{
|
|
11
|
+
"id": 1,
|
|
12
|
+
"name": "id",
|
|
13
|
+
"type": "long",
|
|
14
|
+
"required": false
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": 2,
|
|
18
|
+
"name": "region",
|
|
19
|
+
"type": "string",
|
|
20
|
+
"required": false
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": 3,
|
|
24
|
+
"name": "product",
|
|
25
|
+
"type": "string",
|
|
26
|
+
"required": false
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": 4,
|
|
30
|
+
"name": "amount",
|
|
31
|
+
"type": "double",
|
|
32
|
+
"required": false
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"schema-id": 0,
|
|
36
|
+
"identifier-field-ids": []
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"current-schema-id": 0,
|
|
40
|
+
"partition-specs": [
|
|
41
|
+
{
|
|
42
|
+
"spec-id": 0,
|
|
43
|
+
"fields": []
|
|
44
|
+
}
|
|
45
|
+
],
|
|
46
|
+
"default-spec-id": 0,
|
|
47
|
+
"last-partition-id": 999,
|
|
48
|
+
"properties": {},
|
|
49
|
+
"current-snapshot-id": 6727406315757390782,
|
|
50
|
+
"snapshots": [
|
|
51
|
+
{
|
|
52
|
+
"snapshot-id": 6727406315757390781,
|
|
53
|
+
"sequence-number": 1,
|
|
54
|
+
"timestamp-ms": 1786970727982,
|
|
55
|
+
"manifest-list": "file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/equality/metadata/snap-6727406315757390781-0-6762229c-bca3-4c19-8088-f5e8fd37939e.avro",
|
|
56
|
+
"summary": {
|
|
57
|
+
"operation": "append",
|
|
58
|
+
"added-files-size": "1716",
|
|
59
|
+
"added-data-files": "1",
|
|
60
|
+
"added-records": "4",
|
|
61
|
+
"total-data-files": "1",
|
|
62
|
+
"total-delete-files": "0",
|
|
63
|
+
"total-records": "4",
|
|
64
|
+
"total-files-size": "1716",
|
|
65
|
+
"total-position-deletes": "0",
|
|
66
|
+
"total-equality-deletes": "0"
|
|
67
|
+
},
|
|
68
|
+
"schema-id": 0
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"snapshot-id": 6727406315757390782,
|
|
72
|
+
"parent-snapshot-id": 6727406315757390781,
|
|
73
|
+
"sequence-number": 2,
|
|
74
|
+
"timestamp-ms": 1786970728982,
|
|
75
|
+
"manifest-list": "file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/equality/metadata/snap-6727406315757390782-0-delete.avro",
|
|
76
|
+
"summary": {
|
|
77
|
+
"operation": "delete"
|
|
78
|
+
},
|
|
79
|
+
"schema-id": 0
|
|
80
|
+
}
|
|
81
|
+
],
|
|
82
|
+
"snapshot-log": [
|
|
83
|
+
{
|
|
84
|
+
"snapshot-id": 6727406315757390781,
|
|
85
|
+
"timestamp-ms": 1786970727982
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"snapshot-id": 6727406315757390782,
|
|
89
|
+
"timestamp-ms": 1786970728982
|
|
90
|
+
}
|
|
91
|
+
],
|
|
92
|
+
"metadata-log": [
|
|
93
|
+
{
|
|
94
|
+
"metadata-file": "file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/equality/metadata/00000-3898835a-27a8-4802-9fd8-25bf74eb05e9.metadata.json",
|
|
95
|
+
"timestamp-ms": 1786970727979
|
|
96
|
+
}
|
|
97
|
+
],
|
|
98
|
+
"sort-orders": [
|
|
99
|
+
{
|
|
100
|
+
"order-id": 0,
|
|
101
|
+
"fields": []
|
|
102
|
+
}
|
|
103
|
+
],
|
|
104
|
+
"default-sort-order-id": 0,
|
|
105
|
+
"refs": {
|
|
106
|
+
"main": {
|
|
107
|
+
"snapshot-id": 6727406315757390781,
|
|
108
|
+
"type": "branch"
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
"statistics": [],
|
|
112
|
+
"partition-statistics": [],
|
|
113
|
+
"format-version": 2,
|
|
114
|
+
"last-sequence-number": 2
|
|
115
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/demo/iceberg/evolved/metadata/00000-7b1ee4a6-d23e-4597-a952-1faeae2c6631.metadata.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"location":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/evolved","table-uuid":"e8bd35bb-21a6-4cbe-9d12-c3313b48a1f7","last-updated-ms":1786970727942,"last-column-id":4,"schemas":[{"type":"struct","fields":[{"id":1,"name":"id","type":"long","required":false},{"id":2,"name":"region","type":"string","required":false},{"id":3,"name":"product","type":"string","required":false},{"id":4,"name":"amount","type":"double","required":false}],"schema-id":0,"identifier-field-ids":[]}],"current-schema-id":0,"partition-specs":[{"spec-id":0,"fields":[]}],"default-spec-id":0,"last-partition-id":999,"properties":{},"snapshots":[],"snapshot-log":[],"metadata-log":[],"sort-orders":[{"order-id":0,"fields":[]}],"default-sort-order-id":0,"refs":{},"statistics":[],"partition-statistics":[],"format-version":2,"last-sequence-number":0}
|
package/demo/iceberg/evolved/metadata/00001-f82a6028-170f-4c99-9f69-dc9c5db7706f.metadata.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"location":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/evolved","table-uuid":"e8bd35bb-21a6-4cbe-9d12-c3313b48a1f7","last-updated-ms":1786970727945,"last-column-id":4,"schemas":[{"type":"struct","fields":[{"id":1,"name":"id","type":"long","required":false},{"id":2,"name":"region","type":"string","required":false},{"id":3,"name":"product","type":"string","required":false},{"id":4,"name":"amount","type":"double","required":false}],"schema-id":0,"identifier-field-ids":[]}],"current-schema-id":0,"partition-specs":[{"spec-id":0,"fields":[]}],"default-spec-id":0,"last-partition-id":999,"properties":{},"current-snapshot-id":1074794464454607928,"snapshots":[{"snapshot-id":1074794464454607928,"sequence-number":1,"timestamp-ms":1786970727945,"manifest-list":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/evolved/metadata/snap-1074794464454607928-0-f612a2cc-fd42-4fe7-8f30-849c886ed42f.avro","summary":{"operation":"append","added-files-size":"1716","added-data-files":"1","added-records":"4","total-data-files":"1","total-delete-files":"0","total-records":"4","total-files-size":"1716","total-position-deletes":"0","total-equality-deletes":"0"},"schema-id":0}],"snapshot-log":[{"snapshot-id":1074794464454607928,"timestamp-ms":1786970727945}],"metadata-log":[{"metadata-file":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/evolved/metadata/00000-7b1ee4a6-d23e-4597-a952-1faeae2c6631.metadata.json","timestamp-ms":1786970727942}],"sort-orders":[{"order-id":0,"fields":[]}],"default-sort-order-id":0,"refs":{"main":{"snapshot-id":1074794464454607928,"type":"branch"}},"statistics":[],"partition-statistics":[],"format-version":2,"last-sequence-number":1}
|
package/demo/iceberg/evolved/metadata/00002-5751d450-f81a-453c-b1c1-7c0ecb3b847a.metadata.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"location":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/evolved","table-uuid":"e8bd35bb-21a6-4cbe-9d12-c3313b48a1f7","last-updated-ms":1786970727948,"last-column-id":5,"schemas":[{"type":"struct","fields":[{"id":1,"name":"id","type":"long","required":false},{"id":2,"name":"region","type":"string","required":false},{"id":3,"name":"product","type":"string","required":false},{"id":4,"name":"amount","type":"double","required":false}],"schema-id":0,"identifier-field-ids":[]},{"type":"struct","fields":[{"id":1,"name":"id","type":"long","required":false},{"id":2,"name":"region","type":"string","required":false},{"id":3,"name":"product","type":"string","required":false},{"id":4,"name":"total","type":"double","required":false},{"id":5,"name":"currency","type":"string","required":false}],"schema-id":1,"identifier-field-ids":[]}],"current-schema-id":1,"partition-specs":[{"spec-id":0,"fields":[]}],"default-spec-id":0,"last-partition-id":999,"properties":{},"current-snapshot-id":1074794464454607928,"snapshots":[{"snapshot-id":1074794464454607928,"sequence-number":1,"timestamp-ms":1786970727945,"manifest-list":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/evolved/metadata/snap-1074794464454607928-0-f612a2cc-fd42-4fe7-8f30-849c886ed42f.avro","summary":{"operation":"append","added-files-size":"1716","added-data-files":"1","added-records":"4","total-data-files":"1","total-delete-files":"0","total-records":"4","total-files-size":"1716","total-position-deletes":"0","total-equality-deletes":"0"},"schema-id":0}],"snapshot-log":[{"snapshot-id":1074794464454607928,"timestamp-ms":1786970727945}],"metadata-log":[{"metadata-file":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/evolved/metadata/00000-7b1ee4a6-d23e-4597-a952-1faeae2c6631.metadata.json","timestamp-ms":1786970727942},{"metadata-file":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/evolved/metadata/00001-f82a6028-170f-4c99-9f69-dc9c5db7706f.metadata.json","timestamp-ms":1786970727945}],"sort-orders":[{"order-id":0,"fields":[]}],"default-sort-order-id":0,"refs":{"main":{"snapshot-id":1074794464454607928,"type":"branch"}},"statistics":[],"partition-statistics":[],"format-version":2,"last-sequence-number":1}
|
package/demo/iceberg/evolved/metadata/00003-b392ee5d-33c3-4c03-9448-941481157646.metadata.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"location":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/evolved","table-uuid":"e8bd35bb-21a6-4cbe-9d12-c3313b48a1f7","last-updated-ms":1786970727951,"last-column-id":5,"schemas":[{"type":"struct","fields":[{"id":1,"name":"id","type":"long","required":false},{"id":2,"name":"region","type":"string","required":false},{"id":3,"name":"product","type":"string","required":false},{"id":4,"name":"amount","type":"double","required":false}],"schema-id":0,"identifier-field-ids":[]},{"type":"struct","fields":[{"id":1,"name":"id","type":"long","required":false},{"id":2,"name":"region","type":"string","required":false},{"id":3,"name":"product","type":"string","required":false},{"id":4,"name":"total","type":"double","required":false},{"id":5,"name":"currency","type":"string","required":false}],"schema-id":1,"identifier-field-ids":[]}],"current-schema-id":1,"partition-specs":[{"spec-id":0,"fields":[]}],"default-spec-id":0,"last-partition-id":999,"properties":{},"current-snapshot-id":4829795160162008264,"snapshots":[{"snapshot-id":1074794464454607928,"sequence-number":1,"timestamp-ms":1786970727945,"manifest-list":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/evolved/metadata/snap-1074794464454607928-0-f612a2cc-fd42-4fe7-8f30-849c886ed42f.avro","summary":{"operation":"append","added-files-size":"1716","added-data-files":"1","added-records":"4","total-data-files":"1","total-delete-files":"0","total-records":"4","total-files-size":"1716","total-position-deletes":"0","total-equality-deletes":"0"},"schema-id":0},{"snapshot-id":4829795160162008264,"parent-snapshot-id":1074794464454607928,"sequence-number":2,"timestamp-ms":1786970727951,"manifest-list":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/evolved/metadata/snap-4829795160162008264-0-257f0a82-aa89-49ca-ab08-2e15d7a6ce61.avro","summary":{"operation":"append","added-files-size":"1961","added-data-files":"1","added-records":"1","total-data-files":"2","total-delete-files":"0","total-records":"5","total-files-size":"3677","total-position-deletes":"0","total-equality-deletes":"0"},"schema-id":1}],"snapshot-log":[{"snapshot-id":1074794464454607928,"timestamp-ms":1786970727945},{"snapshot-id":4829795160162008264,"timestamp-ms":1786970727951}],"metadata-log":[{"metadata-file":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/evolved/metadata/00000-7b1ee4a6-d23e-4597-a952-1faeae2c6631.metadata.json","timestamp-ms":1786970727942},{"metadata-file":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/evolved/metadata/00001-f82a6028-170f-4c99-9f69-dc9c5db7706f.metadata.json","timestamp-ms":1786970727945},{"metadata-file":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/evolved/metadata/00002-5751d450-f81a-453c-b1c1-7c0ecb3b847a.metadata.json","timestamp-ms":1786970727948}],"sort-orders":[{"order-id":0,"fields":[]}],"default-sort-order-id":0,"refs":{"main":{"snapshot-id":4829795160162008264,"type":"branch"}},"statistics":[],"partition-statistics":[],"format-version":2,"last-sequence-number":2}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"location":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/hadoop","table-uuid":"5286ed49-1d5b-4399-9cc1-12959a24df75","last-updated-ms":1786970727961,"last-column-id":4,"schemas":[{"type":"struct","fields":[{"id":1,"name":"id","type":"long","required":false},{"id":2,"name":"region","type":"string","required":false},{"id":3,"name":"product","type":"string","required":false},{"id":4,"name":"amount","type":"double","required":false}],"schema-id":0,"identifier-field-ids":[]}],"current-schema-id":0,"partition-specs":[{"spec-id":0,"fields":[]}],"default-spec-id":0,"last-partition-id":999,"properties":{},"current-snapshot-id":1143458465259875935,"snapshots":[{"snapshot-id":1143458465259875935,"sequence-number":1,"timestamp-ms":1786970727961,"manifest-list":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/hadoop/metadata/snap-1143458465259875935-0-01fd755b-8ea2-4aed-9a21-07e07fcf34bc.avro","summary":{"operation":"append","added-files-size":"1716","added-data-files":"1","added-records":"4","total-data-files":"1","total-delete-files":"0","total-records":"4","total-files-size":"1716","total-position-deletes":"0","total-equality-deletes":"0"},"schema-id":0}],"snapshot-log":[{"snapshot-id":1143458465259875935,"timestamp-ms":1786970727961}],"metadata-log":[{"metadata-file":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/hadoop/metadata/00000-5f9520ae-7bee-483f-8ff2-9f40a0fcbcc3.metadata.json","timestamp-ms":1786970727958}],"sort-orders":[{"order-id":0,"fields":[]}],"default-sort-order-id":0,"refs":{"main":{"snapshot-id":1143458465259875935,"type":"branch"}},"statistics":[],"partition-statistics":[],"format-version":2,"last-sequence-number":1}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/demo/iceberg/partition/metadata/00000-cde33df7-2164-4f3a-ac15-10aab9c841ac.metadata.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"location":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/partition","table-uuid":"4ac926be-c3af-4ec5-87a7-bd63348d769c","last-updated-ms":1786970727927,"last-column-id":4,"schemas":[{"type":"struct","fields":[{"id":1,"name":"id","type":"long","required":false},{"id":2,"name":"region","type":"string","required":false},{"id":3,"name":"product","type":"string","required":false},{"id":4,"name":"amount","type":"double","required":false}],"schema-id":0,"identifier-field-ids":[]}],"current-schema-id":0,"partition-specs":[{"spec-id":0,"fields":[]}],"default-spec-id":0,"last-partition-id":999,"properties":{},"snapshots":[],"snapshot-log":[],"metadata-log":[],"sort-orders":[{"order-id":0,"fields":[]}],"default-sort-order-id":0,"refs":{},"statistics":[],"partition-statistics":[],"format-version":2,"last-sequence-number":0}
|
package/demo/iceberg/partition/metadata/00001-49f1d5a2-0111-4c83-b71c-6a84ffc1eeb4.metadata.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"location":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/partition","table-uuid":"4ac926be-c3af-4ec5-87a7-bd63348d769c","last-updated-ms":1786970727929,"last-column-id":4,"schemas":[{"type":"struct","fields":[{"id":1,"name":"id","type":"long","required":false},{"id":2,"name":"region","type":"string","required":false},{"id":3,"name":"product","type":"string","required":false},{"id":4,"name":"amount","type":"double","required":false}],"schema-id":0,"identifier-field-ids":[]}],"current-schema-id":0,"partition-specs":[{"spec-id":0,"fields":[]},{"spec-id":1,"fields":[{"source-id":2,"field-id":1000,"transform":"identity","name":"region_part"}]}],"default-spec-id":1,"last-partition-id":1000,"properties":{},"snapshots":[],"snapshot-log":[],"metadata-log":[{"metadata-file":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/partition/metadata/00000-cde33df7-2164-4f3a-ac15-10aab9c841ac.metadata.json","timestamp-ms":1786970727927}],"sort-orders":[{"order-id":0,"fields":[]}],"default-sort-order-id":0,"refs":{},"statistics":[],"partition-statistics":[],"format-version":2,"last-sequence-number":0}
|
package/demo/iceberg/partition/metadata/00002-455a595a-b069-4002-b1f6-bd89611f483c.metadata.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"location":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/partition","table-uuid":"4ac926be-c3af-4ec5-87a7-bd63348d769c","last-updated-ms":1786970727936,"last-column-id":4,"schemas":[{"type":"struct","fields":[{"id":1,"name":"id","type":"long","required":false},{"id":2,"name":"region","type":"string","required":false},{"id":3,"name":"product","type":"string","required":false},{"id":4,"name":"amount","type":"double","required":false}],"schema-id":0,"identifier-field-ids":[]}],"current-schema-id":0,"partition-specs":[{"spec-id":0,"fields":[]},{"spec-id":1,"fields":[{"source-id":2,"field-id":1000,"transform":"identity","name":"region_part"}]}],"default-spec-id":1,"last-partition-id":1000,"properties":{},"current-snapshot-id":5440112098897409547,"snapshots":[{"snapshot-id":5440112098897409547,"sequence-number":1,"timestamp-ms":1786970727936,"manifest-list":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/partition/metadata/snap-5440112098897409547-0-2d48a1ff-55ba-4bae-9c6b-8732d8323bd7.avro","summary":{"operation":"append","added-files-size":"4932","added-data-files":"3","added-records":"4","changed-partition-count":"3","total-data-files":"3","total-delete-files":"0","total-records":"4","total-files-size":"4932","total-position-deletes":"0","total-equality-deletes":"0"},"schema-id":0}],"snapshot-log":[{"snapshot-id":5440112098897409547,"timestamp-ms":1786970727936}],"metadata-log":[{"metadata-file":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/partition/metadata/00000-cde33df7-2164-4f3a-ac15-10aab9c841ac.metadata.json","timestamp-ms":1786970727927},{"metadata-file":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/partition/metadata/00001-49f1d5a2-0111-4c83-b71c-6a84ffc1eeb4.metadata.json","timestamp-ms":1786970727929}],"sort-orders":[{"order-id":0,"fields":[]}],"default-sort-order-id":0,"refs":{"main":{"snapshot-id":5440112098897409547,"type":"branch"}},"statistics":[],"partition-statistics":[],"format-version":2,"last-sequence-number":1}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/demo/iceberg/position/metadata/00000-0c9f7b09-cbc3-4933-b0a8-01d8a809916e.metadata.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"location":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/position","table-uuid":"415dd6b0-de3c-455d-a85d-78a650391aad","last-updated-ms":1786970727968,"last-column-id":4,"schemas":[{"type":"struct","fields":[{"id":1,"name":"id","type":"long","required":false},{"id":2,"name":"region","type":"string","required":false},{"id":3,"name":"product","type":"string","required":false},{"id":4,"name":"amount","type":"double","required":false}],"schema-id":0,"identifier-field-ids":[]}],"current-schema-id":0,"partition-specs":[{"spec-id":0,"fields":[]}],"default-spec-id":0,"last-partition-id":999,"properties":{},"snapshots":[],"snapshot-log":[],"metadata-log":[],"sort-orders":[{"order-id":0,"fields":[]}],"default-sort-order-id":0,"refs":{},"statistics":[],"partition-statistics":[],"format-version":2,"last-sequence-number":0}
|
package/demo/iceberg/position/metadata/00001-8fc1224a-057c-4848-9c74-9c4e592c3545.metadata.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"location":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/position","table-uuid":"415dd6b0-de3c-455d-a85d-78a650391aad","last-updated-ms":1786970727972,"last-column-id":4,"schemas":[{"type":"struct","fields":[{"id":1,"name":"id","type":"long","required":false},{"id":2,"name":"region","type":"string","required":false},{"id":3,"name":"product","type":"string","required":false},{"id":4,"name":"amount","type":"double","required":false}],"schema-id":0,"identifier-field-ids":[]}],"current-schema-id":0,"partition-specs":[{"spec-id":0,"fields":[]}],"default-spec-id":0,"last-partition-id":999,"properties":{},"current-snapshot-id":8554796374254190464,"snapshots":[{"snapshot-id":8554796374254190464,"sequence-number":1,"timestamp-ms":1786970727972,"manifest-list":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/position/metadata/snap-8554796374254190464-0-8d1a982c-c1b7-47d9-a584-de646ada36b6.avro","summary":{"operation":"append","added-files-size":"1716","added-data-files":"1","added-records":"4","total-data-files":"1","total-delete-files":"0","total-records":"4","total-files-size":"1716","total-position-deletes":"0","total-equality-deletes":"0"},"schema-id":0}],"snapshot-log":[{"snapshot-id":8554796374254190464,"timestamp-ms":1786970727972}],"metadata-log":[{"metadata-file":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/position/metadata/00000-0c9f7b09-cbc3-4933-b0a8-01d8a809916e.metadata.json","timestamp-ms":1786970727968}],"sort-orders":[{"order-id":0,"fields":[]}],"default-sort-order-id":0,"refs":{"main":{"snapshot-id":8554796374254190464,"type":"branch"}},"statistics":[],"partition-statistics":[],"format-version":2,"last-sequence-number":1}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
{
|
|
2
|
+
"location": "file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/position",
|
|
3
|
+
"table-uuid": "415dd6b0-de3c-455d-a85d-78a650391aad",
|
|
4
|
+
"last-updated-ms": 1786970727972,
|
|
5
|
+
"last-column-id": 4,
|
|
6
|
+
"schemas": [
|
|
7
|
+
{
|
|
8
|
+
"type": "struct",
|
|
9
|
+
"fields": [
|
|
10
|
+
{
|
|
11
|
+
"id": 1,
|
|
12
|
+
"name": "id",
|
|
13
|
+
"type": "long",
|
|
14
|
+
"required": false
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": 2,
|
|
18
|
+
"name": "region",
|
|
19
|
+
"type": "string",
|
|
20
|
+
"required": false
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": 3,
|
|
24
|
+
"name": "product",
|
|
25
|
+
"type": "string",
|
|
26
|
+
"required": false
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": 4,
|
|
30
|
+
"name": "amount",
|
|
31
|
+
"type": "double",
|
|
32
|
+
"required": false
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"schema-id": 0,
|
|
36
|
+
"identifier-field-ids": []
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"current-schema-id": 0,
|
|
40
|
+
"partition-specs": [
|
|
41
|
+
{
|
|
42
|
+
"spec-id": 0,
|
|
43
|
+
"fields": []
|
|
44
|
+
}
|
|
45
|
+
],
|
|
46
|
+
"default-spec-id": 0,
|
|
47
|
+
"last-partition-id": 999,
|
|
48
|
+
"properties": {},
|
|
49
|
+
"current-snapshot-id": 8554796374254190465,
|
|
50
|
+
"snapshots": [
|
|
51
|
+
{
|
|
52
|
+
"snapshot-id": 8554796374254190464,
|
|
53
|
+
"sequence-number": 1,
|
|
54
|
+
"timestamp-ms": 1786970727972,
|
|
55
|
+
"manifest-list": "file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/position/metadata/snap-8554796374254190464-0-8d1a982c-c1b7-47d9-a584-de646ada36b6.avro",
|
|
56
|
+
"summary": {
|
|
57
|
+
"operation": "append",
|
|
58
|
+
"added-files-size": "1716",
|
|
59
|
+
"added-data-files": "1",
|
|
60
|
+
"added-records": "4",
|
|
61
|
+
"total-data-files": "1",
|
|
62
|
+
"total-delete-files": "0",
|
|
63
|
+
"total-records": "4",
|
|
64
|
+
"total-files-size": "1716",
|
|
65
|
+
"total-position-deletes": "0",
|
|
66
|
+
"total-equality-deletes": "0"
|
|
67
|
+
},
|
|
68
|
+
"schema-id": 0
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"snapshot-id": 8554796374254190465,
|
|
72
|
+
"parent-snapshot-id": 8554796374254190464,
|
|
73
|
+
"sequence-number": 2,
|
|
74
|
+
"timestamp-ms": 1786970728972,
|
|
75
|
+
"manifest-list": "file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/position/metadata/snap-8554796374254190465-0-delete.avro",
|
|
76
|
+
"summary": {
|
|
77
|
+
"operation": "delete"
|
|
78
|
+
},
|
|
79
|
+
"schema-id": 0
|
|
80
|
+
}
|
|
81
|
+
],
|
|
82
|
+
"snapshot-log": [
|
|
83
|
+
{
|
|
84
|
+
"snapshot-id": 8554796374254190464,
|
|
85
|
+
"timestamp-ms": 1786970727972
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"snapshot-id": 8554796374254190465,
|
|
89
|
+
"timestamp-ms": 1786970728972
|
|
90
|
+
}
|
|
91
|
+
],
|
|
92
|
+
"metadata-log": [
|
|
93
|
+
{
|
|
94
|
+
"metadata-file": "file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/position/metadata/00000-0c9f7b09-cbc3-4933-b0a8-01d8a809916e.metadata.json",
|
|
95
|
+
"timestamp-ms": 1786970727968
|
|
96
|
+
}
|
|
97
|
+
],
|
|
98
|
+
"sort-orders": [
|
|
99
|
+
{
|
|
100
|
+
"order-id": 0,
|
|
101
|
+
"fields": []
|
|
102
|
+
}
|
|
103
|
+
],
|
|
104
|
+
"default-sort-order-id": 0,
|
|
105
|
+
"refs": {
|
|
106
|
+
"main": {
|
|
107
|
+
"snapshot-id": 8554796374254190464,
|
|
108
|
+
"type": "branch"
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
"statistics": [],
|
|
112
|
+
"partition-statistics": [],
|
|
113
|
+
"format-version": 2,
|
|
114
|
+
"last-sequence-number": 2
|
|
115
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"location":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/sales","table-uuid":"4db7af6d-b75e-4376-9a52-9a026c046de5","last-updated-ms":1786970727853,"last-column-id":4,"schemas":[{"type":"struct","fields":[{"id":1,"name":"id","type":"long","required":false},{"id":2,"name":"region","type":"string","required":false},{"id":3,"name":"product","type":"string","required":false},{"id":4,"name":"amount","type":"double","required":false}],"schema-id":0,"identifier-field-ids":[]}],"current-schema-id":0,"partition-specs":[{"spec-id":0,"fields":[]}],"default-spec-id":0,"last-partition-id":999,"properties":{},"snapshots":[],"snapshot-log":[],"metadata-log":[],"sort-orders":[{"order-id":0,"fields":[]}],"default-sort-order-id":0,"refs":{},"statistics":[],"partition-statistics":[],"format-version":2,"last-sequence-number":0}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"location":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/sales","table-uuid":"4db7af6d-b75e-4376-9a52-9a026c046de5","last-updated-ms":1786970727885,"last-column-id":4,"schemas":[{"type":"struct","fields":[{"id":1,"name":"id","type":"long","required":false},{"id":2,"name":"region","type":"string","required":false},{"id":3,"name":"product","type":"string","required":false},{"id":4,"name":"amount","type":"double","required":false}],"schema-id":0,"identifier-field-ids":[]}],"current-schema-id":0,"partition-specs":[{"spec-id":0,"fields":[]}],"default-spec-id":0,"last-partition-id":999,"properties":{},"current-snapshot-id":7501977550537779287,"snapshots":[{"snapshot-id":7501977550537779287,"sequence-number":1,"timestamp-ms":1786970727885,"manifest-list":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/sales/metadata/snap-7501977550537779287-0-16494fa7-6997-413a-83c6-bfc6d53f3da5.avro","summary":{"operation":"append","added-files-size":"1716","added-data-files":"1","added-records":"4","total-data-files":"1","total-delete-files":"0","total-records":"4","total-files-size":"1716","total-position-deletes":"0","total-equality-deletes":"0"},"schema-id":0}],"snapshot-log":[{"snapshot-id":7501977550537779287,"timestamp-ms":1786970727885}],"metadata-log":[{"metadata-file":"file:///Users/rock/git/rock2/objectexplorer/reference/data/iceberg/sales/metadata/00000-82dd52ff-dd85-4033-b71a-c16358a1926e.metadata.json","timestamp-ms":1786970727853}],"sort-orders":[{"order-id":0,"fields":[]}],"default-sort-order-id":0,"refs":{"main":{"snapshot-id":7501977550537779287,"type":"branch"}},"statistics":[],"partition-statistics":[],"format-version":2,"last-sequence-number":1}
|