Вложенные объекты в реляционный формат

у меня есть данные JSON о профилях пользователей, которые я хочу в конечном итоге проанализировать с помощью SPSS. В настоящее время я импортировал данные в Google Refine, чтобы выполнить некоторую очистку данных. Однако моя проблема заключается в том, что исходный JSON состоит из вложенных объектов, а именно, например. раздел "professional_experience" с "компаниями", который включает несколько подобъектов/массивов (см. пример). Google уточняет это, создавая дополнительные строки с этой информацией. Однако это никоим образом не согласуется с «реляционной» (с точки зрения SQL) структурой представления/таблицы, которая мне понадобится для анализа данных с помощью SPSS или Excel или чего-то еще, поскольку есть другие подобъекты (школы, награды, и т. д.), которые также «тупо» заполняются в строках ниже «основной» записи высокого уровня, но не имеют прямого (по строкам/столбцам) отношения друг к другу (с учетом анализа).

Как я вижу, мне нужно будет извлечь эти (подобъект) столбцы и строки в собственную таблицу и создать некоторое отношение n: m или, по крайней мере, нормализовать его в ОДНУ таблицу (тогда, конечно, с принятием избыточности других невложенных атрибутов конечно).

В итоге я хочу получить одну непротиворечивую таблицу для проведения статистического анализа/кластеризации по определенным атрибутам. Я предполагаю, что уменьшение карты здесь не вариант.

Есть ли у кого-нибудь из вас идеи о том, как решить эту проблему, или, может быть, есть более простой способ напрямую работать с данными JSON?

{ "users": [
{
  "id": "123456_abcdef",
  "first_name": "Max",
  "last_name": "Mustermann",
  "display_name": "Max Mustermann",
  "page_name": "Max_Mustermann",
  "permalink": "https://www.xing.com/profile/Max_Mustermann",
  "employment_status": "EMPLOYEE",
  "gender": "m",
  "birth_date": {
    "day": 12,
    "month": 8,
    "year": 1963
  },
  "active_email": "[email protected]",
  "time_zone": {
    "name": "Europe/Copenhagen",
    "utc_offset": 2.0
  },
  "premium_services": [
    "SEARCH",
    "PRIVATEMESSAGES"
  ],
  "badges": [
    "PREMIUM",
    "MODERATOR"
  ],
  "wants": "einen neuen Job",
  "haves": "viele tolle Skills",
  "interests": "Flitzebogen schießen and so on",
  "organisation_member": "ACM, GI",
  "languages": {
    "de": "NATIVE",
    "en": "FLUENT",
    "fr": null,
    "zh": "BASIC"
  },
  "private_address": {
    "city": "Hamburg",
    "country": "DE",
    "zip_code": "20357",
    "street": "Privatstraße 1",
    "phone": "49|40|1234560",
    "fax": "||",
    "province": "Hamburg",
    "email": "[email protected]",
    "mobile_phone": "49|0155|1234567"
  },
  "business_address": {
    "city": "Hamburg",
    "country": "DE",
    "zip_code": "20357",
    "street": "Geschäftsstraße 1a",
    "phone": "49|40|1234569",
    "fax": "49|40|1234561",
    "province": "Hamburg",
    "email": "[email protected]",
    "mobile_phone": "49|160|66666661"
  },
  "web_profiles": {
    "qype": [
      "http://qype.de/users/foo"
    ],
    "google+": [
      "http://plus.google.com/foo"
    ],
    "other": [
      "http://blog.example.org"
    ],
    "homepage": [
      "http://example.org",
      "http://other-example.org"
    ]
  },
  "instant_messaging_accounts": {
    "skype": "1122334455",
    "googletalk": "max.mustermann"
  },
  "professional_experience": {
    "primary_company": {
      "id": "1_abcdef",
      "name": "XING AG",
      "title": "Softwareentwickler",
      "company_size": "201-500",
      "tag": null,
      "url": "http://www.xing.com",
      "career_level": "PROFESSIONAL_EXPERIENCED",
      "begin_date": "2010-01",
      "description": null,
      "end_date": null,
      "industry": "AEROSPACE",
      "form_of_employment": "FULL_TIME_EMPLOYEE",
      "until_now": true
    },
    "companies": [
      {
        "id": "1_abcdef",
        "name": "XING AG",
        "title": "Softwareentwickler",
        "company_size": "201-500",
        "tag": null,
        "url": "http://www.xing.com",
        "career_level": "PROFESSIONAL_EXPERIENCED",
        "begin_date": "2010-01",
        "description": null,
        "end_date": null,
        "industry": "AEROSPACE",
        "form_of_employment": "FULL_TIME_EMPLOYEE",
        "until_now": true
      },
      {
        "id": "24_abcdef",
        "name": "Ninja Ltd.",
        "title": "DevOps",
        "company_size": null,
        "tag": "NINJA",
        "url": "http://www.ninja-ltd.co.uk",
        "career_level": null,
        "begin_date": "2009-04",
        "description": null,
        "end_date": "2010-07",
        "industry": "ALTERNATIVE_MEDICINE",
        "form_of_employment": "OWNER",
        "until_now": false
      },
      {
        "id": "45_abcdef",
        "name": null,
        "title": "Wiss. Mitarbeiter",
        "company_size": null,
        "tag": "OFFIS",
        "url": "http://www.uni.de",
        "career_level": null,
        "begin_date": "2007",
        "description": null,
        "end_date": "2008",
        "industry": "APPAREL_AND_FASHION",
        "form_of_employment": "PART_TIME_EMPLOYEE",
        "until_now": false
      },
      {
        "id": "176_abcdef",
        "name": null,
        "title": "TEST NINJA",
        "company_size": "201-500",
        "tag": "TESTCOMPANY",
        "url": null,
        "career_level": "ENTRY_LEVEL",
        "begin_date": "1998-12",
        "description": null,
        "end_date": "1999-05",
        "industry": "ARTS_AND_CRAFTS",
        "form_of_employment": "INTERN",
        "until_now": false
      }
    ],
    "awards": [
      {
        "name": "Awesome Dude Of The Year",
        "date_awarded": 2007,
        "url": null
      }
    ]
  },
  "educational_background": {
    "degree": "MSc CE/CS",
    "primary_school": {
      "id": "42_abcdef",
      "name": "Carl-von-Ossietzky Universtät Schellenburg",
      "degree": "MSc CE/CS",
      "notes": null,
      "subject": null,
      "begin_date": "1998-08",
      "end_date": "2005-02"
    },
    "schools": [
      {
        "id": "42_abcdef",
        "name": "Carl-von-Ossietzky Universtät Schellenburg",
        "degree": "MSc CE/CS",
        "notes": null,
        "subject": null,
        "begin_date": "1998-08",
        "end_date": "2005-02"
      }
    ],
    "qualifications": [
      "TOEFLS",
      "PADI AOWD"
    ]
  }
}

] }


person kreck    schedule 06.11.2014    source источник


Ответы (2)


Вы должны иметь возможность импортировать JSON, используя графический интерфейс, выбирая прямо под объектом пользователя {} (а не на самом объекте пользователя), чтобы у вас были довольно чистые строки «записей», которые также содержат информацию заголовка для каждой записи строки, такие как «__профессиональный опыт» и т. д.

Загрузите и импортируйте этот проект с вашими примерными данными... обязательно измените представление сетки на режим ЗАПИСИ. (верхний левый угол сетки)

Пример проекта OpenRefine, показывающий JSON, импортированный в виде строк RECORD: https://drive.google.com/file/d/0B533WzlrxWraQnF0NHN4anpFNHM/view?usp=sharing

Оттуда вы можете экспортировать и изменять шаблон по своему усмотрению, даже выбирая только строки профессионального опыта, если хотите, вместе с идентификатором пользователя.

Если вам нужно иметь дело с массовым импортом строк записи JSON или из конечной точки данных или веб-службы, я бы предложил загрузить и использовать версии сообщества Pentaho или Talend ETL, чтобы справиться с этим для вас .... но вы, безусловно, можете используйте OpenRefine для начальной проверки и настройки. (Я предпочитаю Pentaho, у которого есть отличный предварительный просмотр строк записи правой кнопкой мыши в процессе преобразования, а Мартин предпочитает Talend).

person Thad Guidry    schedule 07.11.2014
comment
Большое спасибо за ваш ответ! Pentaho и Talend действительно полезны, однако я не могу понять, как их использовать с моей проблемой. Сейчас я пишу скрипт VBA, который нормализует данные! Однако мне действительно интересно, есть ли инструмент, который предлагает готовое преобразование из JSON в реляционную модель. Точно: у меня есть эти поля массива, которые добавляются как новые строки при уточнении, однако с семантической точки зрения это не имеет смысла, например. Школы и работодатели помещаются в одну дополнительную строку, несмотря на то, что они связаны только с пользователем, но не друг с другом.... - person kreck; 08.11.2014
comment
Да, именно для этого вы можете использовать Pentaho и Talend. Пройдите обучение или спросите на их форумах. Нет бесплатной пиццы. Удачи. - person Thad Guidry; 09.11.2014

Я не уверен, что правильно понимаю формат, который вы хотите создать, но я могу предоставить вам два варианта, с которых вы можете начать изучение:

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

OpenRefine позволяет легко заполнять записи, поэтому ваша информация, хранящаяся в верхних основных строках, переносится в несколько строк в каждой записи. После того, как вы заполните поле, которое вам нужно, пользователь (id), например, вернитесь в режим строки и, используя фасет, экспортируйте только подмножество вашей строки, которое вам нужно, в каждой таблице вашей базы данных.

Экспорт шаблона

параметр шаблона позволяет экспортировать данные в формате XML/ Формат JSON, чтобы вы могли вкладывать элементы. Однако эта функция не поддерживает отношение один ко многим.

Дайте нам знать, если это поможет.

person magdmartin    schedule 07.11.2014
comment
Большое спасибо за Ваш ответ! Я прокомментировал пост Thads. Моя проблема действительно сводится к тому факту, что данные массива помещаются в новые строки (в наборе записей), которые затем имитируют отношения (например, между школами и работодателями), которых семантически нет. Что мне нужно, так это преобразование в реляционную модель, которая связывает эти элементы массива с пользователем (id), но не друг с другом, помещая их в строки. Если у кого-то из вас есть какие-либо предложения, это было бы здорово. А пока я попытаюсь справиться с этим с помощью VBA/Excel. Но так как это не последний раз, когда мне нужно сделать это, идеи приветствуются. - person kreck; 08.11.2014
comment
хорошо, я отредактировал свой ответ с более подробной информацией. дайте мне знать, если это поможет - person magdmartin; 09.11.2014