Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 20 additions & 4 deletions datafusion/common/src/hash_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -481,23 +481,39 @@ fn hash_map_array(
let offsets = array.offsets();

// Create hashes for each entry in each row
let mut values_hashes = vec![0u64; array.entries().len()];
create_hashes(array.entries().columns(), random_state, &mut values_hashes)?;
let first_offset = offsets.first().copied().unwrap_or_default() as usize;
let last_offset = offsets.last().copied().unwrap_or_default() as usize;
let entries_len = last_offset - first_offset;

// Only hash the entries that are actually referenced
let mut values_hashes = vec![0u64; entries_len];
let entries = array.entries();
let sliced_columns: Vec<ArrayRef> = entries
.columns()
.iter()
.map(|col| col.slice(first_offset, entries_len))
.collect();
create_hashes(&sliced_columns, random_state, &mut values_hashes)?;

// Combine the hashes for entries on each row with each other and previous hash for that row
// Adjust indices by first_offset since values_hashes is sliced starting from first_offset
if let Some(nulls) = nulls {
for (i, (start, stop)) in offsets.iter().zip(offsets.iter().skip(1)).enumerate() {
if nulls.is_valid(i) {
let hash = &mut hashes_buffer[i];
for values_hash in &values_hashes[start.as_usize()..stop.as_usize()] {
for values_hash in &values_hashes
[start.as_usize() - first_offset..stop.as_usize() - first_offset]
{
*hash = combine_hashes(*hash, *values_hash);
}
}
}
} else {
for (i, (start, stop)) in offsets.iter().zip(offsets.iter().skip(1)).enumerate() {
let hash = &mut hashes_buffer[i];
for values_hash in &values_hashes[start.as_usize()..stop.as_usize()] {
for values_hash in &values_hashes
[start.as_usize() - first_offset..stop.as_usize() - first_offset]
{
*hash = combine_hashes(*hash, *values_hash);
}
}
Expand Down
Loading