spark使用时的一些报错及map、flatmap等算子需要implement的接口

576 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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)
);