Получить все пути для базовых (примитивных) типов в объекте json - PullRequest
0 голосов
/ 05 августа 2020

У меня есть фрейм данных, который я преобразовал в файл JSON ниже, рекурсивно просматривая dataFrame.schema (). Полученный JSON выглядит следующим образом: http://pastie.org/p/2Oe1a3KJf212bveJVIEIyQ.

Я хочу найти пути для примитивного типа данных (StringType, IntegerType, а НЕ тот, у которого __Kind как «Запись ").

например, путь для contractType -" services.contract.contractType ".

Один из используемых мной подходов - это рекурсивный обход dataFrame.schema (). Я создал все пути, которые являются есть в JSON, используя этот фрагмент кода

 def helperArrayType(inner: ArrayType, prefix: String): Seq[String] = {
      val fullName: String => String = name => if (prefix.isEmpty) name else s"$prefix.$name"
      inner match {
        case ArrayType(inner: StructType, _) =>
          fullName(prefix) +: helper(inner, fullName(prefix))
        case ArrayType(_, _) => Seq(fullName(prefix))
      }
    }

    def helper(schema: StructType, prefix: String): Seq[String] = {
      val fullName: String => String = name => if (prefix.isEmpty)
        name
       else {
        s"$prefix.$name"}
      schema.fields.flatMap {
        case StructField(name, inner: StructType, _, _) =>
          fullName(name) +: helper(inner, fullName(name))
        case StructField(name, inner: ArrayType, _, _) =>
          fullName(name) +: helperArrayType(inner, fullName(name))
        case StructField(name, _, _, _) => {println(name)
          Seq(fullName(name))}
      }

Но проблема в том, что может быть несколько ключей, таких как (AB C) и (D. C). Итак, путь «C "не может быть определено, так как это происходит в нескольких сценариях ios.

Я думаю о другом способе просто пройти по ссылке JSON, созданной в предыдущем ie, но не смог найти способ пересечь JSON. Кто-нибудь знает, как это сделать?

...