Hello,

Thank you for your contribution.

We have tried to reproduce your error but we need more information:

- Which Spark version are you using? Stratio Spark-Mongodb connector
supports 1.2.x SparkSQL version.

- What jars are you adding while launching the Spark-shell?

Best regards,

2015-03-03 14:06 GMT+01:00 Cheng, Hao <hao.ch...@intel.com>:

>  As the call stack shows, the mongodb connector is not compatible with
> the Spark SQL Data Source interface. The latest Data Source API is changed
> since 1.2, probably you need to confirm which spark version the MongoDB
> Connector build against.
>
>
>
> By the way, a well format call stack will be more helpful for people
> reading.
>
>
>
> *From:* taoewang [mailto:taoew...@sequoiadb.com]
> *Sent:* Tuesday, March 3, 2015 7:39 PM
> *To:* user@spark.apache.org
> *Subject:* java.lang.IncompatibleClassChangeError when using
> PrunedFilteredScan
>
>
>
>
>
> Hi,
>
>
>
> I’m trying to build the stratio spark-mongodb connector and got error 
> "java.lang.IncompatibleClassChangeError:
> class com.stratio.deep.mongodb.MongodbRelation has interface
> org.apache.spark.sql.sources.PrunedFilteredScan as super class” when trying
> to create a table using the driver:
>
>
>
> scala> import org.apache.spark.sql.SQLContext
>
> val sqlContext = new SQLContext(sc)import org.apache.spark.sql.SQLContext
>
>
>
> import org.apache.spark.sql.SQLContext
>
>
>
> scala> val sqlContext = new SQLContext(sc)
>
> sqlContext: org.apache.spark.sql.SQLContext =
> org.apache.spark.sql.SQLContext@37050c15
>
>
>
> scala> import com.stratio.deep.mongodb
>
> import com.stratio.deep.mongodb
>
> import com.stratio.deep.mongodb
>
>
>
> scala> sqlContext.sql("CREATE TEMPORARY TABLE students_table USING 
> com.stratio.deep.mongodb
> OPTIONS (host 'host:port', database 'highschool', collection 'students')")
>
> sqlContext.sql("CREATE TEMPORARY TABLE students_table USING com.stratio.d
>
> eep.mongodb OPTIONS (host 'host:port', database 'highschool', collection
> 'studen
>
> ts')")
>
> java.lang.IncompatibleClassChangeError: class
> com.stratio.deep.mongodb.MongodbRelation has interface
> org.apache.spark.sql.sources.PrunedFilteredScan as super class
>
> at java.lang.ClassLoader.defineClass1(Native Method)
>
> at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
>
> at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
>
> at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
>
> at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
>
> at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
>
> at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
>
> at java.security.AccessController.doPrivileged(Native Method)
>
> at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
>
> at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
>
> at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
>
> at java.lang.Class.getDeclaredConstructors0(Native Method)
>
> at java.lang.Class.privateGetDeclaredConstructors(Class.java:2585)
>
> at java.lang.Class.getConstructor0(Class.java:2885)
>
> at java.lang.Class.newInstance(Class.java:350)
>
> at org.apache.spark.sql.sources.ResolvedDataSource$.apply(ddl.scala:288)
>
> at org.apache.spark.sql.sources.CreateTempTableUsing.run(ddl.scala:376)
>
> at
> org.apache.spark.sql.execution.ExecutedCommand.sideEffectResult$lzycompute(
> commands.scala:55)
>
> at org.apache.spark.sql.execution.ExecutedCommand.sideEffectResult(
> commands.scala:55)
>
>
>
> The code failed at line 288 in ddl.scala:
>
>   def apply(
>
>       sqlContext: SQLContext,
>
>       userSpecifiedSchema: Option[StructType],
>
>       provider: String,
>
>       options: Map[String, String]): ResolvedDataSource = {
>
>     val clazz: Class[_] = lookupDataSource(provider)
>
>     val relation = userSpecifiedSchema match {
>
>       case Some(schema: StructType) => clazz.newInstance() match {
>
>         case dataSource: SchemaRelationProvider =>
>
>           dataSource.createRelation(sqlContext, new CaseInsensitiveMap(
> options), schema)
>
>         case dataSource: org.apache.spark.sql.sources.RelationProvider =>
>
>           sys.error(s"${clazz.getCanonicalName} does not allow
> user-specified schemas.")
>
>       }
>
>
>
>       case None => clazz.newInstance() match {  <——— failed here
>
>         case dataSource: RelationProvider =>
>
>           dataSource.createRelation(sqlContext, new CaseInsensitiveMap(
> options))
>
>         case dataSource: org.apache.spark.sql.sources.
> SchemaRelationProvider =>
>
>           sys.error(s"A schema needs to be specified when using ${clazz.
> getCanonicalName}.")
>
>       }
>
>     }
>
>     new ResolvedDataSource(clazz, relation)
>
>   }
>
>
>
> The “clazz” here is com.stratio.deep.mongodb.DefaultSource, which extends
> RelationProvider:
>
> class DefaultSource extends RelationProvider {
>
>
>
>   override def createRelation(
>
>     sqlContext: SQLContext,
>
>     parameters: Map[String, String]): BaseRelation = {
>
>
>
>     /** We will assume hosts are provided like
> 'host:port,host2:port2,...'*/
>
>     val host = parameters
>
>       .getOrElse(Host, notFound[String](Host))
>
>       .split(",").toList
>
>
>
>     val database = parameters.getOrElse(Database, notFound(Database))
>
>
>
>     val collection = parameters.getOrElse(Collection, notFound(Collection
> ))
>
>
>
>     val samplingRatio = parameters
>
>       .get(SamplingRatio)
>
>       .map(_.toDouble).getOrElse(DefaultSamplingRatio)
>
>
>
>     MongodbRelation(
>
>       MongodbConfigBuilder()
>
>         .set(Host,host)
>
>         .set(Database,database)
>
>         .set(Collection,collection)
>
>         .set(SamplingRatio,samplingRatio).build())(sqlContext)
>
>
>
>   }
>
>
>
> }
>
>
>
> In createRelation function it returns MongodbRelation, which is extended
> from PrunedFilteredScan
>
> case class MongodbRelation(
>
>   config: DeepConfig,
>
>   schemaProvided: Option[StructType] = None)(
>
>   @transient val sqlContext: SQLContext) extends PrunedFilteredScan {
>
>
>
> Since both TableScan and PrunedFilteredScan are based on BaseRelation, I’m
> not sure why clazz.newInstance() call failed by
> java.lang.IncompatibleClassChangeError.
>
> Is there any special way to deal with if I need to use PrunedFilteredScan?
>
>
>
> I’m using scala 2.10 and JDK 1.7
>
>
>
> Thanks
>
> TW
>
>
>



-- 

Gaspar Muñoz
@gmunozsoria


<http://www.stratio.com/>
Vía de las dos Castillas, 33, Ática 4, 3ª Planta
28224 Pozuelo de Alarcón, Madrid
Tel: +34 91 352 59 42 // *@stratiobd <https://twitter.com/StratioBD>*

Reply via email to