apache / apache/iceberg-python

Upsert with None values fails on "Invalid literal value: None"

Aberta
#2,426 7 comentários 1 reação 0 responsáveis Ver no GitHub
stale
Linguagem predominante
Python
Estrelas
1.1k
Forks
581
Merge médio
1d 23h
PRs com merge (30d)
84

Descrição

### Apache Iceberg version

main (development)

### Please describe the bug 🐞

Upserting a table fails when the input dataframe contains `None` in a join column.

I've reproduced this error by editing `test_upsert_with_nulls` from #1861, adding this at the end:

```python
# upsert table with null value
data_with_null = pa.Table.from_pylist(
[
{"foo": None, "bar": 1, "baz": False},
],
schema=schema,
)
upd = table.upsert(data_with_null, join_cols=["foo"])
```

The `foo` column contains `None`, causing `TypeError: Invalid literal value: None`.

```
tests/table/test_upsert.py:720: in test_upsert_with_nulls
upd = table.upsert(data_with_null, join_cols=["foo"])
pyiceberg/table/__init__.py:1343: in upsert
return tx.upsert(
pyiceberg/table/__init__.py:798: in upsert
matched_predicate = upsert_util.create_match_filter(df, join_cols)
pyiceberg/table/upsert_util.py:37: in create_match_filter
return In(join_cols[0], unique_keys[0].to_pylist())
pyiceberg/expressions/__init__.py:682: in __new__
literals_set: Set[Literal[L]] = _to_literal_set(literals)
pyiceberg/expressions/__init__.py:52: in _to_literal_set
return {_to_literal(v) for v in values}
pyiceberg/expressions/__init__.py:52: in
return {_to_literal(v) for v in values}
pyiceberg/expressions/__init__.py:59: in _to_literal
return literal(value)
pyiceberg/expressions/literals.py:159: in literal
raise TypeError(f"Invalid literal value: {repr(value)}")
E TypeError: Invalid literal value: None
```

### Willingness to contribute

- [ ] I can contribute a fix for this bug independently
- [x] I would be willing to contribute a fix for this bug with guidance from the Iceberg community
- [ ] I cannot contribute a fix for this bug at this time

Guia de contribuição

Nenhum guia de contribuição indexado para este repositório

Direção de pesquisa

Comece por tests/table/test_upsert.py, especialmente test_upsert_with_nulls e a reprodução adicionada; depois, leia pyiceberg/table/upsert_util.py:create_match_filter e o tratamento de literais de expressão mostrado no traceback. Confirme com a comunidade o comportamento esperado para um valor null na coluna de join e, em seguida, faça o caso de upsert funcionar e adicione ou atualize um teste de regressão que passe.

Escrita pelo modelo de indexação a partir do texto da issue.

Avaliação

Stack de tecnologia
python
Domínio
databases
Tipo de issue
Bug
Dificuldade
3/5
Tempo estimado
1-2 dias
Status de atividade
Ativa
Clareza
Razoavelmente clara
Facilidade para iniciantes
68/100

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.