将函数应用于Spark DataFrame的每一行

时间:2015-12-23 00:16:17

标签: apache-spark apache-spark-sql

我在使用Spark 1.3。

我想将一个函数应用于数据帧的每一行。此函数散列行的每一列并返回哈希列表。

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

运行此代码时出现NullPointerException。我认为这与SPARK-5063有关。

如果不使用嵌套地图,我无法想到实现相同结果的方法。

1 个答案:

答案 0 :(得分:7)

这不是SPARK-5063的一个实例,因为你没有嵌套RDD转换;内部.map()正在应用于Scala Seq,而不是RDD。

我的预感是数据集中的某些行包含空列值,因此当您尝试评估col.hashCode时,某些null.hashCode调用会抛出NullPointerExceptions。为了解决这个问题,您需要在计算哈希码时考虑空值。

如果您在Java 7 JVM或更高版本(source)上运行,则可以执行

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))