scala vis Wie auf Sub-Entitäten in JSON-Datei zugreifen?



json table widget (1)

angegebene Eingabespalten: [_corrupt_record] ;;

Der Grund dafür ist, dass Spark JSON-Dateien unterstützt, in denen "Jede Zeile ein separates, eigenständiges gültiges JSON-Objekt enthalten muss."

Angeben von JSON-Datasets :

Beachten Sie, dass die Datei, die als JSON-Datei angeboten wird, keine typische JSON-Datei ist. Jede Zeile muss ein separates, eigenständiges gültiges JSON-Objekt enthalten. Weitere Informationen finden Sie im JSON-Zeilen-Textformat, das auch als durch Zeilentrennzeichen getrennter JSON-Text bezeichnet wird. Daher wird eine reguläre mehrzeilige JSON-Datei am häufigsten fehlschlagen.

_corrupt_record eine JSON-Datei für Spark nicht korrekt ist, wird sie unter _corrupt_record (das Sie mit der Option columnNameOfCorruptRecord ändern columnNameOfCorruptRecord ).

scala> spark.read.json("employee.json").printSchema
root
 |-- _corrupt_record: string (nullable = true)

Und Ihre Datei ist nicht nur falsch, weil es ein mehrzeiliger JSON ist, sondern auch, weil jq (ein leichter und flexibler JSON-Befehlszeilenprozessor) das sagt.

$ cat incorrect.json
{
  "employeeDetails":{
    "name": "xxxx",
    "num:"415"
  }
  "work":[
  {
    "monthYear":"01/2007"
    "workdate":"1|2|3|....|31",
    "workhours":"8|8|8....|8"
  },
  {
    "monthYear":"02/2007"
    "workdate":"1|2|3|....|31",
    "workhours":"8|8|8....|8"
  }
  ],
}
$ cat incorrect.json | jq
parse error: Expected separator between values at line 4, column 14

Nachdem Sie die JSON-Datei repariert haben, verwenden Sie den folgenden Trick, um die mehrzeilige JSON-Datei zu laden.

scala> spark.version
res5: String = 2.1.1

val employees = spark.read.json(sc.wholeTextFiles("employee.json").values)
scala> employees.printSchema
root
 |-- employeeDetails: struct (nullable = true)
 |    |-- name: string (nullable = true)
 |    |-- num: string (nullable = true)
 |-- work: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- monthYear: string (nullable = true)
 |    |    |-- workdate: string (nullable = true)
 |    |    |-- workhours: string (nullable = true)

scala> employees.select("employeeDetails").show()
+---------------+
|employeeDetails|
+---------------+
|     [xxxx,415]|
+---------------+

Spark> = 2.2

Ab Spark 2.2 (vor kurzem veröffentlicht und dringend empfohlen) sollten Sie multiLine Option multiLine verwenden. multiLine Option multiLine wurde in SPARK-20980 hinzugefügt. Benennen Sie die Option wholeFile in multiLine für JSON und CSV um .

scala> spark.version
res0: String = 2.2.0

scala> spark.read.option("multiLine", true).json("employee.json").printSchema
root
 |-- employeeDetails: struct (nullable = true)
 |    |-- name: string (nullable = true)
 |    |-- num: string (nullable = true)
 |-- work: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- monthYear: string (nullable = true)
 |    |    |-- workdate: string (nullable = true)
 |    |    |-- workhours: string (nullable = true)

Ich habe eine JSON-Datei wie folgt aussehen:

{
  "employeeDetails":{
    "name": "xxxx",
    "num":"415"
  },
  "work":[
    {
      "monthYear":"01/2007",
      "workdate":"1|2|3|....|31",
      "workhours":"8|8|8....|8"
    },
    {
      "monthYear":"02/2007",
      "workdate":"1|2|3|....|31",
      "workhours":"8|8|8....|8"
    }
  ]
}

Ich muss das Arbeitsdatum, Arbeitsstunden von diesen json Daten erhalten.

Ich habe es so versucht:

import org.apache.spark.{SparkConf, SparkContext}

object JSON2 {
  def main (args: Array[String]) {
    val spark =
      SparkSession.builder()
        .appName("SQL-JSON")
        .master("local[4]")
        .getOrCreate()

    import spark.implicits._

    val employees = spark.read.json("sample.json")
    employees.printSchema()
    employees.select("employeeDetails").show()
  }
}

Ich bekomme eine Ausnahme wie folgt:

Exception in thread "main" org.apache.spark.sql.AnalysisException: cannot resolve '`employeeDetails`' given input columns: [_corrupt_record];;
'Project ['employeeDetails]
+- Relation[_corrupt_record#0] json

Ich bin neu in Spark.





apache-spark-sql