Прочитайте файл Json с помощью Scala/Spark

#json #scala #apache-spark

Вопрос:

Я пытаюсь прочитать json, пример:

 {
  "id1": {
    "a": "7",
    "b": "3",
    "c": "10",
    "d": "10",
    "e": "15",
    "f": "11",
    "g": "2",
    "h": "7",
    "i": "5",
    "j": "14"
  },
  "id2": {
    "a": "3",
    "b": "7",
    "c": "12",
    "d": "4",
    "e": "10",
    "f": "4",
    "g": "13",
    "h": "4",
    "i": "1",
    "j": "13"
  },
  "id3": {
    "a": "10",
    "b": "6",
    "c": "1",
    "d": "1",
    "e": "13",
    "f": "12",
    "g": "9",
    "h": "6",
    "i": "7",
    "j": "4"
  }
}
 

когда я обрабатываю его с помощью spark.read.json («файл.json»), он возвращает одну запись в этом формате:

  ----------------------------------- --------------------------------------- --------------------------------- 
|id1                                |id2                                    |id3                              |
 ----------------------------------- --------------------------------------- --------------------------------- 
|{7, 3, 10, 10, 15, 11, 2, 7, 5, 14}|{322539, 7, 12, 4, 10, 4, 13, 4, 1, 13}|{10, 6, 1, 1, 13, 12, 9, 6, 7, 4}|
 ----------------------------------- --------------------------------------- --------------------------------- 
 

Я бы хотел, чтобы результат был примерно таким при обработке файла:

  ----- ------ ------ ------ ------ ------ ------ ------ ------ ------ ------- 
| id  | col1 | col2 | col3 | col4 | col5 | col6 | col7 | col8 | col9 | col10 |
 ----- ------ ------ ------ ------ ------ ------ ------ ------ ------ ------- 
| id1 |  7   |  3   |  10  |  10  |  15  |  11  |  2   |  7   |  5   |  14   |
 ----- ------ ------ ------ ------ ------ ------ ------ ------ ------ ------- 
| id2 |  3   |  7   |  12  |  4   |  10  |  4   |  13  |  4   |  1   |  13   |
 ----- ------ ------ ------ ------ ------ ------ ------ ------ ------ ------- 
| id3 |  10  |  6   |  1   |  1   |  13  |  12  |  9   |  6   |  7   |  4    |
 ----- ------ ------ ------ ------ ------ ------ ------ ------ ------ ------- 
 

какой-нибудь простой и быстрый способ?

Спасибо

Комментарии:

1. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.

Ответ №1:

Вы можете изменить свой входной файл JSON ? Если это так, то создание массива объектов JS выполнит эту работу с помощью spark.read.json() :

 [    
    {
      "id": "id1",  
      "a": "7",
      "b": "3",
      "c": "10",
      "d": "10",
      "e": "15",
      "f": "11",
      "g": "2",
      "h": "7",
      "i": "5",
      "j": "14"
    },
    ...
]
 

Комментарии:

1. Можете ли вы предоставить код для того, какое решение было бы таким, если предположить, что это изменение было внесено?

2. Я не могу его редактировать, я получаю его вот так, в таком формате.

3. Насколько велик этот файл, который вы читаете с помощью spark? Если он небольшой, то прочитайте его с помощью какой-нибудь библиотеки json, а затем создайте df после его обработки. Если он действительно большой, у вас есть проблема. Кстати, afaik, массив объектов json также не будет работать «Обратите внимание, что файл, предлагаемый в качестве файла json, не является типичным файлом JSON. Каждая строка должна содержать отдельный, автономный допустимый объект JSON. Для получения дополнительной информации, пожалуйста, смотрите текстовый формат строк JSON, также называемый JSON с разделителями новой строки.» (здесь spark.apache.org/docs/latest/sql-data-sources-json.html )