首页 > 解决方案 > 在 spark scala 程序中找不到主类

问题描述

//包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 运行,这给了我同样的错误。请让我知道我在这里缺少什么。我已经尽力了。

谢谢

标签: eclipsescalamavenapache-spark

解决方案


很难说,但也许你有很多类可以作为主类,所以构建工具不知道选择哪一个。也许先尝试清理项目sbt clean

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

object SomeApp extends App

然后整个对象体将成为您的主要方法。您还可以在 build.sbt 中定义主类。如果您有许多扩展 App 特征的对象,这是必要的。

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

推荐阅读