// 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,这给了我同样的错误。请让我知道我在这里失踪了什么。我已经尽力了。
由于
答案 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[*]
请注意-如果在程序中指定,则不需要