Как разбить JSON на строки набора данных? - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть следующие входные данные JSON:

{
    "lib": [
      {
        "id": "a1",
        "type": "push",
        "icons": [
          {
            "iId": "111"
          }
        ],
        "id": "a2",
        "type": "pull",
        "icons": [
          {
            "iId": "111"
          },
          {
            "iId": "222"
          }
        ]
      }
]

Я хочу получить следующий набор данных:

id   type     iId
a1   push     111
a2   pull     111
a2   pull     222

Как я могу это сделать?

Этомой текущий кодЯ использую Spark 2.3 и Java 1.8:

ds = spark
         .read()
         .option("multiLine", true).option("mode", "PERMISSIVE")
         .json(jsonFilePath);

ds = ds
        .select(org.apache.spark.sql.functions.explode(ds.col("lib.icons")).as("icons"));

Однако результат неправильный:

+---------------+
|          icons|
+---------------+
|        [[111]]|
|[[111], [222...|
+---------------+

Как получить правильный набор данных?

ОБНОВЛЕНИЕ:

Я пробую этот код, но он генерирует некоторые дополнительные комбинации id, type и iId, которых нет во входном файле.

ds = ds
      .withColumn("icons", org.apache.spark.sql.functions.explode(ds.col("lib.icons")))
      .withColumn("id", org.apache.spark.sql.functions.explode(ds.col("lib.id")))
      .withColumn("type", org.apache.spark.sql.functions.explode(ds.col("lib.type")));

ds = ds.withColumn("its",  org.apache.spark.sql.functions.explode(ds.col("icons")));

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Как уже указывалось, строка JSON выглядит неправильно.с обновленным, вы можете использовать следующее, чтобы получить желаемый результат:

import org.apache.spark.sql.functions._

spark.read
      .format("json")
      .load("in/test.json")
      .select(explode($"lib").alias("result"))
      .select($"result.id", $"result.type", explode($"result.icons").alias("iId"))
      .select($"id", $"type", $"iId.iId")
      .show
0 голосов
/ 05 декабря 2018

Ваш JSON выглядит неправильно.Исправление отступа делает это немного более очевидным:

{
  "lib": [
    {
      "id": "a1",
      "type": "push",
      "icons": [
        {
          "iId": "111"
        }
      ],
      "id": "a2",
      "type": "pull",
      "icons": [
        {
          "iId": "111"
        },
        {
          "iId": "222"
        }
      ]
    }
  ]

Правильно ли работает ваш код, если вместо этого передать его в формате JSON?

{
  "lib": [
    {
      "id": "a1",
      "type": "push",
      "icons": [
        {
          "iId": "111"
        }
      ]
    },
    {
      "id": "a2",
      "type": "pull",
      "icons": [
        {
          "iId": "111"
        },
        {
          "iId": "222"
        }
      ]
    }
  ]
}

Обратите внимание на вставленный }, { непосредственно перед "id": "a2" разбить объект с дублирующимися ключами на две части, а закрывающий } в самом конце, который ранее был опущен.

...