Error during generated code invocation: com.intellij.debugger.engine.evaluation.EvaluateException: Method threw 'java.lang.IllegalAccessError' exception.


場景描述:

  再從該數據庫中讀取數據進行處理的時候,需要將某個字段加入到一個動態的map中,然后需要對該map進行filter過濾,在執行過濾方法的時候報錯

Error during generated code invocation:
 com.intellij.debugger.engine.evaluation.EvaluateException: Method threw 'java.lang.IllegalAccessError' exception.

  報錯截圖:

  

  也就是說該map執行不了這個方法。

code:

      val maps = Collection.muttable.Map[String, Int]()
      for (elem <- referenceData.collect()) {
        maps.put(String.valueOf(elem.getAs[Timestamp]("datatime")), elem.getAs[Int]("innum"))
      }
      val exceptMsgs = auditData.rdd.collect().map(row => {
        var auditResult = 0
        val innum = row.getAs[Int]("innum")
        //獲取數據時間的時分秒
        val time = String.valueOf(row.getAs[Timestamp]("datatime")).substring(11)
        //獲取對應map中包含這個時間點的數據
        val mapArr = maps.filterKeys(_.substring(11).equals(time)).map(x => x._2)

問題原因:

  上面面代碼中,我是將從數據庫查詢出來的數據"datatime"這個字段進行添加到maps中,而我使用的Timestamp類型,看下我數據庫中該字段的類型:

  

  數據庫中的該字段類型是datetime,本來我以為datetime對應到spark中的類型就是Timestamp,顯然這樣是會報上面的那個錯的,如果當做String類型進行讀取也是不行的,完全要按照datetime這個類型來進行修改,否則,數據讀取出來之后可以添加到maps中,但是,對maps中的元素進行操作是會有問題的。接下來就是修改

改后部分代碼:

val maps = Map[String, Int]()
      for (elem <- referenceData.collect()) {
        maps.put(String.valueOf(elem.getAs[DateTime]("datatime")), elem.getAs[Int]("innum"))
      }
      val exceptMsgs = auditData.rdd.collect().map(row => {
        var auditResult = 0
        val innum = row.getAs[Int]("innum")
        val time = String.valueOf(row.getAs[DateTime]("datatime")).substring(11)
        val mapArr = maps.filterKeys(_.substring(11).equals(time)).map(x => x._2)

修改之后,問題消失


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM