如何使用数据工厂将JSON数据从RESTAPI映射到Azure SQL

如何使用数据工厂将JSON数据从RESTAPI映射到Azure SQL,json,azure,azure-data-factory,Json,Azure,Azure Data Factory,我在azure数据工厂中有一个新管道。 我创建了数据集,一个来自RESTAPI(公共数据集): 然后我创建了一个azure sql表,其中的列显示在屏幕截图中 问题是,我不知道如何进行映射,因为这是一个复杂的JSON对象,我在映射设计器方面受到限制: 我如何映射日期 数据是否具有结构?如果是这样,您可以生成一个虚拟文件,将其放在接收器中并进行一次性映射。如果没有,您可以查找文件,在For-Each循环容器中迭代内容,并在SQL表中插入详细信息 例如 插入 选择“@item().name”、“

我在azure数据工厂中有一个新管道。 我创建了数据集,一个来自RESTAPI(公共数据集):

然后我创建了一个azure sql表,其中的列显示在屏幕截图中

问题是,我不知道如何进行映射,因为这是一个复杂的JSON对象,我在映射设计器方面受到限制:

我如何映射日期


数据是否具有结构?如果是这样,您可以生成一个虚拟文件,将其放在接收器中并进行一次性映射。如果没有,您可以查找文件,在For-Each循环容器中迭代内容,并在SQL表中插入详细信息

例如

插入
选择“@item().name”、“@item().address.city”、“@item().value”

重要的是要记住在正确的数组中迭代。如果不清楚,请告诉我。现在不在系统前面,所以不能添加屏幕截图。

我倾向于使用ELT方法进行这些操作,使用Web任务调用REST API,将JSON存储在SQL表中,然后使用SQL函数(如)分解JSON

示例管道:

使这种方法起作用的关键是存储过程参数的表达式。这将从Web任务获取整个JSON输出,并将其传递给进程。这是一个简单的日志记录过程,它将记录插入日志记录表:

@string(activity('Web1').output)
我登录到一个表,然后分解JSON,或者您可以直接在存储的proc参数上使用
OPENJSON
,例如

--INSERT INTO ...
SELECT
    CAST( [key] AS DATE ) AS timeSeriesDate,
    JSON_VALUE ( x.[value], '$."1. open"' ) AS [open],
    JSON_VALUE ( x.[value], '$."2. high"' ) AS [high],
    JSON_VALUE ( x.[value], '$."3. low"' ) AS [low],
    JSON_VALUE ( x.[value], '$."4. close"' ) AS [close],
    JSON_VALUE ( x.[value], '$."5. volume"' ) AS [volume]

FROM dbo.myLog
    CROSS APPLY OPENJSON(logDetails , '$."Time Series (Daily)"' ) x
--WHERE logId = 23333;
我的结果:


您能告诉我们您期望的数据是什么吗?类似于您希望如何存储这些json数据?在第一个屏幕截图中有表列、id、stock、date和value,基本上就是这样。上面的链接具有子结构,并且在sql屏幕截图中您可以看到这些列,如果您有时间,屏幕截图将非常有用:),提前感谢。
--INSERT INTO ...
SELECT
    CAST( [key] AS DATE ) AS timeSeriesDate,
    JSON_VALUE ( x.[value], '$."1. open"' ) AS [open],
    JSON_VALUE ( x.[value], '$."2. high"' ) AS [high],
    JSON_VALUE ( x.[value], '$."3. low"' ) AS [low],
    JSON_VALUE ( x.[value], '$."4. close"' ) AS [close],
    JSON_VALUE ( x.[value], '$."5. volume"' ) AS [volume]

FROM dbo.myLog
    CROSS APPLY OPENJSON(logDetails , '$."Time Series (Daily)"' ) x
--WHERE logId = 23333;