使用Google Dataproc Spark集群,我的sbt构建的汇编jar可以通过SparkContext访问Cassandra。
然而,当我尝试通过sqlContext访问时,我得到了在远程集群上找不到的spark-sql类——尽管我认为dataproc集群应该为spark-sql提供。
java.lang.NoClassDefFoundError: org/apache/spark/sql/types/UTF8String$
at org.apache.spark.sql.cassandra.CassandraSQLRow$$anonfun$fromJavaDriverRow$1.apply$mcVI$sp(CassandraSQLRow.scala:50)
at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala
我的sbt文件:
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "1.5.0" % "provided",
"org.apache.spark" %% "spark-sql" % "1.5.0" % "provided",
"com.datastax.spark" %% "spark-cassandra-connector" % "1.4.0"
)
关闭sparksql上的"provided"会让我陷入jar重复合并地狱。
谢谢你的帮助。
看起来您还需要spark-cassandra-connector
的1.5.0
版本来确保您的类是兼容的。以下是将cassandra连接器升级到1.5.0的commit,您可以看到它删除了org.apache.spark.sql.types.UTF8String
的导入并添加了import org.apache.spark.unsafe.types.UTF8String
,从而更改了CassandraSQLRow.scala
:中的相关行
data(i) = GettableData.get(row, i)
data(i) match {
case date: Date => data.update(i, new Timestamp(date.getTime))
- case str: String => data.update(i, UTF8String(str))
+ case bigInt: BigInteger => data.update(i, new JBigDecimal(bigInt))
+ case str: String => data.update(i, UTF8String.fromString(str))
case set: Set[_] => data.update(i, set.toSeq)
case _ =>
}
尽管cassandra连接器的Maven central中似乎只有"里程碑"工件类型,而不是"发布"类型,但您仍然可以使用最新的里程碑连接器1.5.0-M2来处理您的代码。
EDIT:Cassandra连接器的GitHub README.md 的兼容性表的附加链接