場景描述:
再從該數據庫中讀取數據進行處理的時候,需要將某個字段加入到一個動態的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)
修改之后,問題消失