1、报错1
Caused by: java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to java.util.List
分析: 这个问题,一般是在Sparksql中做row转换时候出错,最好一步步排错。 这里要说的是, row:Row是先做了一次强制类型转换(asInstanceOf),row的实际类型是Seq[T],但是不能用Array[T],否则就会出现各种scala和java的类型转换不匹配的问题. 尽量使用原生提供的对象转换的方法.
这个是我自己碰到的都一样,只不过我是在将spark的DataFrame的row对象的数据转换成Java的list时报错.
最后做了下面的修改,下面红线的是重要的,我 使用它本身提供的将row对象转化成list的api,getList(). 避免了上述错误,完成了转换。
注意:报其他数据类型的错误如Double等都可以在理解的基础上解决,本质上的原因就是spark数据类型和java数据类型的转换问题。
2、java.lang.NoSuchMethodError异常解决
报这种错误是由于jar包冲突,首先先检查pom.xml的依赖版本是否一致,比如spark报这个错误时,由于开始spark-hive_2.11使用的和spark那边使用的版本不一致导致的。
<dependency> <groupId>org.mongodb.spark</groupId> <artifactId>mongo-spark-connector_2.11</artifactId> <version>2.4.3</version></dependency><dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>2.4.3</version></dependency><dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.11</artifactId> <version>2.4.3</version></dependency><dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-hive_2.11</artifactId> <version>2.4.3</version></dependency>
3、map、flatmap等算子需要implement的接口
1、spark 的JavaRDD使用map、flatmap、filter等算子时,统一需要implement接口 org.apache.spark.api.java.function.Function
使用方法:
JavaRDD<CmaCoreMongoSpark> cma = cmaMongo .filter(new FilterCnMedicalPaperFunc()) .filter(new TimeFilterFunc(startTime, endTime)) .map(new MapCnMedicalPaperFunc());
2、spark的Dataset<?> 使用map时需要implement接口 org.apache.spark.api.java.function.MapFunction 使用flatmap需要implement接口 org.apache.spark.api.java.function.FlatMapFunction ...... 实现不同的接口,但命名大概就是算子名称+Function
使用方法(涉及到?对象类型的转化,map需要两个参数,一个转化函数类、一个转化的javaBean类型的Encoder):
Dataset<CnStandardJournalInfoSpark> journal = df.map( new CnJournalFunc(), Encoders.bean(CnStandardJournalInfoSpark.class));原文:https://juejin.cn/post/7098585276313927716