Every column of the fourteen planning files in a Parquet snapshot — the schedule as posted — with its physical type, whether it can be empty, and what it holds. It is a lookup table for data engineers and report developers who are already reading the export and need to know what a column means; for how snapshots are laid out and how to tell a finished one from a partial write, see Parquet export.
Contents
- activity.parquet
- resource.parquet
- calendar.parquet
- successor.parquet
- structure.parquet
- structureElement.parquet
- activityStructureElement.parquet
- resourceAssignment.parquet
- resourceAvailability.parquet
- calendarOperation.parquet
- weeklyRepeatingPeriod.parquet
- connectedPeriod.parquet
- profile.parquet
- profilePoint.parquet
How to read these tables
Each section lists the fixed columns of one file: the columns every snapshot of that file has, on every deployment. Metadata columns are extra, differ per customer, and are covered separately below.
Every column is physically nullable. The writer emits an optional Parquet field for all of them, so the file's schema marks nothing as required. The Empty? column therefore describes the data rather than the schema:
never— the value is a non-optional part of the entity and every row carries one.possible— the value is genuinely optional, and a consumer has to handle null.
A consumer that tries to read a non-null constraint out of the schema will not find one.
Column order is not a contract. Columns are discovered by reflection over the domain model, most-derived declarations first and inherited ones last — which is why Id and Created sit at the end of almost every table rather than the start. These tables list them in the order the file actually stores them, but that order can shift when the model changes. Address columns by name.
Enum columns carry names, not numbers. Where a column is an enum its permitted values are listed under the table. This is worth checking if you are moving a query over from the REST export, which serves the same values as integers alongside a separate …Text field: compare a Parquet enum column against a number and you get an empty result with no error to tell you why.
Metadata columns
Alongside the fixed columns above, a file can carry one column per metadata field. Only three planning files do: activity.parquet, resource.parquet and resourceAssignment.parquet. Every other planning file has fixed columns only, and each section below says so.
The set is not driven by your schedule type configuration. It is driven by the values that are actually there: the export collects the distinct metadata fields that have a value on the rows in scope, so a field configured for your deployment but never populated produces no column at all. Three consequences worth planning for:
The column set differs between customers, between two schedules of one customer, and between two cut-offs of the same schedule. A field populated for the first time appears as a new column in the next snapshot only, and earlier snapshots are not rewritten to gain it.
The scope differs per file, so two files in one snapshot can disagree about which fields exist:
File Carries the fields with values on… activity.parquetactivities of this planning schedule resource.parquetresources of the schedule's data set resourceAssignment.parquetresource assignments of this schedule's activities Numeric types collapse. A metadata field's numeric value is stored in a single numeric column whatever its declared type, so integer, decimal and floating-point fields all arrive as
double. Boolean fields arrive asboolean, date fields astimestamp, and everything else asstring.
A metadata column's name is not its identity. Names are sanitised and de-duplicated against the names already taken, so a metadata field can arrive under a suffixed name — Description_2 rather than Description. No two fixed columns collide anywhere in the export, so a _2 or _3 suffix is always a metadata field that lost a name race, either against a fixed column or against a metadata field resolved before it. The suffixes are handed out in order, so adding a field upstream can move an existing column from _2 to _3.
Resolve metadata columns through _manifest.json, which maps each physical column back to its IlapId, before combining snapshots or comparing deployments. Parquet export covers the manifest in full.
activity.parquet
The activities of the schedule as posted — dates, durations, work hours and progress. One row per activity.
| Column | Type | Empty? | Meaning |
|---|---|---|---|
| ScheduleId | int32 | never | The planning schedule this activity belongs to. |
| CalendarId | int32 | possible | The working calendar the activity is scheduled against, into calendar.parquet. |
| ActivityType | string | never | What kind of activity this is — see the values below the table. |
| Description | string | possible | Free-text description of the activity. |
| FinishAsEarlyAsPossible | boolean | never | Whether the activity is constrained to finish as early as the logic allows. |
| FinishNoLaterThan | timestamp | possible | Constraint date: the activity must not finish after this. |
| MustFinishOn | timestamp | possible | Constraint date: the activity is pinned to finish on this date. |
| MustStartOn | timestamp | possible | Constraint date: the activity is pinned to start on this date. |
| StartAsEarlyAsPossible | boolean | never | Whether the activity is constrained to start as early as the logic allows. |
| StartAsLateAsPossible | boolean | never | Whether the activity is constrained to start as late as the logic allows. |
| StartNoEarlierThan | timestamp | possible | Constraint date: the activity must not start before this. |
| StartNoLaterThan | timestamp | possible | Constraint date: the activity must not start after this. |
| ActualFinish | timestamp | possible | When the activity actually finished. Empty until it has. |
| ActualStart | timestamp | possible | When the activity actually started. Empty until it has. |
| ActualWorkHours | double | never | Work hours expended on the activity so far. |
| CurrentProgress | double | never | Progress reported on the activity, as a percentage — 20 means 20%. |
| EarlyStart | timestamp | possible | Earliest the activity can start under the schedule logic. |
| EarlyFinish | timestamp | possible | Earliest the activity can finish under the schedule logic. |
| LateFinish | timestamp | possible | Latest the activity can finish without delaying the schedule. |
| LateStart | timestamp | possible | Latest the activity can start without delaying the schedule. |
| FreeFloatHours | double | never | Hours the activity can slip before it delays a successor. |
| TotalFloatHours | double | never | Hours the activity can slip before it delays the end of the schedule. |
| PlannedWorkHours | double | never | Work hours planned for the activity. |
| RemainingWorkHours | double | never | Work hours still to be expended on the activity. |
| IsCancelled | boolean | possible | Whether the activity has been cancelled. |
| CancelledDate | timestamp | possible | When the activity was cancelled. Empty unless it was. |
| PlannedProgress | double | never | Progress the activity was planned to have reached, as a percentage — 20 means 20%. |
| FinishOnOrAfter | timestamp | possible | Constraint date: the activity must not finish before this. |
| AlwaysOnSchedule | boolean | never | The ILAP IsAlwaysOnSchedule flag as imported. |
| DurationHours | double | possible | Planned duration of the activity in hours. |
| RemainingDurationHours | double | possible | Duration still remaining, in hours. |
| CalendarRef | string | possible | The IlapId of the calendar in CalendarId. Use this to join across snapshots. |
| Label | string | possible | Human-readable name of the activity. |
| LocalSystemId | string | possible | Identifier of the activity in the planning system it was imported from. |
| GlobalSystemId | string | possible | Identifier of the activity in the system of record it originates from. |
| Code | string | possible | Short code identifying the activity in the source planning system. |
| IlapId | string | possible | Stable ILAP identifier for the activity, carried across imports and deployments. |
| BaseUri | string | possible | Base URI recorded alongside the ILAP identifier when the activity was imported. |
| Id | int32 | never | Identifier of the row, unique within this snapshot only. |
| Created | timestamp | never | When the row was created in ILAP Analytics. |
ActivityType is one of: NotSet, RegularActivity, MilestoneStart, MilestoneFinish, Hammock, TaskDependent, ResourceDependent, LevelofEffort, WBSSummary.
This file carries metadata columns. See Metadata columns.
resource.parquet
The resources available to the schedule. One row per resource.
| Column | Type | Empty? | Meaning |
|---|---|---|---|
| DataId | int32 | never | The imported data set this resource belongs to. Resources are scoped to the data set rather than to one schedule. |
| Description | string | possible | Free-text description of the resource. |
| Label | string | possible | Human-readable name of the resource. |
| LocalSystemId | string | possible | Identifier of the resource in the planning system it was imported from. |
| GlobalSystemId | string | possible | Identifier of the resource in the system of record it originates from. |
| Code | string | possible | Short code identifying the resource in the source planning system. |
| IlapId | string | possible | Stable ILAP identifier for the resource, carried across imports and deployments. |
| BaseUri | string | possible | Base URI recorded alongside the ILAP identifier when the resource was imported. |
| Id | int32 | never | Identifier of the row, unique within this snapshot only. |
| Created | timestamp | never | When the row was created in ILAP Analytics. |
This file carries metadata columns. See Metadata columns.
calendar.parquet
The working calendars activities are scheduled against. One row per calendar; the rules that make it up are in calendarOperation.parquet.
| Column | Type | Empty? | Meaning |
|---|---|---|---|
| DataId | int32 | never | The imported data set this calendar belongs to. |
| HoursPerDay | double | never | Working hours in one calendar day, used to convert between hours and days. |
| Start | timestamp | never | Start of the period the calendar covers. |
| Finish | timestamp | never | End of the period the calendar covers. |
| Description | string | possible | Free-text description of the calendar. |
| Label | string | possible | Human-readable name of the calendar. |
| LocalSystemId | string | possible | Identifier of the calendar in the planning system it was imported from. |
| GlobalSystemId | string | possible | Identifier of the calendar in the system of record it originates from. |
| Code | string | possible | Short code identifying the calendar in the source planning system. |
| IlapId | string | possible | Stable ILAP identifier for the calendar, carried across imports and deployments. |
| BaseUri | string | possible | Base URI recorded alongside the ILAP identifier when the calendar was imported. |
| Id | int32 | never | Identifier of the row, unique within this snapshot only. |
| Created | timestamp | never | When the row was created in ILAP Analytics. |
This file carries no metadata columns.
successor.parquet
The links between activities and the lag on each. One row per link, held against its predecessor activity.
| Column | Type | Empty? | Meaning |
|---|---|---|---|
| ActivityId | int32 | never | The predecessor activity the link runs from, into activity.parquet. |
| SuccessorObjectId | int32 | possible | The successor activity the link runs to, into activity.parquet. |
| CalendarId | int32 | possible | The calendar the lag is measured against, into calendar.parquet. |
| Type | string | never | Which ends of the two activities the link joins — see the values below the table. |
| LagHours | double | never | Lag on the link, in hours. Negative values are leads. |
| SuccessorRef | string | possible | The IlapId of the successor activity in SuccessorObjectId. Use this to join across snapshots. |
| CalendarRef | string | possible | The IlapId of the calendar in CalendarId. Use this to join across snapshots. |
| IlapId | string | possible | Stable ILAP identifier for the link, carried across imports and deployments. |
| BaseUri | string | possible | Base URI recorded alongside the ILAP identifier when the link was imported. |
| Id | int32 | never | Identifier of the row, unique within this snapshot only. |
| Created | timestamp | never | When the row was created in ILAP Analytics. |
Type is one of: StartToStart, StartToFinish, FinishToStart, FinishToFinish.
This file carries no metadata columns.
structure.parquet
The breakdown structures defined over the schedule — the WBS and any other activity hierarchy. One row per structure; its nodes are in structureElement.parquet.
| Column | Type | Empty? | Meaning |
|---|---|---|---|
| DataId | int32 | never | The imported data set this structure belongs to. |
| Description | string | possible | Free-text description of the structure. |
| Type | string | never | Whether the structure is a WBS, a flat list or a hierarchical list — see the values below the table. |
| Label | string | possible | Human-readable name of the structure. |
| LocalSystemId | string | possible | Identifier of the structure in the planning system it was imported from. |
| GlobalSystemId | string | possible | Identifier of the structure in the system of record it originates from. |
| Code | string | possible | Short code identifying the structure in the source planning system. |
| IlapId | string | possible | Stable ILAP identifier for the structure, carried across imports and deployments. |
| BaseUri | string | possible | Base URI recorded alongside the ILAP identifier when the structure was imported. |
| Id | int32 | never | Identifier of the row, unique within this snapshot only. |
| Created | timestamp | never | When the row was created in ILAP Analytics. |
Type is one of: Wbs, FlatList, HierarchicalList.
This file carries no metadata columns.
structureElement.parquet
The nodes within a breakdown structure, each pointing at its parent. One row per node; walk ParentElementId to rebuild the hierarchy.
| Column | Type | Empty? | Meaning |
|---|---|---|---|
| StructureId | int32 | never | The structure this node belongs to, into structure.parquet. |
| Description | string | possible | Free-text description of the node. |
| ParentElementIlapId | string | possible | The IlapId of the parent node. Use this to rebuild the hierarchy across snapshots. |
| ParentElementId | int32 | possible | The parent node within this snapshot. Empty at the root of the structure. |
| Label | string | possible | Human-readable name of the node. |
| LocalSystemId | string | possible | Identifier of the node in the planning system it was imported from. |
| GlobalSystemId | string | possible | Identifier of the node in the system of record it originates from. |
| Code | string | possible | Short code identifying the node in the source planning system. |
| IlapId | string | possible | Stable ILAP identifier for the node, carried across imports and deployments. |
| BaseUri | string | possible | Base URI recorded alongside the ILAP identifier when the node was imported. |
| Id | int32 | never | Identifier of the row, unique within this snapshot only. |
| Created | timestamp | never | When the row was created in ILAP Analytics. |
This file carries no metadata columns.
activityStructureElement.parquet
Which activities hang off which structure nodes. One row per membership — the join table between activity.parquet and structureElement.parquet.
| Column | Type | Empty? | Meaning |
|---|---|---|---|
| ActivityId | int32 | never | The activity, into activity.parquet. |
| StructureElementId | int32 | never | The structure node it hangs off, into structureElement.parquet. |
This file carries no rows of its own beyond the pair above — no Id and no Created, unlike every other planning file.
This file carries no metadata columns.
resourceAssignment.parquet
The resources assigned to activities, with the quantities involved. One row per assignment.
| Column | Type | Empty? | Meaning |
|---|---|---|---|
| ActivityId | int32 | never | The activity the resource is assigned to, into activity.parquet. |
| ProfileId | int32 | possible | The distribution profile that spreads the quantity over time, into profile.parquet. |
| CalendarId | int32 | possible | The calendar the assignment is scheduled against, into calendar.parquet. |
| ResourceId | int32 | possible | The resource assigned, into resource.parquet. |
| PlannedHours | double | never | Hours of this resource planned for the activity. |
| ActualHours | double | never | Hours of this resource expended so far. |
| EarlyStart | timestamp | possible | Earliest the assignment can start under the schedule logic. |
| EarlyFinish | timestamp | possible | Earliest the assignment can finish under the schedule logic. |
| LagHours | double | possible | Lag between the activity starting and the assignment starting, in hours. |
| CurrentProgress | double | never | Progress reported on the assignment, as a percentage — 20 means 20%. |
| CalendarRef | string | possible | The IlapId of the calendar in CalendarId. Use this to join across snapshots. |
| ResourceRef | string | possible | The IlapId of the resource in ResourceId. Use this to join across snapshots. |
| ProfileRef | string | possible | The IlapId of the profile in ProfileId. Use this to join across snapshots. |
| Label | string | possible | Human-readable name of the assignment. |
| LocalSystemId | string | possible | Identifier of the assignment in the planning system it was imported from. |
| GlobalSystemId | string | possible | Identifier of the assignment in the system of record it originates from. |
| Code | string | possible | Short code identifying the assignment in the source planning system. |
| IlapId | string | possible | Stable ILAP identifier for the assignment, carried across imports and deployments. |
| BaseUri | string | possible | Base URI recorded alongside the ILAP identifier when the assignment was imported. |
| Id | int32 | never | Identifier of the row, unique within this snapshot only. |
| Created | timestamp | never | When the row was created in ILAP Analytics. |
This file carries metadata columns. See Metadata columns.
resourceAvailability.parquet
The windows in which a resource is available, and at what quantity or rate. One row per window.
| Column | Type | Empty? | Meaning |
|---|---|---|---|
| ResourceId | int32 | never | The resource this window applies to, into resource.parquet. |
| CalendarId | int32 | possible | The calendar the window is measured against, into calendar.parquet. |
| ProfileId | int32 | possible | The distribution profile shaping availability across the window, into profile.parquet. |
| StartDateTime | timestamp | possible | Start of the window. Empty where the window is open-ended at the start. |
| FinishDateTime | timestamp | possible | End of the window. Empty where the window is open-ended at the end. |
| AvailableQuantity | double | possible | How much of the resource is available in the window. |
| AvailableRate | double | possible | The rate at which the resource is available in the window. |
| Label | string | possible | Human-readable name of the availability window. |
| LocalSystemId | string | possible | Identifier of the window in the planning system it was imported from. |
| GlobalSystemId | string | possible | Identifier of the window in the system of record it originates from. |
| Code | string | possible | Short code identifying the window in the source planning system. |
| IlapId | string | possible | Stable ILAP identifier for the window, carried across imports and deployments. |
| BaseUri | string | possible | Base URI recorded alongside the ILAP identifier when the window was imported. |
| Id | int32 | never | Identifier of the row, unique within this snapshot only. |
| Created | timestamp | never | When the row was created in ILAP Analytics. |
This file carries no metadata columns.
calendarOperation.parquet
One rule within a working calendar — either working time added or working time removed. One row per rule; when the rule applies is in weeklyRepeatingPeriod.parquet or connectedPeriod.parquet.
| Column | Type | Empty? | Meaning |
|---|---|---|---|
| CalendarId | int32 | never | The calendar this rule belongs to, into calendar.parquet. |
| Type | string | never | Whether the rule adds or removes working time — see the values below the table. |
| Id | int32 | never | Identifier of the row, unique within this snapshot only. |
| Created | timestamp | never | When the row was created in ILAP Analytics. |
Type is one of: RemoveWorkingTime, AddWorkingTime.
This file carries no metadata columns.
weeklyRepeatingPeriod.parquet
A calendar rule that repeats on a given weekday, with the times it starts and finishes. One row per weekday the rule covers.
| Column | Type | Empty? | Meaning |
|---|---|---|---|
| CalendarOperationId | int32 | never | The calendar rule this period belongs to, into calendarOperation.parquet. |
| DayOfWeek | string | never | The weekday the rule repeats on — see the values below the table. |
| StartTime | timestamp | never | Time of day the period starts. Only the time part carries meaning. |
| FinishTime | timestamp | never | Time of day the period finishes. Only the time part carries meaning. |
| Id | int32 | never | Identifier of the row, unique within this snapshot only. |
| Created | timestamp | never | When the row was created in ILAP Analytics. |
DayOfWeek is one of: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday.
This file carries no metadata columns.
connectedPeriod.parquet
A calendar rule covering one continuous range of dates rather than a repeating weekday. One row per range.
| Column | Type | Empty? | Meaning |
|---|---|---|---|
| CalendarOperationId | int32 | never | The calendar rule this period belongs to, into calendarOperation.parquet. |
| StartDateTime | timestamp | never | Start of the range the rule covers. |
| FinishDateTime | timestamp | never | End of the range the rule covers. |
| Id | int32 | never | Identifier of the row, unique within this snapshot only. |
| Created | timestamp | never | When the row was created in ILAP Analytics. |
This file carries no metadata columns.
profile.parquet
The distribution profiles used to spread a quantity over time. One row per profile; the curve itself is in profilePoint.parquet.
| Column | Type | Empty? | Meaning |
|---|---|---|---|
| DataId | int32 | never | The imported data set this profile belongs to. |
| IlapId | string | possible | Stable ILAP identifier for the profile, carried across imports and deployments. |
| BaseUri | string | possible | Base URI recorded alongside the ILAP identifier when the profile was imported. |
| Id | int32 | never | Identifier of the row, unique within this snapshot only. |
| Created | timestamp | never | When the row was created in ILAP Analytics. |
This file carries no metadata columns.
profilePoint.parquet
The (x, y) points that define a distribution profile. One row per point; order them by X to read the curve.
| Column | Type | Empty? | Meaning |
|---|---|---|---|
| ProfileId | int32 | never | The profile this point belongs to, into profile.parquet. |
| X | int32 | never | Position of the point along the profile. |
| Y | double | never | Value of the profile at that position. |
| Id | int32 | never | Identifier of the row, unique within this snapshot only. |
| Created | timestamp | never | When the row was created in ILAP Analytics. |
A profile normally runs from (0, 0) to (100, 100), so both axes read as percentages — proportion of the way through against proportion of the quantity accrued.
This file carries no metadata columns.
See also
- Parquet export — snapshot layout, the completion marker, and the manifest
- Parquet reporting columns — every column of the ten reporting files
- Reading Parquet from Fabric — shortcutting the export into a Lakehouse
- Why the export is plain Parquet
Was this article helpful?
That’s Great!
Thank you for your feedback
Sorry! We couldn't be helpful
Thank you for your feedback
Feedback sent
We appreciate your effort and will try to fix the article