Поделиться через


Преобразование "Синтаксический анализ" в потоке данных для сопоставления

ОБЛАСТЬ ПРИМЕНЕНИЯ: Фабрика данных Azure Azure Synapse Analytics

Совет

Попробуйте использовать фабрику данных в Microsoft Fabric, решение для аналитики с одним интерфейсом для предприятий. Microsoft Fabric охватывает все, от перемещения данных до обработки и анализа данных в режиме реального времени, бизнес-аналитики и отчетности. Узнайте, как бесплатно запустить новую пробную версию !

Потоки данных доступны в конвейерах как Фабрики данных Azure, так и Azure Synapse. Эта статья относится к потокам данных для сопоставления. Если вы не знакомы с преобразованиями, см. вводную статью Преобразование данных с помощью потока данных для сопоставления.

Используйте преобразование "Синтаксический анализ" для анализа текстовых столбцов данных, которые хранятся в виде строк в форме документа. Текущие поддерживаемые типы внедренных документов, которые можно анализировать, представлены JSON, XML и текстами с разделителями.

Настройка

На панели конфигурации анализа преобразования сначала выберите тип данных, содержащихся в столбцах, которые необходимо проанализировать. Также для этого преобразования можно настроить перечисленные ниже параметры конфигурации.

Параметры синтаксического анализа

Column

Аналогично производным столбцам и агрегатам, свойство Column — это свойство, в котором можно изменить существующий столбец, выбрав его из раскрывающегося списка. Также можно ввести имя нового столбца. ADF хранит проанализированные исходные данные в этом столбце. В большинстве случаев необходимо определить новый столбец, который анализирует входящее поле строки внедренного документа.

Expression

Используйте построитель выражений, чтобы задать исходные данные для анализа. Задание источника может быть таким же простым, как только выбор исходного столбца с автономными данными, которые вы хотите проанализировать, или создать сложные выражения для анализа.

Примеры выражений

  • Данные исходной строки: chrome|steel|plastic

    • Выражение: (desc1 as string, desc2 as string, desc3 as string)
  • Исходные данные JSON: {"ts":1409318650332,"userId":"309","sessionId":1879,"page":"NextSong","auth":"Logged In","method":"PUT","status":200,"level":"free","itemInSession":2,"registration":1384448}

    • Выражение: (level as string, registration as long)
  • Исходные вложенные данные JSON: {"car" : {"model" : "camaro", "year" : 1989}, "color" : "white", "transmission" : "v8"}

    • Выражение: (car as (model as string, year as integer), color as string, transmission as string)
  • Исходные данные XML: <Customers><Customer>122</Customer><CompanyName>Great Lakes Food Market</CompanyName></Customers>

    • Выражение: (Customers as (Customer as integer, CompanyName as string))
  • Исходный XML-код с данными атрибутов: <cars><car model="camaro"><year>1989</year></car></cars>

    • Выражение: (cars as (car as ({@model} as string, year as integer)))
  • Выражения с зарезервированными символами: { "best-score": { "section 1": 1234 } }

    • Приведенное выше выражение не работает, так как символ best-score -' интерпретируется как операция вычитания. Используйте переменную с нотацией с скобками в таких случаях, чтобы обработчик JSON интерпретировал текст буквально:
      var bestScore = data["best-score"];
      { bestScore : { "section 1": 1234 } }
      
  • Примечание. Если возникают ошибки, извлекающие атрибуты (в частности, @model) из сложного типа, обходной путь заключается в преобразовании сложного типа в строку, удалите символ @(в частности, replace(toString(your_xml_string_parsed_column_name.cars.car),'@',''), а затем используйте действие преобразования JSON.

Тип выходного столбца

Вот где вы настраиваете целевую схему выходных данных из синтаксического анализа, записанного в один столбец. Самый простой способ задать схему для выходных данных синтаксического анализа — выбрать "Обнаружить тип" в правом верхнем углу построителя выражений. ADF пытается автоматически определить схему из строкового поля, который выполняется синтаксический анализ и задать его для вас в выходном выражении.

Пример синтаксического анализа

В этом примере мы определили синтаксический анализ входящего поля jsonString, который является обычным текстом, но отформатирован как структура JSON. Мы будем хранить проанализированные результаты в формате JSON в новом столбце с именем json на основе этой схемы:

(trade as boolean, customers as string[])

Чтобы убедиться, что выходные данные сопоставлены правильно, используйте вкладку проверки и предварительный просмотр данных.

Используйте действие "Производный столбец" для извлечения иерархических данных (т. е. your_complex_column_name.car.model в поле выражения).

Примеры

source(output(
		name as string,
		location as string,
		satellites as string[],
		goods as (trade as boolean, customers as string[], orders as (orderId as string, orderTotal as double, shipped as (orderItems as (itemName as string, itemQty as string)[]))[])
	),
	allowSchemaDrift: true,
	validateSchema: false,
	ignoreNoFilesFound: false,
	documentForm: 'documentPerLine') ~> JsonSource
source(output(
		movieId as string,
		title as string,
		genres as string
	),
	allowSchemaDrift: true,
	validateSchema: false,
	ignoreNoFilesFound: false) ~> CsvSource
JsonSource derive(jsonString = toString(goods)) ~> StringifyJson
StringifyJson parse(json = jsonString ? (trade as boolean,
		customers as string[]),
	format: 'json',
	documentForm: 'arrayOfDocuments') ~> ParseJson
CsvSource derive(csvString = 'Id|name|year\n\'1\'|\'test1\'|\'1999\'') ~> CsvString
CsvString parse(csv = csvString ? (id as integer,
		name as string,
		year as string),
	format: 'delimited',
	columnNamesAsHeader: true,
	columnDelimiter: '|',
	nullValue: '',
	documentForm: 'documentPerLine') ~> ParseCsv
ParseJson select(mapColumn(
		jsonString,
		json
	),
	skipDuplicateMapInputs: true,
	skipDuplicateMapOutputs: true) ~> KeepStringAndParsedJson
ParseCsv select(mapColumn(
		csvString,
		csv
	),
	skipDuplicateMapInputs: true,
	skipDuplicateMapOutputs: true) ~> KeepStringAndParsedCsv

Скрипт потока данных

Синтаксис

Примеры

parse(json = jsonString ? (trade as boolean,
                                customers as string[]),
                format: 'json|XML|delimited',
                documentForm: 'singleDocument') ~> ParseJson

parse(csv = csvString ? (id as integer,
                                name as string,
                                year as string),
                format: 'delimited',
                columnNamesAsHeader: true,
                columnDelimiter: '|',
                nullValue: '',
                documentForm: 'documentPerLine') ~> ParseCsv