scala - Scala中的ClassCastException

标签 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)

我正在尝试构建新的采购订单对象,但要检索旧的采购订单并更新Map中的采购订单对象。
输出控制台:
汁液:1
SapLogLine(2016-04-01,用于:PO1000,PD1000,产品PD1000在SAP DB中不存在。)
打印以下SAP的每个SAP RDD:PO1000,PD1000,产品PD1000在SAP DB中不存在。
开始时间:2016-04-01
交易编号:PO1000
customField2:PD1000
errorMsg:产品PD1000在SAP DB中不存在。
结束时间2016-04-01
03/10/17 19:34:06错误JobScheduler:运行作业流作业1507039435000 ms.1时出错
java.lang.ClassCastException:scala.None $无法转换为logMonitor.PurchaseOrder

最佳答案

我假设mapPOMap
因此,这里有两个问题:

首先,mapPO.get返回一个Option,因此,将其强制转换为PurchaseOrder无效。

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

如果正确声明了mapPO类型,并且避免了运行时类型强制转换,则可以避免整个此类问题。

关于scala - Scala中的ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46547186/

相关文章:

hadoop - 我的资源管理器没有开放端口 8032 是什么意思?

hadoop - PIG脚本以分组和聚合数据

scala - 案例分类和特征

macos - Jupyter-Scala 笔记本不断重新启动并出现 NullPointerException

hadoop - 未经授权的容器启动请求。此 token 已过期

hadoop - 为什么 Spark 运行多个进程?

apache-spark - pyspark 1.6.0写入 Parquet 会导致 “path exists”错误

java - 转换 Spark 数据集中的数据时数据类型不匹配

scala - 类型不匹配 : expected A => NotInferedB, 实际 任何

python - 使用 Scala 解析 Python 的 If 语句