分享方式:


剖析對應資料流程中的轉換

適用於:Azure Data Factory Azure Synapse Analytics

提示

試用 Microsoft Fabric 中的 Data Factory,這是適用於企業的全方位分析解決方案。 Microsoft Fabric 涵蓋從資料移動到資料科學、即時分析、商業智慧和報告的所有項目。 了解如何免費啟動新的試用版

Azure Data Factory 和 Azure Synapse Pipelines 中均可使用資料流。 本文適用於對應資料流。 如果您不熟悉轉換作業,請參閱簡介文章使用對應資料流轉換資料

使用「剖析」轉換來剖析資料中的文字資料行,這些資料行是文件格式的字串。 目前支援的可剖析內嵌文件類型為 JSON、XML 和分隔文字。

組態

在剖析轉換設定面板中,您會先挑選您想要剖析內嵌的資料行中包含的資料類型。 剖析轉換也包含下列組態設定。

Parse settings

資料行

類似於衍生的資料行和彙總,您可以使用 Column 屬性以從下拉式選擇器中選取該資料行,來修改現有資料行。 或者,您也可以在這裡輸入新資料行的名稱。 ADF 會將剖析的來源資料儲存至此資料行。 在大部分情況下,您會想要定義新的資料行,以剖析傳入的內嵌文件字串欄位。

運算式

使用運算式產生器來設定剖析的來源。 設定來源就像只選取來源資料行 (具有您想要剖析的獨立式資料) 一樣簡單,或者您可以建立複雜運算式來進行剖析。

運算式範例

  • 來源字串資料: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 會嘗試從您要剖析的字串欄位自動偵測結構描述,並在輸出運算式中為您設定。

Parse example

在此範例中,我們已定義傳入欄位 "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