scala - JSON फाइल में उप-संस्थाओं तक कैसे पहुंचें?



apache-spark apache-spark-sql (1)

दिए गए इनपुट कॉलम: [_corrupt_record] ;;

इसका कारण यह है कि स्पार्क जेएसओन फाइलों का समर्थन करता है जिसमें "प्रत्येक पंक्ति में एक अलग, आत्म-निहित वैध JSON वस्तु होना चाहिए।"

JSON डेटासेट का हवाला देते हुए:

ध्यान दें कि फ़ाइल जो json फ़ाइल के रूप में दी गई है, वह एक विशिष्ट JSON फ़ाइल नहीं है। प्रत्येक पंक्ति में एक अलग, आत्मनिहित मान्य JSON ऑब्जेक्ट होना चाहिए। अधिक जानकारी के लिए, कृपया JSON लाइन पाठ स्वरूप देखें, जिसे न्यूलाइन-सीमांकित JSON भी कहा जाता है। एक परिणाम के रूप में, एक नियमित बहु-लाइन JSON फ़ाइल अक्सर विफल हो जाएगी

अगर स्पार्क के लिए एक JSON फ़ाइल गलत है, तो इसे _corrupt_record (यह है कि आप columnNameOfCorruptRecord विकल्प का उपयोग करके बदल सकते हैं) के तहत संग्रहीत करेगा।

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

और आपकी फ़ाइल ग़लत है न केवल यह एक बहु-पंक्ति JSON है, बल्कि इसलिए भी कि jq (एक हल्के और लचीला कमांड-लाइन JSON प्रोसेसर) ऐसा कहता है।

$ 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

एक बार जब आप JSON फ़ाइल को ठीक कर लें, तो बहु-लाइन JSON फ़ाइल को लोड करने के लिए निम्न चाल का उपयोग करें।

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]|
+---------------+

स्पार्क> = 2.2

स्पार्क 2.2 की तरह ( हाल ही में जारी और अत्यधिक उपयोग करने के लिए अनुशंसित), आपको इसके बजाय multiLine विकल्प का उपयोग करना चाहिए। multiLine विकल्प SPARK-20980 में जोड़ दिया गया था विकल्प wholeFile multiLine JSON और CSV के लिए multiLine wholeFile लिए multiLine नाम बदलें

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)

मेरे पास एक जेसन फाइल है जो इस तरह दिखती है:

{
  "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"
    }
  ]
}

मुझे इस जेएसएन डेटा से कार्यदिवस, कार्यभार प्राप्त करना होगा।

मैंने इस तरह की कोशिश की:

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()
  }
}

मुझे इस तरह अपवाद मिल रहा है:

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

मैं स्पार्क के लिए नया हूँ





apache-spark-sql