类组织的apache-spark异常,java. lang. NoClassDefFoundError:无法初始化类XXX(类中存在字段验证)异常,当我试图做的Spark数据框字段验证。以下是我的代码
- 并且使用的所有类和对象都已序列化。AWS EMR Spark作业失败(在本地计算机中工作正常)**
val newSchema = df.schema.add("errorList", ArrayType(new StructType()
.add("fieldName" , StringType)
.add("value" , StringType)
.add("message" , StringType)))
//Validators is a Sequence of validations on columns in a Row.
// Validator method signature
// def checkForErrors(row: Row): (fieldName, value, message) ={
// logic to validate the field in a row }
val validateRow: Row => Row = (row: Row)=>{
val errorList = validators.map(validator => validator.checkForErrors(row)
Row.merge(row, Row(errorList))
}
val validateDf = df.map(validateRow)(RowEncoder.apply(newSchema))
版本:Spark 2.4.7和Scala 2.11.8
任何关于为什么会发生这种情况的想法,或者如果有人有同样的问题。
1条答案
按热度按时间wyyhbhjk1#
我在EMR版本6.8.0中遇到了一个非常类似的问题--特别是,
spark.jars
配置在EMR上没有得到尊重(我将它指向S3中JAR的位置),尽管它似乎是通常接受的Spark参数。对我来说,解决方案是遵循以下指南(“我如何解决亚马逊EMR上Spark中的“java.lang.ClassNotFoundException”?”):https://aws.amazon.com/premiumsupport/knowledge-center/emr-spark-classnotfoundexception/
在CDK中(其中我们的EMR集群定义为),我设置了一个EMR步骤,在集群创建后立即执行,重写
spark.driver.extraClassPath
和spark.executor.extraClassPath
以包含我的附加JAR的位置(在我的例子中,JAR实际上来自Docker映像,但是您也可以设置一个引导操作,将其从S3复制到集群上),按照他们在“For Amazon EMR Release Version 6. 0. 0及更高版本"下的文章中的代码,您必须进行这种“重写”的原因是因为EMR已经用一堆自己的JAR位置填充了这些X1 M3 N1 X,例如对于包含S3驱动程序的JAR,因此您实际上必须附加自己的JAR位置,而不是直接将spark.*.extraClassPath
设置为您的位置。如果您这样做(我试过了),那么您将失去许多EMR功能,例如能够从S3读取。