【问题标题】:Apply function to each row of Spark DataFrame对 Spark DataFrame 的每一行应用函数
【发布时间】:2015-12-23 10:59:06
【问题描述】:
我使用的是 Spark 1.3。
我想对数据框的每一行应用一个函数。此函数对行的每一列进行哈希处理并返回哈希列表。
dataframe.map(row => row.toSeq.map(col => col.hashCode))
我在运行此代码时收到 NullPointerException。我认为这与SPARK-5063 有关。
如果不使用嵌套地图,我想不出一种方法来实现相同的结果。
【问题讨论】:
标签:
apache-spark
apache-spark-sql
【解决方案1】:
这不是 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))