Scala 为什么foreach运算符在使用Dataset时会因NullPointerException而失败?
这是我的职责:Scala 为什么foreach运算符在使用Dataset时会因NullPointerException而失败?,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,这是我的职责: def TestForeach(dataFrame: DataFrame)={ dataFrame.select("user_id").dropDuplicates().foreach(row =>{ dataFrame.filter("user_id == "+row.getString(0)) }) } 我得到这个错误: ERROR Executor: Exception in task 2.0 in stage 4.0 (TID 16) java.lan
def TestForeach(dataFrame: DataFrame)={
dataFrame.select("user_id").dropDuplicates().foreach(row =>{
dataFrame.filter("user_id == "+row.getString(0))
})
}
我得到这个错误:
ERROR Executor: Exception in task 2.0 in stage 4.0 (TID 16)
java.lang.NullPointerException
at org.apache.spark.sql.Dataset.filter(Dataset.scala:1318)
如何获取具有相同用户id的数据帧?
foreach
在执行器上执行操作,而数据帧仅在驱动程序上可用
您应该在foreach
之前collect
。更改后,foreach
将成为Scala的而非Spark的foreach
foreach
在执行器上执行操作,而数据帧
仅在驱动程序上可用
您应该在foreach
之前collect
。通过更改,foreach
不再是Scala的foreach
,您不能在转换或操作中使用数据帧。您需要首先收集您的用户ID:
def testForeach(dataFrame: DataFrame): Seq[DataFrame] = {
val userIds: Array[String] = dataFrame.select("user_id").distinct.map(_.getString(0)).collect
userIds.map(uid => dataFrame.filter($"user_id" === uid)).toSeq
}
不能在转换或操作中使用数据帧。您需要首先收集您的用户ID:
def testForeach(dataFrame: DataFrame): Seq[DataFrame] = {
val userIds: Array[String] = dataFrame.select("user_id").distinct.map(_.getString(0)).collect
userIds.map(uid => dataFrame.filter($"user_id" === uid)).toSeq
}
请把这个问题的例外情况包括在内好吗?这将使它更加完整。谢谢请把这个问题的例外情况包括在内好吗?这将使它更加完整。谢谢