Копирование данных из AZURE API для FHIR в Azure Synapse Analytics

В этой статье вы узнаете о трех способах копирования данных из AZURE API для FHIR в Azure Synapse Analytics, которая представляет собой безграничную службу аналитики, которая объединяет интеграцию данных, корпоративное хранилище данных и аналитику больших данных.

Использование средства OSS агента синхронизации FHIR для Synapse

Примечание

FHIR to Synapse Sync Agent — это средство открытый код, выпущенное по лицензии MIT, и не распространяется на соглашение об уровне обслуживания Майкрософт для служб Azure.

Агент синхронизации FHIR to Synapse — это проект Microsoft OSS, выпущенный по лицензии MIT. Это функция Azure, которая извлекает данные из сервера FHIR с помощью API ресурсов FHIR, преобразует их в иерархические файлы Parquet и записывает в Azure Data Lake практически в реальном времени. Он также содержит скрипт для создания внешних таблиц и представлений в бессерверном пуле SQL Synapse , указывающий на файлы Parquet.

Это решение позволяет запрашивать все данные FHIR с помощью таких средств, как Synapse Studio, SSMS и Power BI. Вы также можете получить доступ к файлам Parquet непосредственно из пула Synapse Spark. Это решение следует рассмотреть, если вы хотите получить доступ ко всем данным FHIR практически в реальном времени и хотите отложить пользовательское преобразование в подчиненных системах.

Инструкции по установке и использованию см. в документации по OSS.

Использование инструмента OSS генератора конвейера FHIR для CDM

Примечание

Генератор конвейера FHIR to CDM — это средство открытый код, выпущенное по лицензии MIT, и не распространяется на соглашение об уровне обслуживания Майкрософт для служб Azure.

Генератор конвейера FHIR to CDM — это проект Microsoft OSS, выпущенный по лицензии MIT. Это средство для создания конвейера ADF для копирования моментального снимка данных с сервера FHIR с помощью $EXPORT API, преобразования их в формат CSV и записи в папку CDM в Azure Data Lake Storage 2-го поколения. Средству требуется созданный пользователем файл конфигурации, содержащий инструкции для проецирования и выравнивания ресурсов и полей FHIR в таблицы. Вы также можете выполнить инструкции по созданию подчиненного конвейера в рабочей области Synapse, чтобы переместить данные из папки CDM в выделенный пул SQL Synapse.

Это решение позволяет преобразовывать данные в табличный формат по мере их записи в папку CDM. Это решение следует рассмотреть, если вы хотите преобразовать данные FHIR в пользовательскую схему после их извлечения с сервера FHIR.

Инструкции по установке и использованию см. в документации по OSS.

Загрузка экспортированных данных в Synapse с помощью T-SQL

В этом подходе вы используете операцию FHIR $export для копирования ресурсов FHIR в хранилище BLOB-объектов Azure Data Lake 2-го поколения (ADL 2-го поколения) в NDJSON формате. Затем вы загружаете данные из хранилища в бессерверные или выделенные пулы SQL в Synapse с помощью T-SQL. Эти шаги можно преобразовать в надежный конвейер перемещения данных с помощью конвейеров Synapse.

Служба хранилища Azure для Synapse с помощью $export.

Использование $export для копирования данных

Настройка $export на сервере FHIR

Azure API для FHIR реализует операцию, $export определенную спецификацией FHIR, для экспорта всего или отфильтрованного подмножества данных FHIR в NDJSON формате. Кроме того, он поддерживает деидентифицированный экспорт для анонимизации данных FHIR во время экспорта.

Чтобы экспортировать данные FHIR в хранилище BLOB-объектов Azure, сначала необходимо настроить сервер FHIR для экспорта данных в учетную запись хранения. Необходимо (1) включить управляемое удостоверение, (2) перейти к контроль доступа в учетной записи хранения и добавить назначение ролей, (3) выбрать учетную запись хранения для $export. Дополнительные пошаговые инструкции можно найти здесь.

Вы можете настроить сервер для экспорта данных в любой тип учетной записи хранения Azure, но мы рекомендуем экспортировать данные в ADL 2-го поколения для оптимального соответствия с Synapse.

Использование $export команды

После настройки сервера FHIR вы можете следовать документации , чтобы экспортировать ресурсы FHIR на уровне системы, пациента или группы. Например, вы можете экспортировать все данные FHIR, связанные с пациентами, в с помощью следующей Group$export команды, в которой вы указываете имя хранилища BLOB-объектов ADL 2-го поколения в поле {{BlobContainer}}:

https://{{FHIR service base URL}}/Group/{{GroupId}}/$export?_container={{BlobContainer}}  

Вы также можете использовать _type параметр в приведенном $export выше вызове, чтобы ограничить ресурсы, которые требуется экспортировать. Например, следующий вызов экспортирует только Patientресурсы , MedicationRequestи Observation :

https://{{FHIR service base URL}}/Group/{{GroupId}}/$export?_container={{BlobContainer}}&
_type=Patient,MedicationRequest,Condition

Дополнительные сведения о различных поддерживаемых параметрах см $export . в разделе о параметрах запроса.

Использование Synapse для аналитики

Создание рабочей области Synapse

Перед использованием Synapse вам потребуется рабочая область Synapse. Вы создадите службу Azure Synapse Analytics на портал Azure. Дополнительные пошаговые инструкции можно найти здесь. Для создания рабочей области требуется ADLSGEN2 учетная запись. Ваша Azure Synapse рабочая область будет использовать эту учетную запись хранения для хранения данных рабочей области Synapse.

После создания рабочей области можно просмотреть ее в Synapse Studio, войдя в рабочую область в https://web.azuresynapse.netили запустив Synapse Studio в портал Azure.

Создание связанной службы между хранилищем Azure и Synapse

Чтобы скопировать данные в Synapse, необходимо создать связанную службу, которая подключает учетную запись хранения Azure, в которую вы экспортировали данные, с Synapse. Дополнительные пошаговые инструкции можно найти здесь.

  1. В Synapse Studio перейдите на вкладку Управление и в разделе Внешние подключения выберите Связанные службы.
  2. Выберите Создать , чтобы добавить новую связанную службу.
  3. Выберите Azure Data Lake Storage 2-го поколения в списке и нажмите кнопку Продолжить.
  4. Введите учетные данные для проверки подлинности. По завершении нажмите кнопку Создать.

Теперь, когда у вас есть связанная служба между хранилищем ADL 2-го поколения и Synapse, вы можете использовать пулы Synapse SQL для загрузки и анализа данных FHIR.

Выбор между бессерверным и выделенным пулом SQL

Azure Synapse Analytics предлагает два разных пула SQL: бессерверный пул SQL и выделенный пул SQL. Бессерверный пул SQL обеспечивает гибкость запроса данных непосредственно в хранилище BLOB-объектов с помощью бессерверной конечной точки SQL без подготовки ресурсов. Выделенный пул SQL обладает вычислительной мощностью для высокой производительности и параллелизма и рекомендуется для возможностей хранения данных корпоративного масштаба. Дополнительные сведения о двух пулах SQL см. на странице документации Synapse по архитектуре SQL.

Использование бессерверного пула SQL

Так как он бессерверный, нет инфраструктуры для настройки или поддержки кластеров. Вы можете начать запрашивать данные из Synapse Studio сразу после создания рабочей области.

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

SELECT * FROM  
OPENROWSET(bulk 'https://{{youraccount}}.blob.core.windows.net/{{yourcontainer}}/Patient.ndjson', 
FORMAT = 'csv', 
FIELDTERMINATOR ='0x0b', 
FIELDQUOTE = '0x0b')  
WITH (doc NVARCHAR(MAX)) AS rows     
CROSS APPLY OPENJSON(doc)     
WITH ( 
    ResourceId VARCHAR(64) '$.id', 
    Active VARCHAR(10) '$.active', 
    FullName VARCHAR(100) '$.name[0].text', 
    Gender VARCHAR(20) '$.gender', 
       ...
) 

В приведенном выше запросе функция обращается к файлам OPENROWSET в службе хранилища Azure, OPENJSON анализирует текст JSON и возвращает входные свойства JSON в виде строк и столбцов. При каждом выполнении этого запроса бессерверный пул SQL считывает файл из хранилища BLOB-объектов, анализирует JSON и извлекает поля.

Вы также можете материализовать результаты в формате Parquet во внешней таблице , чтобы повысить производительность запросов, как показано ниже.

-- Create External data source where the parquet file will be written 
CREATE EXTERNAL DATA SOURCE [MyDataSource] WITH ( 
    LOCATION = 'https://{{youraccount}}.blob.core.windows.net/{{exttblcontainer}}' 
); 
GO 

-- Create External File Format 
CREATE EXTERNAL FILE FORMAT [ParquetFF] WITH ( 
    FORMAT_TYPE = PARQUET, 
    DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec' 
); 
GO 

CREATE EXTERNAL TABLE [dbo].[Patient] WITH ( 
        LOCATION = 'PatientParquet/', 
        DATA_SOURCE = [MyDataSource], 
        FILE_FORMAT = [ParquetFF] 
) AS 
SELECT * FROM  
OPENROWSET(bulk 'https://{{youraccount}}.blob.core.windows.net/{{yourcontainer}}/Patient.ndjson' 
-- Use rest of the SQL statement from the previous example --

Использование выделенного пула SQL

Выделенный пул SQL поддерживает управляемые таблицы и иерархический кэш для повышения производительности в памяти. Вы можете импортировать большие данные с помощью простых запросов T-SQL, а затем использовать возможности подсистемы распределенных запросов для выполнения высокопроизводительной аналитики.

Самый простой и быстрый способ загрузить данные из хранилища в выделенный пул SQL — использовать COPY команду в T-SQL, которая может считывать файлы CSV, Parquet и ORC. Как и в приведенном ниже примере запроса, используйте COPY команду , чтобы загрузить NDJSON строки в табличную структуру.

-- Create table with HEAP, which is not indexed and does not have a column width limitation of NVARCHAR(4000) 
CREATE TABLE StagingPatient ( 
Resource NVARCHAR(MAX) 
) WITH (HEAP) 
COPY INTO StagingPatient 
FROM 'https://{{yourblobaccount}}.blob.core.windows.net/{{yourcontainer}}/Patient.ndjson' 
WITH ( 
FILE_TYPE = 'CSV', 
ROWTERMINATOR='0x0a', 
FIELDQUOTE = '', 
FIELDTERMINATOR = '0x00' 
) 
GO

Получив строки JSON в приведенной StagingPatient выше таблице, можно создать различные табличные форматы данных с помощью OPENJSON функции и сохранить результаты в таблицах. Ниже приведен пример SQL-запроса для создания Patient таблицы путем извлечения нескольких полей из Patient ресурса:

SELECT RES.* 
INTO Patient 
FROM StagingPatient
CROSS APPLY OPENJSON(Resource)   
WITH (
  ResourceId VARCHAR(64) '$.id',
  FullName VARCHAR(100) '$.name[0].text',
  FamilyName VARCHAR(50) '$.name[0].family',
  GivenName VARCHAR(50) '$.name[0].given[0]',
  Gender VARCHAR(20) '$.gender',
  DOB DATETIME2 '$.birthDate',
  MaritalStatus VARCHAR(20) '$.maritalStatus.coding[0].display',
  LanguageOfCommunication VARCHAR(20) '$.communication[0].language.text'
) AS RES 
GO

Дальнейшие действия

В этой статье вы узнали о трех разных способах копирования данных FHIR в Synapse.

Далее вы можете узнать о том, как деидентифицировать данные FHIR при их экспорте в Synapse для защиты PHI.

FHIR® является зарегистрированным товарным знаком HL7 и используется с разрешения HL7.