Можно ли создать столбец данных с данными json, которые не имеют фиксированной схемы? - PullRequest
0 голосов
/ 11 апреля 2020

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

Позже этот файл используется для обработки json, исходная структура не должна подвергаться риску.

В настоящее время, когда я пытаюсь записать данные в файл, он содержит все escape-символы и считается целым json как строка вместо сложного типа. Например,

{"field1":"d1","field2":"app","value":"{\"data\":\"{\\\"app\\\":\\\"am\\\"}\"}"}

1 Ответ

0 голосов
/ 11 апреля 2020

Вы можете попытаться создать схему для файла json.

Я не знаю, какой результат вы ожидаете.

В качестве подсказки я приведу вам пример и два интересные ссылки:

https://sparkbyexamples.com/spark/spark-read-json-with-schema/

https://sparkbyexamples.com/spark/spark-schema-explained-with-examples/

import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types.{StringType, StructType}

object RareJson {
  val spark = SparkSession
    .builder()
    .appName("RareJson")
    .master("local[*]")
    .config("spark.sql.shuffle.partitions","4") //Change to a more reasonable default number of partitions for our data
    .config("spark.app.id","RareJson") // To silence Metrics warning
    .getOrCreate()

  val sc = spark.sparkContext

  val sqlContext = spark.sqlContext

  val input = "/home/cloudera/files/tests/rare.json"

  def main(args: Array[String]): Unit = {

    Logger.getRootLogger.setLevel(Level.ERROR)

    try {
      val structureSchema = new StructType()
        .add("field1",StringType)
        .add("field2",StringType)
        .add("value",StringType,true)

      val rareJson = sqlContext
        .read
        .option("allowBackslashEscapingAnyCharacter", true)
        .option("allowUnquotedFieldNames", true)
        .option("multiLine", true)
        .option("mode", "DROPMALFORMED")
        .schema(structureSchema)
        .json(input)

      rareJson.show(truncate = false)

      // To have the opportunity to view the web console of Spark: http://localhost:4041/
      println("Type whatever to the console to exit......")
      scala.io.StdIn.readLine()
    } finally {
      sc.stop()
      println("SparkContext stopped")
      spark.stop()
      println("SparkSession stopped")
    }
  }
}

вывод

+------+------+---------------------------+
|field1|field2|value                      |
+------+------+---------------------------+
|d1    |app   |{"data":"{\"app\":\"am\"}"}|
+------+------+---------------------------+

Вы также можете попытаться проанализировать столбец значений, если он поддерживает одинаковый формат по всем строкам.

Надеюсь, это может быть печально.

С уважением.

...