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

Apply function to each row of Spark DataFrame

我正在使用 Spark 1.3。

我想对数据框的每一行应用一个函数。此函数对行的每一列进行哈希处理,并 returns 哈希列表。

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

当我 运行 这段代码时,我得到一个 NullPointerException。我认为这与 SPARK-5063.

有关

我想不出不使用嵌套地图就能达到相同结果的方法。

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

我的预感是数据集中的某些行包含空列值,因此当您尝试计算 null.hashCode 时,某些 col.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))