Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

Polars database reader/writer record file metadata, so SQL lineage is missing

オープン
#1,740 コメント 2 件 リアクション 0 件 担当者 1 名 GitHub で見る

メンテナーはふだん 2 日以内に返信

@Dev-iL がすでに取り組んでいます。

2026年9月27日 から。

  • #1743 @Dev-iL による — オープン

評価

この issue はまだ評価されていません。

説明

Related: #1720

PolarsDatabaseReader and PolarsDatabaseWriter (in both polars_post_1_0_0_extensions.py and polars_pre_1_0_0_extension.py) describe database I/O with get_file_and_dataframe_metadata. They pass the SQL query or table name in where a file path is expected:

# PolarsDatabaseReader.load_data
metadata = utils.get_file_and_dataframe_metadata(self.query, df)
# PolarsDatabaseWriter.save_data
return utils.get_file_and_dataframe_metadata(self.table_name, data)

This happens whatever connection is passed, including a SQLAlchemy Engine.

Effects

  • The metadata has no sql_metadata block. So the OpenLineageAdapter can't identify the tables, and sql_dataset_identity="datasource" (from #1720) resolves nothing: sql_datasets() returns SQL datasource is unknown; no dataset emitted.
  • Lineage treats database I/O as filesystem I/O:
    • a read becomes an input dataset named after the node (e.g. orders_df), with storageLayer="FileSystem" and the SQL text as its dataSource URI;
    • a write becomes an output dataset named after the table, also marked FileSystem;
    • no sql job facet is emitted.
  • file_metadata carries meaningless values, e.g. path: "SELECT * FROM orders", scheme: "", and a note that the file does not exist.

Reproduction

import polars as pl
from sqlalchemy import create_engine
from hamilton.plugins.polars_post_1_0_0_extensions import PolarsDatabaseReader

engine = create_engine("sqlite:///a.db")  # with a table `orders`
df, md = PolarsDatabaseReader(query="SELECT * FROM orders", connection=engine).load_data(pl.DataFrame)
print(sorted(md))                  # ['dataframe_metadata', 'file_metadata']
print(md["file_metadata"]["path"])  # 'SELECT * FROM orders'

Proposed fix

  1. In both Polars database classes, record get_sql_metadata(query_or_table, results, db_connection=self.connection, operation="read" | "write") plus get_dataframe_metadata, as PandasSqlReader and PandasSqlWriter do. SQLAlchemy URLs, Engines and Connections, and sqlite3 connections, then get full datasource identity.
  2. Extend get_sql_source to recognise the other connections Polars accepts (ADBC connections, connectorx URI strings, cursors). Until then these are left out of lineage with a note, which is safe but gives no lineage.
  3. Add Polars read and write tests against SQLite, mirroring the pandas SQL lineage tests.

Compatibility

Metadata for Polars database I/O changes from file_metadata to sql_metadata. Default-mode ("legacy") OpenLineage output changes with it: the fake filesystem datasets are replaced by the legacy SQL datasets. Anyone consuming file_metadata from these classes would be affected, so this probably deserves a changelog entry.

主要言語
Jupyter Notebook
スター
2.6k
フォーク
221
平均マージ
2日 1分
マージ済み PR(30日)
17

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

apache/hamilton のほかの issue

apache/hamilton の issue をすべて見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。