Необходимо прочитать Nested Json и проанализировать его в двух столбцах (Id, newId), используя dataframe в scala - PullRequest
0 голосов
/ 24 января 2019

Вот примерные данные, которые нужно разделить на два конкретных столбца

{ "tags": [ { "1": "NpProgressBarTag", "2": "userPath", "3": "screen", "4": 6, "12": 9, "13": "buttonName", "16": 0, "17": 10, "18": 5, "19": 6, "20": 1, "35": 1, "36": 1, "37": 4, "38": 0 },{ "1": "Progression", "2": "Path", "3": "Light", "4": 10, "12": 5, "13": "TagName" } ] }

Вывод должен выглядеть как

id    newid 
1     NpProgressBarTag
2     userpath
3     screen
4      6
12     9
13     buttonName
20      1

id     newId
1      Progression
2      path
3      Light
4      10
12     5
13     Tagname

Может кто-нибудь помочь мне с этой проблемой.

1 Ответ

0 голосов
/ 25 января 2019

С вашими данными есть одна сложная вещь: они содержат numbers и strings.

Мое решение использует play-json!

Итак, сначала я создал Структуручтобы доставить Json в Scala-Land:

  case class Tags(tags: Seq[Map[String, String]])

  object Tags {

    implicit val mapReads: Reads[Map[String, String]] = { jv: JsValue =>
      JsSuccess(jv.as[Map[String, JsValue]].map {
        case (k, v) =>
          k -> v.toString
      })
    }

    implicit val jsonReads: Reads[Tags] = Json.reads[Tags]


  }

Если вы создаете case class с этим Читателем implicit val jsonReads: Reads[Tags] = Json.reads[Tags],

, все, что отсутствует, - это Читатель для Карты.Это изменяет общий JsValue на String.

Использование:

json.validate[Tags] match {
    case JsSuccess(value, _) =>
      for{
        tags <- value.tags
        entry <- tags.toSeq
      } yield (entry._1, entry._2.toString)
    case err:JsError => // handleError
  }

Здесь, по сути, вы выравниваете Последовательность и Карту.

Результат: List((12,9), (19,6), (4,6), (37,4), (13,"buttonName"),..

Здесь вы можете поиграть с этим сами: https://scalafiddle.io/sf/kM6iBXF/2

...