繁体   English   中英

Scala java.lang.NullPointerException

[英]scala java.lang.NullPointerException

以下代码导致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"));

有人可以指出问题所在吗?

您的代码具有很大的结构缺陷,也就是说,您只能引用驱动程序中执行的代码中的数据帧,而不能引用执行程序所运行的代码中的数据帧。 您的代码包含对映射中另一个数据框的引用,该引用在执行程序中执行。 查看此链接是否可以在常规Spark映射操作中使用Spark DataFrame?

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")

还请注意,与使用getAs时要指定类型一样,例如getAs[String]("ID")

唯一可以说的是dataFrameAddressi ,或者datanull 使用您最喜欢的调试技术来了解实际上是哪种,例如调试器,打印语句或日志。

请注意,如果在NullPointerException的stacktrace中看到filter调用,则意味着只有idata可以为null 另一方面,如果您没有看到filter调用,则表示它是dataFrameAddress ,它为null

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM