使用spark-submit运行时无法加载com.databricks.spark.csv

时间:2016-03-11 13:19:00

标签: scala apache-spark sbt

我正在尝试使用以下命令使用spark-submit运行我的代码。

spark-submit --class "SampleApp" --master local[2] target/scala-2.11/sample-project_2.11-1.0.jar

我的sbt文件具有以下依赖项:

libraryDependencies += "org.apache.spark" %% "spark-core" % "1.4.1"

libraryDependencies += "org.apache.spark" % "spark-sql_2.11" % "1.5.2"

libraryDependencies += "com.databricks" % "spark-csv_2.11" % "1.2.0"

我的代码:

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import scala.collection.mutable.ArrayBuffer 
import org.apache.spark.sql.SQLContext

object SampleApp {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("Sample App").setMaster("local[2]")
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc) 

    import sqlContext._ 
    import sqlContext.implicits._

    val df = sqlContext.load("com.databricks.spark.csv", Map("path" -> "/root/input/Account.csv", "header" -> "true"))

    val column_names = df.columns
    val row_count = df.count
    val column_count = column_names.length

    var pKeys = ArrayBuffer[String]()

    for ( i <- column_names){
         if (row_count == df.groupBy(i).count.count){
             pKeys += df.groupBy(i).count.columns(0)
         }
     }

    pKeys.foreach(print)
  }
}

错误:

16/03/11 04:47:37 INFO BlockManagerMaster: Registered BlockManager
Exception in thread "main" java.lang.RuntimeException: Failed to load class for data source: com.databricks.spark.csv
    at scala.sys.package$.error(package.scala:27)
    at org.apache.spark.sql.sources.ResolvedDataSource$.lookupDataSource(ddl.scala:220)
    at org.apache.spark.sql.sources.ResolvedDataSource$.apply(ddl.scala:233)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:114)
    at org.apache.spark.sql.SQLContext.load(SQLContext.scala:1253)

我的Spark版本是1.4.1,Scala是2.11.7

(我关注此链接:http://www.nodalpoint.com/development-and-deployment-of-spark-applications-with-scala-eclipse-and-sbt-part-1-installation-configuration/

我尝试过以下版本的spark csv

spark-csv_2.10 1.2.0
1.4.0 
1.3.1
1.3.0
1.2.0
1.1.0
1.0.3
1.0.2
1.0.1
1.0.0

请帮忙!

5 个答案:

答案 0 :(得分:2)

由于您以本地模式运行作业,因此使用--jar选项

添加外部jar路径
  

spark-submit --class“SampleApp”--master local [2] - jar文件:[path-of-spark-csv_2.11.jar],file:[path-of-other- dependency-jar] target / scala-2.11 / sample-project_2.11-1.0.jar

e.g。

spark-submit --jars file:/root/Downloads/jars/spark-csv_2.10-1.0.3.jar,file:/root/Downloads/jars/com‌​mons-csv-1.2.jar,file:/root/Downloads/jars/spark-sql_2.11-1.4.1.jar --class "SampleApp" --master local[2] target/scala-2.11/my-proj_2.11-1.0.jar

你能做的另一件事就是创造一个胖罐子。在SBT中,您可以尝试此proper-way-to-make-a-spark-fat-jar-using-sbt,并在Maven中引用create-a-fat-jar-file-maven-assembly-plugin

注意:将Spark的范围(即spark-core,spark-streaming,spark-sql等)标记为提供,否则胖jar将变得太胖而无法部署

答案 1 :(得分:1)

更好的解决方案是使用下面的spark-submit --class "SampleApp" --master local[2] --packages com.databricks:spark-csv_2.10:1.5.0 target/scala-2.11/sample-project_2.11-1.0.jar 选项。

--packages

确保Firebase选项位于应用程序jar

之前

答案 2 :(得分:0)

你已经为你的sbt配置添加了spark-csv库 - 这意味着你可以用它来编译你的代码,

但它仍然没有意味着它在运行时存在(默认情况下spark sql和spark核心存在)

所以尝试使用spark-submit的--jars选项将spark-csv jar添加到运行时类路径中,或者你可以构建fat-jar(不知道你是如何用sbt做的)

答案 3 :(得分:0)

您正在使用Spark 1.3语法将CSV文件加载到数据框中。

如果选中repository here,则应在Spark 1.4及更高版本中使用以下语法:

val df = sqlContext.read
    .format("com.databricks.spark.csv")
    .option("header", "true") // Use first line of all files as header
    .option("inferSchema", "true") // Automatically infer data types
    .load("cars.csv")

答案 4 :(得分:0)

我正在寻找一个选项,我可以跳过--packages选项并直接在程序集jar中提供它。我遇到这个例外的原因是 sqlContext.read.format(&#34; csv&#34;)这意味着它应该知道csv的数据格式。相反,要指定格式csv存在的位置,请使用 sqlContext.read.format(&#34; com.databricks.spark.csv&#34;),以便它知道在哪里查找它而不是抛出异常。