2017-11-01 3 views
0

다음 코드는 java.lang.NullPointerException의 원인입니다.scala 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")); 

사람이 문제가 무엇인지 지적 할 수 있습니까?

+0

범인 라인과 같은 유형을 지정합니다. optionval personData = dataFramePerson.map (data => {'. personData가 무엇입니까? val 또는 var가 정의되어 있지 않고 다음 행에 있어야합니다. –

+0

지저분한 코드를 찾아 주셔서 감사합니다. 붙여 넣기 문제가 아니며 실제 문제는 아니 었습니다. 코드는 이제 'dataFramePerson'에지도를 사용했을 때 – SYL

+3

이라는 질문에 대해 수정되었습니다. 그 객체 또는 상수의 값만 그지도 기능. 당신은'dataFrameAddress' 나 그 맵 함수 안에있는 다른 객체들을 사용할 수 없습니다. –

답변

3

코드에 큰 구조적 결함이 있습니다. 즉, 드라이버에서 실행되는 코드에서 데이터 프레임을 참조 할 수 있지만 실행 프로그램에서 실행하는 코드에서는 참조 할 수 없습니다. 귀하의 코드에는 Executors에서 실행되는지도 내의 다른 데이터 프레임에 대한 참조가 포함되어 있습니다. 당신이 대신하고 싶은 것은 왼쪽 외부 후, 가입 추가 처리를 할 것입니다이 링크 Can I use Spark DataFrame inside regular Spark map operation?

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

를 참조하십시오. getAs를 사용할 때보 또한

dataFramePerson.join(dataFrameAddress, Seq("ID"), "left_outer") 

주 당신은 ("com.databricks.spark.csv")을`발 dataFramePerson = sqlContext.read.format을해야 getAs[String]("ID")

0

dataFrameAddress 또는 i 또는 datanull입니다. 좋아하는 디버깅 기술을 사용하여 디버거, 인쇄 문 또는 로그 등 실제로 어떤 디버깅 기술인지 파악하십시오. 당신이 당신의 NullPointerException의 스택 트레이스의 filter 전화를 참조하는 경우에만 i 것을 의미, 또는 datanull 될 수

참고. 반면에 filter 호출이 보이지 않는다면 인 dataFrameAddress이라는 의미입니다.

관련 문제