DataFusion plans a CTE once per reference, so ML queries grow exponentially with depth
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức phù hợp với người mới
- 64/100
- Loại issue
- Tài liệu
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- postgresql, python
- Lĩnh vực
- backend, data-engineering
Hướng nghiên cứu
Bắt đầu với docs/limitations.md, nơi issue chỉ định để ghi lại việc DataFusion lập kế hoạch lặp lại cho các CTE và giải pháp thay thế là đăng ký một kết quả trung gian làm bảng. Đối chiếu hành vi được ghi lại với giới hạn được báo cáo trong DataFusion 54 và giải thích rằng hỗ trợ CTE được materialize và các quyết định tự động là công việc ở upstream. Hoàn thành khi người đọc có thể hiểu giới hạn và xác định giải pháp thay thế.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
DataFusion plans a CTE once for every place that reads it, so a query whose CTEs read earlier CTEs more than once grows exponentially with its depth. DuckDB computes such a CTE once. ML models written in SQL hit this constantly: a layer norm reads its input three times, a residual connection twice, and a message-passing round reads the node states as sender, receiver and residual.
Reproduction
Each CTE joins the previous one with itself:
from datafusion import SessionContext
def query(depth):
ctes = ["c0 AS (SELECT i, x FROM t)"] + [
f"c{d} AS (SELECT a.i, a.x + b.x AS x FROM c{d-1} a JOIN c{d-1} b ON a.i = b.i)"
for d in range(1, depth + 1)
]
return f"WITH {', '.join(ctes)} SELECT SUM(x) FROM c{depth}"
ctx = SessionContext()
ctx.sql("CREATE TABLE t AS SELECT * FROM (VALUES (1, 1.0), (2, 2.0)) v(i, x)").collect()
plan = ctx.sql(query(8)).execution_plan().display_indent()
| depth | DataFusion operators | DataFusion table scans | DuckDB 1.5.5 operators |
|---|---|---|---|
| 2 | 16 | 4 | 13 |
| 4 | 64 | 16 | 23 |
| 6 | 256 | 64 | 33 |
| 8 | 1,024 | 256 | 43 |
In the ML benchmarks
The same queries, on DataFusion 54.0.0 through xarray_sql.Context and on DuckDB through xql.register, Intel i7-8700:
| Query | DataFusion operators | DuckDB operators | DataFusion | DuckDB |
|---|---|---|---|---|
| 1-layer GPT loss, batch 4 (112 lines of SQL) | 12,166 | 120 | 8.4 s | 0.055 s |
| GraphCast-shaped forecast, 1 processor round | 1,816 | 243 | 43 s | 17 s |
| GraphCast-shaped forecast, 2 processor rounds | 5,948 | 282 | 159 s | 13 s |
A table read through xarray-sql is read again for every inlined copy. With ERA5 registered lazily from GCS, the 1-round forecast spent most of its time waiting on the network, so the benchmark loads its three time steps into memory first.
A training step through ddx (forward and backward) takes 2.7 s on DataFusion, less than the 8.4 s forward query alone, because ddx stores each step of its program as a table.
Upstream
DataFusion is working on this. apache/datafusion#25580 added WITH ... AS MATERIALIZED, in the PostgreSQL dialect only (apache/datafusion#17737), and apache/datafusion#26237 proposes deciding automatically, as PostgreSQL and DuckDB do. Neither is in DataFusion 54.
Options for xarray-sql
- Once a DataFusion release has
AS MATERIALIZED, check that it works with xarray-sql's table providers and thedatafusiondialectContextuses, and document it. - Follow apache/datafusion#26237, which would fix this without changing queries.
- Until then, document the behavior in
docs/limitations.md, with the workaround: register an intermediate result as a table.
- Ngôn ngữ chính
- Python
- Star
- 142
- Fork
- 19
- Merge trung bình
- 1 ngày 9 giờ
- Pull request đã merge (30 ngày)
- 10
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Không có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của xqlsystems/xarray-sql
-
documentation
Độ khó 1/5 1-3 giờ Mức phù hợp với người mới 85/100
xqlsystems/xarray-sql#268 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 74/100
xqlsystems/xarray-sql#243 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
publish.yml: the TestPyPI verification step is unreachable (and installs the wrong package name)Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
xqlsystems/xarray-sql#242 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
xqlsystems/xarray-sql#237 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
page not found errorĐang mở
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 72/100
xqlsystems/xarray-sql#231 ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của xqlsystems/xarray-sql
Issue tương tự
-
Độ khó 1/5 1-3 giờ Mức phù hợp với người mới 68/100
FavioVazquez/showtime#101 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 83/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
rossant/awesome-math#199 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
nautechsystems/nautilus_trader#5365 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Examples say cnxĐang mởdocumentation embedded
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
Maintainer thường phản hồi trong vòng 1 ngày