首页 > 解决方案 > ScalaSpark:无法创建具有 scala-client 依赖关系的数据框

问题描述

我需要使用 spark 2.3 或 2.4 支持 couchbase 版本 6,而 scala 版本是 2.11.12。创建数据框时遇到问题。

SBT 代码片段

scalaVersion := "2.11.12"

resolvers += "Couchbase Snapshots" at "http://files.couchbase.com/maven2"

val sparkVersion = "2.3.2"


libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % sparkVersion,
  "org.apache.spark" %% "spark-streaming" % sparkVersion,
  "org.apache.spark" %% "spark-sql" % sparkVersion,
  "com.couchbase.client" %% "spark-connector" % "2.3.0",
  "com.couchbase.client" %% "scala-client" % "1.0.0-alpha.3")

代码

val spark = SparkSession
      .builder()
      .appName("Example")
      .master("local[*]") 
      .config("spark.couchbase.nodes", "10.12.12.88") // connect to Couchbase Server on localhost
      .config("spark.couchbase.username", "abcd") // with given credentials
      .config("spark.couchbase.password", "abcd")
      .config("spark.couchbase.bucket.beer-sample", "") // open the travel-sample bucket
      .getOrCreate()

val sc = spark.sparkContext
import com.couchbase.spark.sql._
val sql = spark.sqlContext
val dataframe = sql.read.couchbase()   
val result = dataframe.collect()

例外

Caused by: java.lang.ClassNotFoundException: com.couchbase.client.core.message.CouchbaseRequest
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)

尝试: 根据建议添加了一个依赖项

"com.couchbase.client" % "core-io" % "1.7.6",

如果没有 scala-client 依赖项,我可以获取数据帧,但 scala-client 无法修复。请为这个问题提出一个解决方案

标签: scalaapache-sparkapache-spark-sqlcouchbase

解决方案


我已经对您的 build.sbt 文件进行了更改,并为 sbt-assembly 插件添加了设置。

scalaVersion := "2.11.12"

resolvers += "Couchbase Snapshots" at "http://files.couchbase.com/maven2"

val sparkVersion = "2.3.2"


libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % sparkVersion % Provided,
  "org.apache.spark" %% "spark-streaming" % sparkVersion % Provided,
  "org.apache.spark" %% "spark-sql" % sparkVersion % Provided,
  "com.couchbase.client" %% "spark-connector" % "2.3.0")

assemblyJarName in assembly := s"${name.value}-${version.value}.jar"

assemblyMergeStrategy in assembly := {
  case m if m.toLowerCase.endsWith("manifest.mf")       => MergeStrategy.discard
  case m if m.toLowerCase.matches("meta-inf.*\\.sf$")   => MergeStrategy.discard
  case "reference.conf"                                 => MergeStrategy.concat
  case x: String if x.contains("UnusedStubClass.class") => MergeStrategy.first
  case _                                                => MergeStrategy.first
}

您需要在名为project的目录中创建一个名为plugins.sbt的文件,并在其中添加以下行:

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.10")

sbt clean compile assembly完成后,在项目的根目录中运行命令。它应该建立你的罐子。


推荐阅读