Разобрать структуру JSON как объект JSON в Scala / Spark - PullRequest
1 голос
/ 16 марта 2020

Я храню в своей коллекции MongoDB огромный список JSON строк. Для простоты я извлек образец документа в текстовый файл businessResource.json:

{
   "data" : {
        "someBusinessData" : {
            "capacity" : {
                "fuelCapacity" : NumberLong(282)
            },
            "someField" : NumberLong(16),
            "anotherField" : {
                "isImportant" : true,
                "lastDateAndTime" : "2008-01-01T11:11",
                "specialFlag" : "YMA"
            },
   ...
}

Моя проблема : как я могу преобразовать "someBusinessData" в объект JSON, используя Спарк / Scala?

Если я сделаю это (например, используя json4s или lift- json), я надеюсь, что смогу выполнить над ними базовые операции c, например, проверив их на равенство.

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

Вот как я получаю данные:

 val df: DataFrame = (someSparkSession).sqlContext.read.json("src/test/resources/businessResource.json")

 val myData: DataFrame = df.select("data.someBusinessData")
 myData.printSchema

Схема показывает:

root
 |-- someBusinessData: struct (nullable = true)
 |    |-- capacity: struct (nullable = true)

Поскольку "someBusinessData" является структурой, я не могу получить ее как String , Когда я пытаюсь печатать, используя myData.first.getStruct(0), я получаю строку, содержащую значения, но не ключи: [[[282],16,[true,2008-01-01T11:11,YMA]

Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

На самом деле мой пост содержит два вопроса:

  1. Как я могу преобразовать "someBusinessData" в JSON объект, используя Spark / Scala?
  2. Как можно Я получаю объект JSON в виде строки?

1. Преобразование в JSON объект

То, что я делал, уже создавало DataFrame, по которому можно перемещаться как JSON объект:

//read json file as Json and select the needed data
val df: DataFrame = sparkSession.sqlContext.read.json(filePath).select("data.someBusinessData")

Если вы делаете .textFile вы правильно получаете строку, но разбираете JSON, вам нужно прибегнуть к ответу Шу.

2. Как я могу получить объект JSON в виде строки?

Тривиально:

    df.toJSON.first
0 голосов
/ 16 марта 2020

Вместо использования .json используйте .textFile для чтения вашего json файла.

  • Затем мы конвертируем rdd в dataframe (будет иметь только один строковый столбец).

Example:

//read json file as textfile and create df

val df=spark.sparkContext.textFile("<json_file_path>").toDF("str")

//use get_json_object function to traverse json string
df.selectExpr("""get_json_object(str,"$.data.someBusinessData")""").show(false)

//+-----------------------------------------------------------------------------------------------------------------------------------------------------+
//|get_json_object(str,$.data.someBusinessData)                                                                                                         |
//+-----------------------------------------------------------------------------------------------------------------------------------------------------+
//|{"capacity":{"fuelCapacity":"(282)"},"someField":"(16)","anotherField":{"isImportant":true,"lastDateAndTime":"2008-01-01T11:11","specialFlag":"YMA"}}|
//+-----------------------------------------------------------------------------------------------------------------------------------------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...