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

Bry*_*zer 8 apache-spark apache-spark-sql

我在Spark 1.3上.

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

dataframe.map(row => row.toSeq.map(col => col.hashCode))
Run Code Online (Sandbox Code Playgroud)

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

如果不使用嵌套映射,我无法想到实现相同结果的方法.

Jos*_*sen 7

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

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

如果您在Java 7 JVM或更高版本(源代码)上运行,则可以执行此操作

import java.util.Objects
dataframe.map(row => row.toSeq.map(col => Objects.hashCode(col)))
Run Code Online (Sandbox Code Playgroud)

或者,在早期版本的Java上,您可以这样做

    dataframe.map(row => row.toSeq.map(col => if (col == null) 0 else col.hashCode))
Run Code Online (Sandbox Code Playgroud)