Transform JSON from REST API to Azure Synapse Analytics

Viewed 556

I need to digest time series data from API to Synapse Analytics database. API returns JSON, which I would like to transform into table holding date, value and name of the time serie. I´m able to return following JSON with Python:

import requests
from pandas.io.json import json_normalize

url = 'https://api.citivelocity.com/markets/analytics/chartingbe/rest/external/authed/data?client_id='+CitiClientId
payload = {'startDate': 20200705, 'endDate': 20200712, 'tags': ['FX.SPOT.EUR.CHF.CITI'],'frequency':'DAILY'}
headers = {'authorization': 'Bearer'+access_token}
response = requests.post(url, json=payload, headers=headers)

print(response.text)

->

{"frequency":"DAILY","body":{"FX.SPOT.EUR.CHF.CITI":{"x":[20200706,20200707,20200708,20200709,20200710],"c":[1.06365,1.06255,1.06265,1.06155,1.06325],"type":"SERIES"}},"status":"OK"}

Unfortunately with Postman or Azure Data Factory I get no data returned. Calling API is successfull with ADF and Postman, but I guess something is not correct in the the request.

ADF would be my preferred choice, but using databricks is ok if it is possible to write data directly to Synapse.

-> How to transform JSON to a dataframe (date, value and the name of time series) in python? From dataframe I think I´ll manage to write to Synapse. I can limit the data volumes so using json_normalize should be fine?

One tempting option would be to save json first to database, and do transformations with sql, but I suppose doing it with python would be more elegant/robust solution.

    CREATE TABLE #SERIES WITH (DISTRIBUTION=ROUND_ROBIN) AS SELECT 'FX.SPOT.EUR.CHF.CITI' AS SERIES_NAME,  '20200706, 20200707, 20200708, 20200709, 20200710' as dt, '1.06365, 1.06255, 1.06265, 1.06155, 1.06325' as cl

DECLARE @DT NVARCHAR(400)
DECLARE @CL NVARCHAR(400)

SELECT @DT=DT FROM #SERIES
SELECT @CL=CL FROM #SERIES

SELECT
DT.SERIES_NAME, DT.VALUE AS DT, CL.VALUE AS CL
FROM
(
SELECT row_number() OVER (ORDER BY (SELECT NULL)) AS RN, SERIES_NAME, LTRIM(dt.value) AS VALUE
FROM  #SERIES
CROSS APPLY STRING_SPLIT(@DT, ',') dt
) DT
JOIN
(SELECT row_number() OVER (ORDER BY (SELECT NULL)) AS RN, SERIES_NAME, LTRIM(CL.value) AS VALUE
FROM  #SERIES
CROSS APPLY STRING_SPLIT(@CL, ',') CL
) CL ON DT.SERIES_NAME = CL.SERIES_NAME AND DT.RN = CL.RN

->

    SERIES_NAME DT  CL
FX.SPOT.EUR.CHF.CITI    20200706    1.06365
FX.SPOT.EUR.CHF.CITI    20200707    1.06255
FX.SPOT.EUR.CHF.CITI    20200708    1.06265
FX.SPOT.EUR.CHF.CITI    20200709    1.06155
FX.SPOT.EUR.CHF.CITI    20200710    1.06325

Thanks.

0 Answers
Related