2

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

spark-sql で「provided」をオフにすると、jar 重複マージ地獄に陥ります。

助けてくれてありがとう。

4

1 に答える 1

4

クラスの互換性を確保する1.5.0には、 のバージョンも必要なようです。cassandra コネクタを 1.5.0 にアップグレードしspark-cassandra-connectorたコミットは次のとおりです。インポートが削除され、代わりに追加され、関連する行が変更されていることがわかります。org.apache.spark.sql.types.UTF8Stringimport org.apache.spark.unsafe.types.UTF8StringCassandraSQLRow.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を取得できるはずです。

編集: Cassandra コネクタの GitHub README.md からの互換性テーブルへの追加リンク

于 2015-11-04T03:16:32.530 に答える