Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Per ottenere informazioni da uno stream di dati è spesso necessario aggregare i dati in qualche modo. Renoir fornisce un set di operatori che ti permettono di eseguire riduzioni e fold sui stream di dati per ottenere le informazioni desiderate.

Reduce

L’operatore reduce aggrega i dati di uno stream seguendo una funzione definita dall’utente ed emette un singolo valore. La funzione dovrebbe modificare l’accumulatore che alla fine sarà il valore emesso.

#![allow(unused)]
fn main() {
let s = env.stream_iter(0..5);
let res = s.reduce(|acc, value| acc + value).collect::<Vec<_>>();

env.execute_blocking();

assert_eq!(res.get().unwrap(), vec![0 + 1 + 2 + 3 + 4]);
}

Nota che il tipo dell’accumulatore è lo stesso del tipo degli elementi dello stream. Se è necessario un tipo diverso considera l’uso di fold.

Reduce Associativo

L’operatore reduce_assoc è una variante dell’operatore reduce che può essere usato quando la funzione di riduzione è associativa. Questo permette all’operatore di essere eseguito in parallelo e può essere più efficiente dell’operatore reduce.

L’operatore applica la funzione di riduzione in due passi:

  • Local: la funzione che sarà eseguita su ogni replica.
  • Global: la funzione che aggregherà tutti i risultati parziali ottenuti dalle funzioni locali.
#![allow(unused)]
fn main() {
let s = env.stream_iter(0..5);
let res = s.reduce_assoc(|acc, value| acc + value).collect_vec();

env.execute_blocking();

assert_eq!(res.get().unwrap(), vec![0 + 1 + 2 + 3 + 4]);
}

Nota che il tipo dell’accumulatore è lo stesso del tipo degli elementi dello stream. Se è necessario un tipo diverso considera l’uso di fold_assoc.

Fold

L’operatore fold aggrega i dati di uno stream seguendo una funzione definita dall’utente ed emette un singolo valore. La funzione dovrebbe modificare l’accumulatore che alla fine sarà il valore emesso. È simile all’operatore reduce ma permette di specificare un valore iniziale e quindi il tipo per l’accumulatore.

#![allow(unused)]
fn main() {
let s = env.stream_iter(0..5);
let res = s.fold(0, |acc, value| *acc += value).collect_vec();

env.execute_blocking();

assert_eq!(res.get().unwrap(), vec![0 + 1 + 2 + 3 + 4]);
}

Fold Associativo

L’operatore fold_assoc è una variante dell’operatore fold che può essere usato quando la funzione di riduzione è associativa. Simile al reduce_assoc, questo permette all’operatore di essere eseguito in parallelo e può essere più efficiente dell’operatore fold.

L’operatore richiede due funzioni definite dall’utente:

  • Local: la funzione che sarà eseguita su ogni replica.
  • Global: la funzione che aggregherà tutti i risultati parziali ottenuti dalle funzioni locali.
#![allow(unused)]
fn main() {
// Esempio
let s = env.stream_iter(0..5);
let res = s.fold_assoc(0, |acc, value| *acc += value, |acc, value| *acc += value).collect_vec();

env.execute_blocking();

assert_eq!(res.get().unwrap(), vec![0 + 1 + 2 + 3 + 4]);
}