簡體   English   中英

Azure 數據工廠從嵌套在 json 的字符串中復制數據 json

[英]Azure Data Factory copy data from json string nested in a json

我正在從第三方 API 獲取數據,它以 JSON 負載響應。 但是,這個 JSON 包含另一個 JSON object,存儲為包含轉義字符的字符串。 例子:

{
    "aggregationType": "IDENTITY",
    "outputs": [
        {
            "name": "Sinusoid|Sinusoid"
        }
    ],
    "value": "{\"dataX\":[1,2,3,4],\"dataY\":[1,4,9,16]}"
}

在文件的第一部分,我們有一些常規參數,如“聚合類型”和“輸出”,但最后一個參數“值”是我正在談論的 JSON object。

我想做的是將“dataX”和“dataY”arrays 一起輸入到 SQL 數據庫的表中。 到目前為止,我還沒有找到一種直接的方法。

我試過的:

  • 使用簡單的復制活動,但我只能訪問整個“值”字段,不能將“dataX”與“dataY”分開,更不用說數組的各個值了。
  • 然后使用查找活動將“值”存儲在變量中。 從這里我可以在 ADF 中找到可用的 JSON object,但我發現將數據發送到數據庫的唯一方法是使用包含復制活動的 ForEach 活動。 由於 dataX 和 dataY 實際上要大得多,因此在我調試時這似乎要花很長時間。
  • 僅將“值”object 復制到 blob 並嘗試從那里檢索數據。 這沒有用,因為 object 最終總是以初始 " 標記和 \ 轉義字符存儲。

有什么辦法可以解決這個問題嗎?

您可以將該值存儲在 SQL 中的臨時表中,然后創建一個存儲過程以將對象分離為 arrays

JSON_Value 可以幫你提取值:

SELECT JSON_VALUE('{"dataX": [1,2,3,4]}', '$.dataX') AS 'Output';

在您的存儲過程中,您可以嘗試使用上述查詢並在 SQL 表中插入值

為了擴展,根據@Pratik Somaiya 的提示,我編寫了一個存儲過程,它完成將數據插入持久表的工作。

我不得不使用 WHILE 循環,但感覺不太對,所以我仍在尋找更好的解決方案。

CREATE OR ALTER PROCEDURE dataset_outputs_from_adf
    @json_output_value NVARCHAR(MAX),
    @output_name NVARCHAR(100)
AS
    DECLARE @i INT = 0
    WHILE JSON_VALUE(@json_output_value,CONCAT('$.dataX[',@i,']')) IS NOT NULL
    BEGIN
        INSERT INTO my_table
        VALUES (
            @output_name,
            JSON_VALUE(
                @json_output_value,
                CONCAT('$.dataX[',@i,']')
            ),
            JSON_VALUE(
                @json_output_value,
                CONCAT('$.dataY[',@i,']')
            )
        )
        SET @i = @i + 1
    END
GO

通過使用 output 名稱參數化數據工廠,我應該能夠在沒有重復代碼的情況下使整個事情可重復。

據我了解,您可以檢索嵌入的“值” JSON 但它保留其轉義字符。 您想將 arrays [1,2,3,4][1,4,9,16]傳遞給關系數據庫(Microsoft SQL 服務器?)以存儲它們。

可以使用表達式json()將嵌入的“值”轉換為可引用的 JSON。 這會處理轉義字符。

@json(variables('payload')).dataX

將按預期返回數組[1,2,3,4]

如何最好地將其放入 SQL 服務器? 我們僅限於 ADF 支持的活動,這實際上歸結為存儲過程 (SP)。 使用表值參數是理想的,但在當前的 ADF 中是不可能的。 所以我建議將它作為字符串傳遞給 SP。

@string(json(variables('payload')).dataX)

這看起來與上面的非常相似,但將是一個string而不是array

在 SP 中,有幾種方法可以解析此字符串。 如果你的版本支持, STRING_SPLIT會很方便。 請注意,傳遞的字符串將保留其前導和尾隨方括號。 這些可以在 ADF 或 SQL 中刪除,在哪里都沒有關系。

由於數據是 JSON,因此使用OPENJSON可能更有意義。 假設我們將 dataX 的內容傳遞給 SP 參數@dataX varchar(4000) 在 SP 里面我們寫

create procedure dbo.HandleData
  @dataX varchar(4000),
  @dataY varchar(4000)
as

insert dbo.SomeTable(ColumnX, ColumnY)
select x.value, y.value
from OPENJSON(@dataX) x
inner join OPENJSON(@dataY) y
    on y.[key] = x.[key];

如果 arrays 可能具有不同的長度,或者存在 NULL 或非整數值等,則可能需要更多代碼。當然,來自 OPENJSON 的結果集可用於加入或 SP 內的任何其他目的。

如果原始有效負載中的 dataX 和 dataY 最終出現在同一個 DB 表中,則可以調用 SP 兩次,每個調用一次。 或者,您可以在 ADF 中合並他們的 arrays 並調用 SP 一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM