scala - 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 无法修复。请为这个问题提出一个解决方案
解决方案
我已经对您的 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
完成后,在项目的根目录中运行命令。它应该建立你的罐子。
推荐阅读
- regex - Perl 正则表达式替换,环境变量评估
- django - 在 django 中,我如何构造一个给出子类总和的方法
- r - 当我将注释添加到“kaggle 笔记本”中的 ggplot 时,我在图表上方得到一个巨大的空白,我该如何解决这个问题
- r - 通过包have R读取sas元数据文件时出错
- python - 如何通过 json 将 OpenCV-Image 发送到 Flask Docker-Container?
- java - 通过 RMI 传输 Java 文件
- python - 在反向代理后面加前缀 url_for()
- xml - CSV 到 XML XSLT:如何通过管道转义
- c# - 即使未使用属性,也会调用自定义授权属性
- php - 多维数组到 HTML 表