[英]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 數據庫的表中。 到目前為止,我還沒有找到一種直接的方法。
我試過的:
有什么辦法可以解決這個問題嗎?
您可以將該值存儲在 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.