scala中的ClassCastException

时间:2017-10-03 14:36:30

标签: scala hadoop apache-spark

当我尝试输入强制转换时,我收到了ClassCastException。 Spark提交代码如下 输入行:" 2017-02-25 14:39:09,123对于:PO1028,PD1028,产品PD1028在SAP DB中不存在。"

                        println("Print each sap rdd " + line.saplogMsg)                    
                                    if (line.saplogMsg.contains("For:")) {
                                      startTime = line.loggedat
                                      println("startTime : " + startTime)
                                      val customFields = line.saplogMsg.split(",");
                                      TransactionId = customFields(0).split(":")(1).trim()
                                      println("TransactionId : " + TransactionId)
                                      customField2 = customFields(1)
                                      println("customField2 : " + customField2)
                                      appln = "SAP"
                                      layer = "APP"
                                      errorMsg = line.saplogMsg.split(",")(2)
                                      println("errorMsg : " + errorMsg)
                                    }
    if (line.saplogMsg.contains("doesn't exist")) {
                                      endTime = line.loggedat
                                      println("endTime "+endTime)
                                      status = "failed"              
                                      val purchaseOrderOld:PurchaseOrder = mapPO.get(TransactionId).asInstanceOf[PurchaseOrder]
                                      println("SAP Transaction Id : " + purchaseOrderOld)     
                                  purchaseOrderOld.startTime = startTime
                                      purchaseOrderOld.TransactionId=TransactionId
                                      purchaseOrderOld.customField2=customField2
                                      purchaseOrderOld.application=appln
                                      purchaseOrderOld.layer=layer
                                      purchaseOrderOld.errorMsg=errorMsg
                                      purchaseOrderOld.endTime=endTime
                                      purchaseOrderOld.status=status
                                }
     package logMonitor                        
     case class PurchaseOrder(                        
                          var startTime: java.sql.Date,
                          var endTime: java.sql.Date,
                          var TransactionId: String,
                          var customField1: String,
                          var customField2: String,
                          var status: String,
                          var errorMsg: String,
                          var application: String,
                          var layer: String)

我正在尝试构建新的采购订单对象,但检索旧的采购订单并更新地图中的采购订单对象。 输出控制台:
闷棍:1 SapLogLine(2016-04-01,For:PO1000,PD1000,产品PD1000在SAP DB中不存在。) 打印每个sap rdd对于:PO1000,PD1000,产品PD1000不存在于SAP DB中。 startTime:2016-04-01 TransactionId:PO1000 customField2:PD1000 errorMsg:产品PD1000不存在于SAP DB中。 endTime 2016-04-01 17/10/03 19:34:06错误JobScheduler:运行作业流作业时出错1507039435000 ms.1 java.lang.ClassCastException:scala.None $无法强制转换为logMonitor.PurchaseOrder

1 个答案:

答案 0 :(得分:2)

我假设,mapPOMap。 所以,你有两个问题:

首先,mapPO.get会返回Option,因此将其投放到PurchaseOrder无效。

其次,在这种特殊情况下,地图中没有与您的交易ID匹配的条目,因此,它会返回None

如果正确声明了mapPO类型,并避免运行时类型转换,那么你可以避免这类问题。