scala java.lang.NullPointerException

scala java.lang.NullPointerException,scala,apache-spark,Scala,Apache Spark,以下代码导致java.lang.NullPointerException val sqlContext = new SQLContext(sc) val dataFramePerson = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").schema(CustomSchema1).load("c:\\temp\\test.csv") val dataFrameAddress = sqlCont

以下代码导致java.lang.NullPointerException

val sqlContext = new SQLContext(sc)
val dataFramePerson = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").schema(CustomSchema1).load("c:\\temp\\test.csv")
val dataFrameAddress = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").schema(CustomSchema2).load("c:\\temp\\test2.csv")

val personData = dataFramePerson.map(data => {
  val addressData = dataFrameAddress.filter(i => i.getAs("ID") == data.getAs("ID"));
  var address:Address = null;
  if (addressData != null) {
    val addressRow = addressData.first;
    address = addressRow.asInstanceOf[Address];
  }
  Person(data.getAs("Name"),data.getAs("Phone"),address)
})
我把它缩小到下面这一行,这是导致异常的原因

val addressData = dataFrameAddress.filter(i => i.getAs("ID") == data.getAs("ID"));

有人能指出问题是什么吗?

唯一能说的是
dataFrameAddress
,或者
i
,或者
data
null
。使用您最喜欢的调试技术来了解哪一个是真正的调试程序,例如调试器、打印语句或日志


请注意,如果在
NullPointerException
的堆栈跟踪中看到
过滤器
调用,则意味着只有
i
数据
可以为
null
。另一方面,如果您没有看到
filter
调用,则更可能意味着
dataFrameAddress
null
唯一可以说的是
dataFrameAddress
,或者
i
,或者
data
null
。使用您最喜欢的调试技术来了解哪一个是真正的调试程序,例如调试器、打印语句或日志


请注意,如果在
NullPointerException
的堆栈跟踪中看到
过滤器
调用,则意味着只有
i
数据
可以为
null
。另一方面,如果您没有看到
filter
调用,则更可能意味着
dataFrameAddress
null
您的代码有一个很大的结构缺陷,即您只能引用驱动程序中执行的代码中的数据帧,而不能引用执行程序运行的代码中的数据帧。您的代码包含对映射中另一个数据帧的引用,该数据帧在执行器中执行。请参阅此链接


另外请注意,在使用
getAs
时,您希望指定类型,如
getAs[String](“ID”)

您的代码有一个很大的结构缺陷,即您只能引用驱动程序中执行的代码中的数据帧,而不能引用执行程序运行的代码中的数据帧。您的代码包含对映射中另一个数据帧的引用,该数据帧在执行器中执行。请参阅此链接


另外请注意,在使用
getAs
时,您希望指定类型,例如
getAs[String](“ID”)

罪魁祸首行应该是
val-dataFramePerson=sqlContext.read.format(“com.databricks.spark.csv”)。optionval-personData=dataFramePerson.map(data=>{
。personData是什么?您还没有定义它是val还是var,它应该在下一行。我想感谢您捕获了混乱的代码。这只是剪切和粘贴问题。这不是真正的问题。代码现在已经解决了这个问题。当您在
dataFramePerson
上使用map时,只有该对象或常量的值nts可在该映射函数内使用。不能在该映射函数内使用
dataFrameAddress
或任何其他对象。罪魁祸首行应为
val-dataFramePerson=sqlContext.read.format(“com.dataricks.spark.csv”)。optionval-personData=dataFramePerson.map(数据=>{
。personData是什么?您还没有定义它是val还是var,它应该在下一行。我想感谢您捕获了混乱的代码。这只是剪切和粘贴问题。这不是真正的问题。代码现在已经解决了这个问题。当您在
dataFramePerson
上使用map时,只有该对象或常量的值nts可以在该映射函数内使用。不能在该映射函数内使用
dataFrameAddress
或任何其他对象。
val personData = dataFramePerson.map(data => { // WITHIN A MAP
  val addressData = dataFrameAddress.filter(i => // <--- REFERRING TO OTHER DATAFRAME WITHIN A MAP
          i.getAs("ID") == data.getAs("ID"));  
  var address:Address = null;
  if (addressData != null) {
dataFramePerson.join(dataFrameAddress, Seq("ID"), "left_outer")