我在使用Spark 1.3。
我想将一个函数应用于数据帧的每一行。此函数散列行的每一列并返回哈希列表。
dataframe.map(row => row.toSeq.map(col => col.hashCode))
运行此代码时出现NullPointerException。我认为这与SPARK-5063有关。
如果不使用嵌套地图,我无法想到实现相同结果的方法。
答案 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))