DataFusion plans a CTE once per reference, so ML queries grow exponentially with depth
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 64/100
- Tipo de issue
- Documentação
- Clareza
- Razoavelmente clara
- Status de atividade
- Ativa
- Stack de tecnologia
- postgresql, python
- Domínio
- backend, data-engineering
Direção de pesquisa
Comece por docs/limitations.md, que a issue indica como o local para documentar o planejamento repetido de CTEs pelo DataFusion e a solução alternativa de registrar um resultado intermediário como tabela. Confira o comportamento documentado em relação à limitação relatada no DataFusion 54 e explique que o suporte a CTEs materializadas e as decisões automáticas são trabalhos a montante. O trabalho estará concluído quando os leitores puderem entender a limitação e identificar a solução alternativa.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
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.
- Linguagem predominante
- Python
- Estrelas
- 142
- Forks
- 19
- Merge médio
- 1d 9h
- PRs com merge (30d)
- 9
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Sem modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de xqlsystems/xarray-sql
-
documentation
Dificuldade 1/5 1-3 horas Facilidade para iniciantes 85/100
xqlsystems/xarray-sql#268 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 74/100
xqlsystems/xarray-sql#243 ·
Mantenedores costumam responder em até 1 dia
-
publish.yml: the TestPyPI verification step is unreachable (and installs the wrong package name)Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 62/100
xqlsystems/xarray-sql#242 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
xqlsystems/xarray-sql#237 ·
Mantenedores costumam responder em até 1 dia
-
page not found errorAberta
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 72/100
xqlsystems/xarray-sql#231 ·
Mantenedores costumam responder em até 1 dia
Todas as issues de xqlsystems/xarray-sql
Issues semelhantes
-
comp/cli P3 type/security
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
NousResearch/hermes-agent#141420 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
vendor-pitch
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 87/100
Mantenedores costumam responder em até 1 dia
-
bug llm p2
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
amd/gaia#5379 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
New tool: ZIPZAX Python Notebook StudioTalvez já em andamento @github-actions assumiu hoje. Abertasubmission triage
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 68/100
kausalflow/tools#226 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100