основной класс не найден в программе Spark Scala - PullRequest
0 голосов
/ 27 мая 2018

// 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 голосов
/ 17 января 2019

Я отвечаю на этот вопрос для конфигураций sbt.Я также получил те же проблемы, которые я недавно решил, и сделал несколько основных ошибок, на которые я хотел бы обратить ваше внимание:

1.Настройте свой файл sbt

, перейдите в файл build.sbt и убедитесь, что используемая вами версия scala совместима с spark. Согласно версии 2.4.0 spark https://spark.apache.org/docs/latest/, версия 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.Terminal Если ваша IDE позволяет вам запустить терминал внутри него, запустите его (IntelliJ разрешает, не уверен в Eclipse или любом другом) ИЛИ Перейдите в терминал и измените каталог на каталог вашего проекта

, затем запустите:

sbt clean

Это удалит все библиотеки, загруженные ранее, или папки, созданные после компиляции.

sbt package

Это упакует ваши файлы в один файл jar в target / scala- / package

Затем отправьте в spark:

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

Обратите внимание, что -- если указано в программе, здесь не требуется

0 голосов
/ 28 мая 2018

Трудно сказать, но, возможно, у вас есть много классов, которые считаются основными, поэтому инструмент сборки не знает, какой из них выбрать.Возможно, попробуйте сначала очистить проект sbt clean.

В любом случае в scala предпочтительным способом определения основного класса является расширение свойства App.

object SomeApp extends App

Тогда все тело объекта станет вашим основным методом.Вы также можете определить в своем build.sbt основной класс.Это необходимо, если у вас есть много объектов, которые расширяют черту App.

mainClass in (Compile, run) := Some("io.example.SomeApp")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...