Getting started
View repository
Getting started / EDGAR, PUDL and NOAARead source ↗

Create an EDGAR, PUDL, and NOAA Unified Semantic Layer

Current prerequisite warning: PUDL registration is known to fail. The successful run below is historical and conflicts with that result. Verify PUDL registration on your instance before using this example.

This guide records a model created and queried over JDBC on 2026-10-01. Treat its outputs as historical examples.

Start with Connecting Codex to Zetaris. Connect and get a row containing 1 from SELECT 1; before registering sources or compiling the USL. The connection check does not depend on a sample database already existing.

The model is lightning.metastore.edgar_pudl_demo.edgar_pudl_noaa_usl. It links Dominion Energy SEC facts to PUDL generators through a SEC CIK/EIA utility crosswalk, then adds NOAA observations to 2025 state-level generation rows.

Follow these steps in order:

  1. Connect.
  2. Inspect existing registrations.
  3. Register missing sources.
  4. Check schemas and join keys.
  5. Cache NOAA.
  6. Verify weather coverage.
  7. Compile the USL.
  8. Activate its tables.
  9. Query the joined result.
  10. Run DQ separately.

What you will create

USL table Row grain Source Relationships
company One SEC CIK EDGAR REST Parent of revenue and utility rows
revenue_year CIK and report year EDGAR REST cik references company
weather_period One selected station/state for the observed 2025 period NOAA station CSVs Referenced by 2025 utility rows
utility_state_year Matched CIK, state, and report year PUDL Parquet References company, revenue year, and weather period
flowchart LR
    SEC[SEC EDGAR REST] --> Company[company]
    SEC --> Revenue[revenue_year]
    PUDL[PUDL crosswalk and generators] --> Utility[utility_state_year]
    NOAA[Cached NOAA station CSVs] --> Weather[weather_period]
    Utility -->|cik| Company
    Revenue -->|cik| Company
    Utility -->|revenue_year_key| Revenue
    Utility -->|weather_period_key for 2025| Weather

The PUDL crosswalk uses probabilistic matching and may contain errors or missing matches. Treat CIK-to-utility links as analytical associations, not proof of ownership. See the crosswalk documentation.

The recorded run had 37 observed days per station, 2025-01-01 through 2025-02-06. This is a partial station series, not a full-year or statewide weather measure; the USL keeps the date range and day count.

1. Connect first and establish execution scope

Follow the connection guide. The driver included in zetaris-platform uses these local defaults:

Setting Local default
Driver JAR, relative to zetaris-platform jdbc/ndp-jdbc-driver-2.4.3.1-7eff043-driver.jar
Driver class com.zetaris.lightning.jdbc.LightningDriver
JDBC URL jdbc:zetaris:lightning@localhost:10000
Credentials Your assigned Zetaris user ID and password

Use your instance's host and port if they differ. localhost is the JDBC client's machine, which may not be the agent's host.

Use Zetaris Lightning SQL through the supplied driver; do not start Spark or create a local SparkSession. No application code changes are needed.

Send one SQL statement per JDBC request and wait for completion before dependent statements. Keep the connection open through caching and its queries where possible. Step 7's four-table COMPILE USL ... DDL is one payload; do not split on semicolons.

Before SEC registration, replace YOUR_APP_NAME YOUR_CONTACT_EMAIL with a real application name and contact email. Do not reuse the database login or put credentials in SQL, source control, or reports.

2. Inspect existing registrations and choose a model name

Create only missing objects. Inspect matching existing registrations before proceeding.

SHOW LIGHTNING DATABASES;

For each existing database, inspect its tables:

SHOW LIGHTNING TABLES SEC_DATA;
SHOW LIGHTNING TABLES PUDL_S3;
SHOW LIGHTNING TABLES NOAA_GHCN_S3;

Run table listings only for databases that exist. SHOW DATASOURCES does not list all Lightning REST/file databases.

For a fresh model, use the namespace and name shown here. If it exists, inspect it first; IF NOT EXISTS does not update it. For a separate version, choose a new name and change it in every compile, activation, and verification statement. Do not remove existing models to run this guide.

3. Register the required sources

These are the minimum registrations from the successful run. See the PUDL, EDGAR, and NOAA scripts. Register only the tables used here.

3.1 SEC EDGAR revenue facts

Create the logical database only if absent:

CREATE LIGHTNING DATABASE SEC_DATA DESCRIBE BY "SEC EDGAR company facts REST source";

Register Dominion Energy, CIK 0000715957, after replacing the SEC User-Agent placeholder:

CREATE LIGHTNING REST TABLE dominion_revenue_facts FROM SEC_DATA REQUEST(
    endpoint "https://data.sec.gov/api/xbrl/companyconcept/CIK0000715957/us-gaap/Revenues.json",
    method "get",
    response_type "json",
    http_encoding "URLENCODED"
) HEADER (
    user-agent "YOUR_APP_NAME YOUR_CONTACT_EMAIL"
) BODY ();

This uses company-wide us-gaap:Revenues facts from SEC EDGAR. The response repeats periods across filings; step 8 selects full-year facts and the latest filing per period end.

3.2 PUDL utility mapping and generator history

Create the logical database only if absent:

CREATE LIGHTNING DATABASE PUDL_S3 DESCRIBE BY "Catalyst Cooperative PUDL S3 filestore source";

Register the SEC-to-EIA crosswalk:

CREATE LIGHTNING FILESTORE TABLE pudl_sec10k_utility_matches FROM PUDL_S3 FORMAT PARQUET OPTIONS (
  PATH "s3a://pudl.catalyst.coop/stable/core_sec10k__assn_sec10k_filers_and_eia_utilities.parquet",
  inferSchema "true",
  isS3BucketPublic "true",
  useS3PathStyleAccess "true",
  s3Endpoint "s3.us-west-2.amazonaws.com"
);

Register the generator history:

CREATE LIGHTNING FILESTORE TABLE pudl_eia_yearly_generators FROM PUDL_S3 FORMAT PARQUET OPTIONS (
  PATH "s3a://pudl.catalyst.coop/stable/out_eia__yearly_generators.parquet",
  inferSchema "true",
  isS3BucketPublic "true",
  useS3PathStyleAccess "true",
  s3Endpoint "s3.us-west-2.amazonaws.com"
);

The public-bucket path needs no AWS credentials. PUDL's stable alias can change; for reproducible results, use a verified release path and inspect its schemas. See PUDL data access.

3.3 NOAA station histories

Create the logical database only if absent:

CREATE LIGHTNING DATABASE NOAA_GHCN_S3 DESCRIBE BY "NOAA GHCN-Daily S3 filestore source";

Use the three station files below instead of scanning the full csv/by_year/2025.csv file. Each station file contains historical data and takes time to load into cache.

CREATE LIGHTNING FILESTORE TABLE noaa_va_airport FROM NOAA_GHCN_S3 FORMAT CSV OPTIONS (
  PATH "s3a://noaa-ghcn-pds/csv/by_station/USW00013740.csv",
  inferSchema "false",
  header "false",
  isS3BucketPublic "true",
  useS3PathStyleAccess "true",
  s3Endpoint "s3.us-east-1.amazonaws.com"
);
CREATE LIGHTNING FILESTORE TABLE noaa_nc_airport FROM NOAA_GHCN_S3 FORMAT CSV OPTIONS (
  PATH "s3a://noaa-ghcn-pds/csv/by_station/USW00013722.csv",
  inferSchema "false",
  header "false",
  isS3BucketPublic "true",
  useS3PathStyleAccess "true",
  s3Endpoint "s3.us-east-1.amazonaws.com"
);
CREATE LIGHTNING FILESTORE TABLE noaa_sc_airport FROM NOAA_GHCN_S3 FORMAT CSV OPTIONS (
  PATH "s3a://noaa-ghcn-pds/csv/by_station/USW00013880.csv",
  inferSchema "false",
  header "false",
  isS3BucketPublic "true",
  useS3PathStyleAccess "true",
  s3Endpoint "s3.us-east-1.amazonaws.com"
);
State context Station ID Station name
VA USW00013740 Richmond International Airport
NC USW00013722 Raleigh Airport
SC USW00013880 Charleston International Airport

These are one-station series per state, not weather at every PUDL plant. The original run checked station IDs and names against the NOAA inventory.

4. Confirm schemas and the CIK-to-utility match

Inspect each source schema before compiling the USL:

DESCRIBE DATASOURCE TABLE SEC_DATA.dominion_revenue_facts;
DESCRIBE DATASOURCE TABLE PUDL_S3.pudl_sec10k_utility_matches;
DESCRIBE DATASOURCE TABLE PUDL_S3.pudl_eia_yearly_generators;
DESCRIBE DATASOURCE TABLE NOAA_GHCN_S3.noaa_va_airport;

Repeat the NOAA description for noaa_nc_airport and noaa_sc_airport. The recorded schema exposed _c0–_c7 as strings; activation uses _c1 for YYYYMMDD, _c2 for element, and _c3 for value. Adjust if your schema differs. Valid date filtering excludes a header row.

The PUDL crosswalk needs central_index_key and utility_id_eia. The generator table needs utility_id_eia, report_date, state, capacity_mw, and net_generation_mwh.

Check the SEC identity as data, not just as an inferred column:

SELECT cik, entityName FROM SEC_DATA.dominion_revenue_facts;

The recorded SEC CIK was numeric 715957; the USL pads it to 0000715957 to match PUDL's string key. Confirm both company name and CIK before using them as non-null keys.

Confirm the example's match and reporting coverage:

SELECT m.central_index_key, m.utility_id_eia,
       MAX(g.utility_name_eia) AS utility_name,
       g.report_date, g.state,
       COUNT(*) AS generator_count,
       SUM(g.net_generation_mwh) AS generation_mwh
FROM PUDL_S3.pudl_sec10k_utility_matches m
JOIN PUDL_S3.pudl_eia_yearly_generators g
  ON m.utility_id_eia = g.utility_id_eia
WHERE m.central_index_key = '0000715957'
  AND g.report_date BETWEEN DATE '2023-01-01' AND DATE '2025-12-31'
GROUP BY m.central_index_key, m.utility_id_eia, g.report_date, g.state
ORDER BY g.report_date, g.state;

The run matched CIK 0000715957 to EIA utility 5248 and returned nine state/year rows for NC, SC, and VA in 2023–2025. Resolve any different match before treating the foreign keys as valid. PUDL had 2026 rows with missing generation, so this example stops at 2025.

5. Cache the NOAA tables before aggregation

Execute each statement separately and wait for completion:

CACHE TABLE NOAA_GHCN_S3.noaa_va_airport;
CACHE TABLE NOAA_GHCN_S3.noaa_nc_airport;
CACHE TABLE NOAA_GHCN_S3.noaa_sc_airport;

All three cache commands completed in the recorded run; the first load took about 107 seconds.

Cache completion does not prove query correctness; run step 6. Persistence across reconnects or restarts is unverified, so treat this as temporary cache, not materialization. Keep the JDBC connection open where possible and reload as needed. SHOW CACHE TABLES does not prove explicit-cache membership; see the SQL companion.

6. Read the cached weather data and assess its period

SELECT state,
       COUNT(DISTINCT obs_date) AS observed_days,
       MIN(obs_date) AS from_date,
       MAX(obs_date) AS through_date,
       AVG(CASE WHEN element = 'TMAX' THEN CAST(data_value AS DOUBLE)/10.0 END) AS mean_tmax_c,
       AVG(CASE WHEN element = 'TMIN' THEN CAST(data_value AS DOUBLE)/10.0 END) AS mean_tmin_c,
       AVG(CASE WHEN element = 'PRCP' THEN CAST(data_value AS DOUBLE)/10.0 END) AS mean_daily_precip_mm
FROM (
  SELECT 'VA' AS state, _c1 AS obs_date, _c2 AS element, _c3 AS data_value FROM NOAA_GHCN_S3.noaa_va_airport
  UNION ALL
  SELECT 'NC' AS state, _c1 AS obs_date, _c2 AS element, _c3 AS data_value FROM NOAA_GHCN_S3.noaa_nc_airport
  UNION ALL
  SELECT 'SC' AS state, _c1 AS obs_date, _c2 AS element, _c3 AS data_value FROM NOAA_GHCN_S3.noaa_sc_airport
) obs
WHERE obs_date BETWEEN '20250101' AND '20251231'
  AND element IN ('TMAX','TMIN','PRCP')
  AND CAST(data_value AS INT) <> -9999
GROUP BY state
ORDER BY state;

The query divides temperatures and precipitation by 10 because NOAA stores tenths of °C and mm. mean_daily_precip_mm averages recorded precipitation days; it is not annual total rainfall. The query excludes -9999 but does not filter other NOAA quality flags.

Observed results from the cached aggregation:

State Days Through date Mean TMAX °C Mean TMIN °C Mean daily precipitation mm
NC 37 2025-02-06 10.722 -0.611 1.338
SC 37 2025-02-06 14.351 1.441 0.978
VA 37 2025-02-06 7.557 -3.741 2.492

Check current dates before using _2025_JANFEB. If the files cover another period, update the identifier in both weather and utility activations. Do not label a partial period as annual weather.

7. Compile and deploy all four table definitions together

Create the namespace if needed:

CREATE NAMESPACE IF NOT EXISTS lightning.metastore.edgar_pudl_demo;

Send this entire block as one JDBC statement. The semicolons terminate the embedded table definitions; do not split them into independent top-level requests.

COMPILE USL IF NOT EXISTS edgar_pudl_noaa_usl DEPLOY NAMESPACE lightning.metastore.edgar_pudl_demo DDL
CREATE TABLE company (
  cik          varchar(10) NOT NULL PRIMARY KEY,
  company_name varchar(200) NOT NULL
);

CREATE TABLE revenue_year (
  revenue_year_key varchar(20) NOT NULL PRIMARY KEY,
  cik              varchar(10) NOT NULL FOREIGN KEY REFERENCES company(cik),
  report_year      integer NOT NULL,
  period_start     date,
  period_end       date,
  revenue_usd      double,
  filing_date      date,
  accession_number varchar(30)
);

CREATE TABLE weather_period (
  weather_period_key      varchar(40) NOT NULL PRIMARY KEY,
  state                   varchar(2) NOT NULL,
  station_id              varchar(11) NOT NULL,
  station_name            varchar(60),
  period_start            date,
  period_end              date,
  observed_days           integer,
  valid_measurement_count integer,
  mean_daily_tmax_c       double,
  mean_daily_tmin_c       double,
  mean_daily_precip_mm    double
);

CREATE TABLE utility_state_year (
  utility_state_year_key varchar(40) NOT NULL PRIMARY KEY,
  cik                   varchar(10) NOT NULL FOREIGN KEY REFERENCES company(cik),
  revenue_year_key      varchar(20) FOREIGN KEY REFERENCES revenue_year(revenue_year_key),
  weather_period_key    varchar(40) FOREIGN KEY REFERENCES weather_period(weather_period_key),
  utility_id_eia        bigint NOT NULL,
  report_year           integer NOT NULL,
  state                 varchar(2) NOT NULL,
  generator_count       integer,
  net_generation_mwh    double,
  installed_capacity_mw double
);

Compile/deploy confirms the definitions were accepted, not that activated tables return rows.

8. Activate the tables in dependency order

The recorded version activates each source separately and adds cross-source foreign keys. A direct raw SEC/PUDL join hit an internal planning error.

COALESCE satisfies the declared NOT NULL schema when source expressions are nullable. It does not validate keys. Check CIK, state, and report year; blank keys or zero IDs are not valid records.

8.1 Company from SEC

ACTIVATE USL TABLE lightning.metastore.edgar_pudl_demo.edgar_pudl_noaa_usl.company AS
SELECT
    COALESCE(LPAD(CAST(cik AS STRING), 10, '0'), '') AS cik,
    COALESCE(MAX(entityName), '') AS company_name
FROM SEC_DATA.dominion_revenue_facts
GROUP BY cik;

8.2 Annual revenue from SEC

ACTIVATE USL TABLE lightning.metastore.edgar_pudl_demo.edgar_pudl_noaa_usl.revenue_year AS
SELECT
    COALESCE(CONCAT(cik, '_', CAST(report_year AS STRING)), '') AS revenue_year_key,
    COALESCE(cik, '') AS cik,
    COALESCE(report_year, 0) AS report_year,
    period_start,
    period_end,
    revenue_usd,
    filing_date,
    accession_number
FROM (
    SELECT
        LPAD(CAST(cik AS STRING), 10, '0') AS cik,
        YEAR(CAST(fact.`end` AS DATE)) AS report_year,
        CAST(fact.start AS DATE) AS period_start,
        CAST(fact.`end` AS DATE) AS period_end,
        CAST(fact.val AS DOUBLE) AS revenue_usd,
        CAST(fact.filed AS DATE) AS filing_date,
        fact.accn AS accession_number,
        ROW_NUMBER() OVER (
            PARTITION BY fact.`end`
            ORDER BY fact.filed DESC, fact.accn DESC
        ) AS rn
    FROM SEC_DATA.dominion_revenue_facts
    LATERAL VIEW explode(units.USD) AS fact
    WHERE fact.form = '10-K'
      AND fact.fp = 'FY'
      AND DATEDIFF(CAST(fact.`end` AS DATE), CAST(fact.start AS DATE)) BETWEEN 330 AND 400
      AND YEAR(CAST(fact.`end` AS DATE)) BETWEEN 2023 AND 2025
) annual_facts
WHERE rn = 1;

fp = 'FY' also matches quarterly contexts in annual filings. The duration filter selects full-year facts; the window chooses the latest filing per period end. This example has one company. For multiple companies, partition by CIK and period end. report_year uses period-end year; check non-calendar fiscal years against PUDL's calendar year.

8.3 Partial weather period from cached NOAA data

ACTIVATE USL TABLE lightning.metastore.edgar_pudl_demo.edgar_pudl_noaa_usl.weather_period AS
SELECT
    COALESCE(CONCAT(state, '_2025_JANFEB'), '') AS weather_period_key,
    COALESCE(state, '') AS state,
    COALESCE(station_id, '') AS station_id,
    COALESCE(station_name, '') AS station_name,
    CAST(CONCAT(SUBSTR(MIN(obs_date),1,4),'-',SUBSTR(MIN(obs_date),5,2),'-',SUBSTR(MIN(obs_date),7,2)) AS DATE) AS period_start,
    CAST(CONCAT(SUBSTR(MAX(obs_date),1,4),'-',SUBSTR(MAX(obs_date),5,2),'-',SUBSTR(MAX(obs_date),7,2)) AS DATE) AS period_end,
    COUNT(DISTINCT obs_date) AS observed_days,
    COUNT(*) AS valid_measurement_count,
    AVG(CASE WHEN element='TMAX' THEN CAST(data_value AS DOUBLE)/10.0 END) AS mean_daily_tmax_c,
    AVG(CASE WHEN element='TMIN' THEN CAST(data_value AS DOUBLE)/10.0 END) AS mean_daily_tmin_c,
    AVG(CASE WHEN element='PRCP' THEN CAST(data_value AS DOUBLE)/10.0 END) AS mean_daily_precip_mm
FROM (
    SELECT 'VA' AS state, 'USW00013740' AS station_id, 'RICHMOND INTL AP' AS station_name, _c1 AS obs_date, _c2 AS element, _c3 AS data_value FROM NOAA_GHCN_S3.noaa_va_airport
    UNION ALL
    SELECT 'NC' AS state, 'USW00013722' AS station_id, 'RALEIGH AP' AS station_name, _c1 AS obs_date, _c2 AS element, _c3 AS data_value FROM NOAA_GHCN_S3.noaa_nc_airport
    UNION ALL
    SELECT 'SC' AS state, 'USW00013880' AS station_id, 'CHARLESTON INTL AP' AS station_name, _c1 AS obs_date, _c2 AS element, _c3 AS data_value FROM NOAA_GHCN_S3.noaa_sc_airport
) obs
WHERE obs_date BETWEEN '20250101' AND '20251231'
  AND element IN ('TMAX','TMIN','PRCP')
  AND CAST(data_value AS INT) <> -9999
GROUP BY state, station_id, station_name;

8.4 PUDL generation linked to SEC and weather keys

ACTIVATE USL TABLE lightning.metastore.edgar_pudl_demo.edgar_pudl_noaa_usl.utility_state_year AS
SELECT
    COALESCE(CONCAT(m.central_index_key, '_', CAST(YEAR(g.report_date) AS STRING), '_', g.state), '') AS utility_state_year_key,
    COALESCE(m.central_index_key, '') AS cik,
    COALESCE(CONCAT(m.central_index_key, '_', CAST(YEAR(g.report_date) AS STRING)), '') AS revenue_year_key,
    CASE WHEN YEAR(g.report_date) = 2025 THEN CONCAT(g.state, '_2025_JANFEB') END AS weather_period_key,
    COALESCE(m.utility_id_eia, 0) AS utility_id_eia,
    COALESCE(YEAR(g.report_date), 0) AS report_year,
    COALESCE(g.state, '') AS state,
    COUNT(*) AS generator_count,
    SUM(g.net_generation_mwh) AS net_generation_mwh,
    SUM(g.capacity_mw) AS installed_capacity_mw
FROM PUDL_S3.pudl_sec10k_utility_matches m
JOIN PUDL_S3.pudl_eia_yearly_generators g
    ON m.utility_id_eia = g.utility_id_eia
WHERE m.central_index_key = '0000715957'
  AND g.report_date BETWEEN DATE '2023-01-01' AND DATE '2025-12-31'
GROUP BY m.central_index_key, m.utility_id_eia, YEAR(g.report_date), g.state;

generator_count counts source rows at plant/generator/year grain. SUM(net_generation_mwh) ignores missing measurements, so the count does not mean every generator reported generation. The weather key is null for 2023–2024 because no weather period is provided for those years.

All four activations returned registered. This confirms registration, not successful query execution.

9. Query the activated USL and verify the join

First read the weather table:

SELECT *
FROM lightning.metastore.edgar_pudl_demo.edgar_pudl_noaa_usl.weather_period;

The recorded query returned three station/state rows, each with 37 days and 111 valid measurements.

Then run the integrated query:

SELECT u.report_year, u.state,
       u.generator_count, u.net_generation_mwh, u.installed_capacity_mw,
       r.revenue_usd,
       w.station_id, w.period_start, w.period_end, w.observed_days
FROM lightning.metastore.edgar_pudl_demo.edgar_pudl_noaa_usl.utility_state_year u
JOIN lightning.metastore.edgar_pudl_demo.edgar_pudl_noaa_usl.revenue_year r
  ON u.revenue_year_key = r.revenue_year_key
LEFT JOIN lightning.metastore.edgar_pudl_demo.edgar_pudl_noaa_usl.weather_period w
  ON u.weather_period_key = w.weather_period_key
ORDER BY u.report_year, u.state;

The recorded join returned nine rows: NC, SC, and VA for 2023–2025. Weather columns were null for 2023–2024 and populated for 2025.

2025 state Generators Generation MWh Capacity MW SEC company revenue USD Weather station
NC 1 147,803 79.9 16,506,000,000 USW00013722
SC 2 108,737 79.7 16,506,000,000 USW00013880
VA 27 1,883,021 4,210.4 16,506,000,000 USW00013740

SEC company revenue repeats on every state row; do not sum it across states. The run returned USD 14,393,000,000 for 2023 and USD 14,459,000,000 for 2024. Keep company/year and utility/state/year at separate grains.

These are historical comparison values, not guaranteed outputs from a later PUDL release or SEC filing. Check source tables when results differ.

10. Run DQ separately and record its result

Primary and foreign keys generate DQ rules. To run the utility table's checks:

RUN DQ TABLE lightning.metastore.edgar_pudl_demo.edgar_pudl_noaa_usl.utility_state_year;

Wait for rule results before marking DQ passed. The command returned no result within about three minutes and the JDBC client was interrupted. DQ remains unverified. The nine-row SELECT is separate evidence.

Use a bounded wait. If you cancel, check whether the server operation stopped; disconnecting a client does not prove cancellation. Do not relaunch DQ while an earlier command may still run.

Troubleshooting and reruns

Symptom What to do
Symptom Action
--- ---
No suitable driver for jdbc:hive2://... Use the Zetaris driver class and URL from the connection guide.
Connection refused Check the instance and port 10000 from the JDBC client's host.
Database or table already exists Inspect and reuse the object. A slow registration may finish after the client stops waiting.
NOAA column not found Describe the current schema; _c0–_c7 are from the recorded run.
NOAA query is slow Wait for cache completion, use the three station files, and check connection/cache scope. Avoid a full annual scan.
nullable -> NOT NULL during activation Check source keys and align the projection with the declared schema; COALESCE does not validate them.
Activation has an extra or missing column Match the projection to the DDL. Removing undeclared utility_name_eia fixed an earlier mismatch.
Raw SEC/PUDL join raises an internal planning error Use separate source activations and the USL foreign keys shown here.
NoClassDefFoundError for USLTable or RemoveUSL Record the server error and ask the operator. This occurred in the earlier attempt; the later successful read does not explain why.
DQ does not return within the wait Keep the result unverified, record elapsed time, and check whether the operation stopped before retrying.

This exercise created no USL materialization or durable cache. The earlier edgar_pudl_energy_usl remained because its removal command failed in that attempt. Reuse or version existing models; do not remove another user's objects.

Suggested instruction for an AI agent

For an AI task, attach this and the connection guide and provide credentials through your approved mechanism. After verifying the connection, use this prompt:

Follow the EDGAR/PUDL/NOAA USL guide against the connected Zetaris instance.
Inspect and reuse existing source registrations. Register only missing objects.
Use the Zetaris JDBC driver and Lightning SQL, one statement per request.
Send the complete COMPILE USL DDL block as one payload.
Cache the three NOAA airport station tables before aggregation, then check
their actual date coverage. Keep partial weather periods explicit.
Activate each source separately and connect the USL tables with the documented
CIK/year and weather-period keys. Verify the weather SELECT and joined SELECT.
Treat registered activations, readable rows, and completed DQ as separate outcomes.
Do not edit application code, remove existing models, or claim DQ passed without
rule results. At the end, report the object names, rows returned, weather dates,
commands that failed or timed out, and the steps you took.

Evidence boundary for this guide

The recorded JDBC run returned a row for SELECT 1, completed three NOAA cache commands, aggregated three stations, compiled the USL, registered four activations, returned three weather rows, and joined nine rows. DQ did not complete within the bounded wait. No local Spark session or application-code changes were used.

The guide reconstructs that run; it has not been rerun from an empty instance. Its successful PUDL result conflicts with the current known failure noted above.

Built from the repository documentation. Use your own account and team names on the shared instance.