2

使用 Google Dataproc Spark 集群,我的 sbt 构建的程序集 jar 可以通过 SparkContext 访问 Cassandra。

但是,当我尝试通过 sqlContext 访问时,我得到了在远程集群上找不到的 spark sql 类——尽管我相信应该为 spark sql 配置 dataproc 集群。

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

关闭 spark-sql 上的“提供”会使我陷入 jar 重复合并地狱。

感谢您的帮助。

4

1 回答 1

4

看起来您还需要版本1.5.0spark-cassandra-connector确保您的类兼容。这是将 cassandra 连接器升级到 1.5.0 的提交,您可以看到它删除了导入org.apache.spark.sql.types.UTF8Stringimport 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 中心中似乎只有“里程碑”工件类型而不是“发布”类型,但您仍然应该能够获得最新的里程碑连接器1.5.0-M2来处理您的代码。

编辑:来自 Cassandra 连接器的 GitHub README.md 的兼容性表的附加链接

于 2015-11-04T03:16:32.530 回答