Skip to content

Commit e46ded2

Browse files
committed
Decode dictionary-encoded arrays before bucket transform
1 parent 2c75523 commit e46ded2

2 files changed

Lines changed: 14 additions & 2 deletions

File tree

pyiceberg/transforms.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,12 +145,17 @@ def _cast_if_needed(arr: "ArrayLike") -> "ArrayLike":
145145
else:
146146
return arr
147147

148+
def _decode_if_dict(arr: "pa.Array") -> "pa.Array":
149+
if isinstance(arr.type, pa.DictionaryType):
150+
return arr.dictionary_decode()
151+
return arr
152+
148153
if isinstance(array, pa.Array):
149-
return _cast_if_needed(transform_func(array, *args))
154+
return _cast_if_needed(transform_func(_decode_if_dict(array), *args))
150155
elif isinstance(array, pa.ChunkedArray):
151156
result_chunks = []
152157
for arr in array.iterchunks():
153-
result_chunks.append(_cast_if_needed(transform_func(arr, *args)))
158+
result_chunks.append(_cast_if_needed(transform_func(_decode_if_dict(arr), *args)))
154159
return pa.chunked_array(result_chunks)
155160
else:
156161
raise ValueError(f"PyArrow array can only be of type pa.Array or pa.ChunkedArray, but found {type(array)}")

tests/test_transforms.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1682,6 +1682,13 @@ def test_bucket_pyarrow_void_transform() -> None:
16821682
assert output_arr == VoidTransform().pyarrow_transform(IntegerType())(input_arr)
16831683

16841684

1685+
def test_bucket_pyarrow_transform_dictionary_encoded() -> None:
1686+
input_arr = pa.array(["foo", "bar", "foo"], type=pa.dictionary(pa.int32(), pa.utf8()))
1687+
expected = pa.array([6, 7, 6], type=pa.int32())
1688+
transform: Transform[Any, Any] = BucketTransform(num_buckets=10)
1689+
assert transform.pyarrow_transform(StringType())(input_arr) == expected
1690+
1691+
16851692
@pytest.mark.parametrize(
16861693
"source_type, input_arr, expected, width",
16871694
[

0 commit comments

Comments
 (0)