Sto mappando su una tabella HBase, generando un elemento RDD per riga HBase. Tuttavia, a volte la riga presenta dati non validi (generando NullPointerException nel codice di analisi), nel qual caso voglio solo saltarlo.Apache Spark: gestione di Option/Some/None in RDD
ho il mio mapper iniziale restituire un Option
per indicare che restituisce 0 o 1 elementi, quindi filtrare per Some
, quindi ottenere il valore contenuto:
// myRDD is RDD[(ImmutableBytesWritable, Result)]
val output = myRDD.
map(tuple => getData(tuple._2)).
filter({case Some(y) => true; case None => false}).
map(_.get).
// ... more RDD operations with the good data
def getData(r: Result) = {
val key = r.getRow
var id = "(unk)"
var x = -1L
try {
id = Bytes.toString(key, 0, 11)
x = Long.MaxValue - Bytes.toLong(key, 11)
// ... more code that might throw exceptions
Some((id, (List(x),
// more stuff ...
)))
} catch {
case e: NullPointerException => {
logWarning("Skipping id=" + id + ", x=" + x + "; \n" + e)
None
}
}
}
C'è un modo più idiomatico per fare questo che è più breve? Mi sembra che questo sia piuttosto disordinato, sia in getData()
sia nella danza map.filter.map
che sto facendo.
Forse un flatMap
potrebbe funzionare (generare 0 o 1 elementi in un Seq
), ma non voglio che appiattisca le tuple che sto creando nella funzione mappa, basta eliminare i vuoti.
Nizza! Darò uno sparo e vedrò come si integra. –