Zarr error when trying to overwrite part of existing store
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 4.2k
- Forks
- 1.4k
- Avg merge
- 2d 15h
- Merged PRs (30d)
- 14
Description
What happened?
to_zarr threw an error when I tried to overwrite part of an existing zarr store.
What did you expect to happen?
With mode w I was expecting it to overwrite part of the store with no complaints.
I expected that because that's what the docstring of to_zarr says:
mode ({"w", "w-", "a", "r+", None}, optional)– Persistence mode: “w” means create (overwrite if exists); “w-” means create (fail if exists); “a” means override existing variables (create if does not exist);
The default mode is "w", so I was expecting it to overwrite.
Minimal Complete Verifiable Example
import xarray as xr
import numpy as np
np.random.seed(0)
ds = xr.Dataset()
ds["data"] = (['x', 'y'], np.random.random((100,100)))
ds.to_zarr("test.zarr")
print(ds["data"].mean().compute())
# returns array(0.49645889) as expected
ds = xr.open_dataset("test.zarr", engine='zarr', chunks={})
ds["data"].mean().compute()
print(ds["data"].mean().compute())
# still returns array(0.49645889) as expected
ds.to_zarr("test.zarr", mode="a")
<xarray.DataArray 'data' ()>
array(0.49645889)
<xarray.DataArray 'data' ()>
array(0.49645889)
Traceback (most recent call last):
File "/home/tom/Documents/Work/Code/experimentation/bugs/datatree_nans/mwe_xarray.py", line 16, in <module>
ds.to_zarr("test.zarr")
File "/home/tom/miniconda3/envs/xrdev3.9/lib/python3.9/site-packages/xarray/core/dataset.py", line 2091, in to_zarr
return to_zarr( # type: ignore
File "/home/tom/miniconda3/envs/xrdev3.9/lib/python3.9/site-packages/xarray/backends/api.py", line 1628, in to_zarr
zstore = backends.ZarrStore.open_group(
File "/home/tom/miniconda3/envs/xrdev3.9/lib/python3.9/site-packages/xarray/backends/zarr.py", line 420, in open_group
zarr_group = zarr.open_group(store, **open_kwargs)
File "/home/tom/miniconda3/envs/xrdev3.9/lib/python3.9/site-packages/zarr/hierarchy.py", line 1389, in open_group
raise ContainsGroupError(path)
zarr.errors.ContainsGroupError: path '' contains a group
MVCE confirmation
- Minimal example — the example is as focused as reasonably possible to demonstrate the underlying issue in xarray.
- Complete example — the example is self-contained, including all data and the text of any traceback.
- Verifiable example — the example copy & pastes into an IPython prompt or Binder notebook, returning the result.
- New issue — a search of GitHub Issues suggests this is not a duplicate.
Relevant log output
No response
Anything else we need to know?
I would like to know what the intended result is supposed to be here, so that I can make sure datatree behaves the same way, see https://github.com/xarray-contrib/datatree/issues/168.
Environment
Main branch of xarray, zarr v2.13.3
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by running the provided MVCE, then trace mode handling from xarray/core/dataset.py through xarray/backends/api.py and xarray/backends/zarr.py to zarr.open_group. Determine the intended overwrite semantics for an existing store, then ensure the resulting behavior and documentation agree with that decision.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- numpy, python
- Domain
- data
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 42/100