2015-12-23 12 views
7

I'm on Spark 1.3.Applicare la funzione a ciascuna riga di Spark DataFrame

Vorrei applicare una funzione a ciascuna riga di un dataframe. Questa funzione hash ogni colonna della riga e restituisce un elenco degli hash.

dataframe.map(row => row.toSeq.map(col => col.hashCode)) 

Ottengo un NullPointerException quando eseguo questo codice. Suppongo che questo sia legato a SPARK-5063.

Non riesco a pensare a un modo per ottenere lo stesso risultato senza utilizzare una mappa nidificata.

risposta

6

Questa non è un'istanza di SPARK-5063 perché non si nidificano le trasformazioni RDD; l'interno .map() viene applicato a Scala Seq, non un RDD.

La mia impressione è che alcune righe nel set di dati contengano valori di colonna nulli, quindi alcune delle chiamate col.hashCode generano NullPointerExceptions quando si tenta di valutare null.hashCode. Per ovviare a questo, è necessario prendere in considerazione i null quando si calcolano hashcode.

se si sta eseguendo su un Java 7 JVM o superiore (source), si può fare

import java.util.Objects 
dataframe.map(row => row.toSeq.map(col => Objects.hashCode(col))) 

In alternativa, su versioni precedenti di Java si può fare

dataframe.map(row => row.toSeq.map(col => if (col == null) 0 else col.hashCode)) 
Problemi correlati