簡體   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