在spark scala计划中找不到主要类

时间:2018-05-27 16:34:06

标签: eclipse scala maven apache-spark

// package com.jsonReader

import play.api.libs.json._
import play.api.libs.json._
import play.api.libs.json.Reads._
import play.api.libs.json.Json.JsValueWrapper
import org.apache.spark._
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.SQLContext
//import org.apache.spark.implicits._


//import sqlContext.implicits._
object json {

    def flatten(js: JsValue, prefix: String = ""): JsObject = js.as[JsObject].fields.foldLeft(Json.obj()) {
    case (acc, (k, v: JsObject)) => {
        val nk = if(prefix.isEmpty) k else s"$prefix.$k"
                acc.deepMerge(flatten(v, nk))
    }
    case (acc, (k, v: JsArray)) => {
        val nk = if(prefix.isEmpty) k else s"$prefix.$k"
                val arr = flattenArray(v, nk).foldLeft(Json.obj())(_++_)
                acc.deepMerge(arr)
    }
    case (acc, (k, v)) => {
        val nk = if(prefix.isEmpty) k else s"$prefix.$k"
                acc + (nk -> v)
    }
    }

    def flattenArray(a: JsArray, k: String = ""): Seq[JsObject] = {
            flattenSeq(a.value.zipWithIndex.map {
            case (o: JsObject, i: Int) =>
            flatten(o, s"$k[$i]")
            case (o: JsArray, i: Int) =>
            flattenArray(o, s"$k[$i]")
            case a =>
            Json.obj(s"$k[${a._2}]" -> a._1)
            })
    }

    def flattenSeq(s: Seq[Any], b: Seq[JsObject] = Seq()): Seq[JsObject] = {
            s.foldLeft[Seq[JsObject]](b){
            case (acc, v: JsObject) =>
            acc:+v
            case (acc, v: Seq[Any]) =>
            flattenSeq(v, acc)
            }
    }
def main(args: Array[String]) {

        val appName = "Stream example 1"
            val conf = new SparkConf().setAppName(appName).setMaster("local[*]")
            //val spark = new SparkContext(conf)
            val sc = new SparkContext(conf)
            //val sqlContext = new SQLContext(sc)
        val sqlContext=new SQLContext(sc);
    //val spark=sqlContext.sparkSession
    val spark = SparkSession.builder().appName("json Reader")
            val df = sqlContext.read.json("C://Users//ashda//Desktop//test.json")
            val set = df.select($"user",$"status",$"reason",explode($"dates")).show()
            val read = flatten(df)
            read.printSchema()
          df.show()         

    }

}

我试图使用此代码来压缩高度嵌套的json。为此,我创建了一个项目并将其转换为maven项目。我编辑了pom.xml并包含了我需要的库,但是当我运行程序时,它说"错误:无法找到或加载主类"。

我尝试将代码转换为sbt项目然后运行但是我得到了同样的错误。我尝试打包代码并运行spark-submit,这给了我同样的错误。请让我知道我在这里失踪了什么。我已经尽力了。

由于

2 个答案:

答案 0 :(得分:1)

很难说,但也许你有很多符合主要资格的课程,所以构建工具不知道选择哪一个。也许首先尝试清理项目sbt clean

无论如何,在scala中定义主类的首选方法是扩展App -trait。

object SomeApp extends App

然后整个物体将成为你的主要方法。 您还可以在build.sbt中定义主类。如果您有许多扩展App -trait的对象,则必须这样做。

mainClass in (Compile, run) := Some("io.example.SomeApp")

答案 1 :(得分:0)

我正在回答有关sbt配置的问题。我也遇到了最近解决的相同问题,并犯了一些基本的错误,我想请您注意:

1。配置您的sbt文件

转到build.sbt文件,查看您使用的scala版本与spark兼容。根据spark https://spark.apache.org/docs/latest/的2.4.0版本,所需的scala版本为2.11.x而不是2.12.x。因此,即使您的IDE(Eclipse / IntelliJ)显示了最新版本的scala或您下载的版本,也要将其更改为兼容版本。另外,包括以下代码行

libraryDependencies += "org.scala-lang" % "scala-library" % "2.11.6"

2.11.x是您的Scala版本

2。文件层次结构 确保您的Scala文件仅在/ src / main / scala软件包下

3。终端 如果您的IDE允许您在其中启动终端,请启动它(IntelliJ允许,不确定Eclipse或其他工具),或者转到终端并将目录更改为项目目录

然后运行:

sbt clean

这将清除以前加载的所有库或编译后创建的文件夹。

sbt package

这会将您的文件打包到target / scala- /包下的单个jar文件中

然后提交火花:

spark-submit target/scala-<version>/<.jar file> --class "<ClassName>(In your case , com.jsonReader.json)" --jars target/scala-<version>/<.jar file> --master local[*] 

请注意-如果在程序中指定,则不需要