Применить функцию к каждой строке фрейма данных Spark

Я на Spark 1.3.

Я хотел бы применить функцию к каждой строке фрейма данных. Эта функция хэширует каждый столбец строки и возвращает список хэшей.

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

Я получаю исключение NullPointerException при запуске этого кода. Я предполагаю, что это связано с Искра-5063.

Я не могу придумать способ, чтобы достичь того же результата без использования вложенной карте.

1 ответов


это не экземпляр SPARK-5063, потому что вы не вкладываете преобразования RDD; внутренний .map() применяется к Scala Seq, не RDD.

моя догадка заключается в том, что некоторые строки в наборе данных содержат значения null столбца, поэтому col.hashCode вызовы бросают NullPointerExceptions, когда вы пытаетесь оценить null.hashCode. Чтобы обойти это, вам нужно учитывать нули при вычислении хэш-кодов.

если вы работаете на Java 7 JVM или выше (источник), вы можете сделать

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

кроме того, на более ранних версиях Java вы можете сделать

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