Leo Yeh's Blog

SAS Viya (114)

教學目標

初步了解如何將 Github 中的儲存庫中的 Python 檔案同步至 SAS Viya 平台中 SAS Model Manager 專案中的特定模型進行管理。(此篇為程式開發心得分享,並且產品實際操作)

重點概念

首先 SAS Viya 分析平台比起 SAS 9 平台已經越來越開放,並且 SAS Viya 分析平台已經有提供 REST API 讓開發者能夠以 SAS Viya 分析平台為基礎開發客製化的應用程式,以利簡化複雜流程和解決關鍵問題,但是要如何整合開開放源始碼進行應用呢?此時我們能夠先試想一個應用情境,並且根據應用情境思考如何整合 SAS Viya 分析平台所提供的 REST API 開發應用程式,請注意針對不同應用情境開發應用程式時不會僅使用單一平台的 REST API,而是會整合多個不同平台的 REST API,像是如果我們要將 Github 中的儲存庫中的 Python 檔案同步至 SAS Viya 平台中 SAS Model Manager 專案中的特定模型進行管理該如何進行客製化開發呢?此時我們主要能夠先分成三大部份,分別為:

  1. 取得 SAS Model Manager 中的屬性設定。
  2. 下載 Github 中的儲存庫中的 Python 檔案。
  3. 上傳 Python 檔案至 SAS Model Manager 專案中。

接著針對取得 SAS Model Manager 中模型的屬性設定,我們主要能夠透過 SAS Viya 的 REST API 撰寫以下三段程式碼進行實作,分別為:

取得使用 SAS Viya 平台的存取憑證

1
2
3
4
5
6
base_url = '<SAS Viya URL>'
consul_token = '<Consul Token>'
url = base_url + '/SASLogon/oauth/clients/consul?callback=false&serviceId=app'
headers = {'X-Consul-Token': consul_token}
r = requests.post(url, headers=headers)
access_token = json.loads(r.text)['access_token']

取得 Model Manager 中所有模型的基本資料

1
2
3
4
url = base_url + '/modelRepository/models'
headers = {'Accept': 'application/vnd.sas.collection+json','Authorization': 'Bearer ' + access_token}
r = requests.get(url, headers=headers)
models = json.loads(r.text)

取 Model Manager 中所有模型的屬性資料

1
2
3
4
5
6
7
8
9
10
i = 0
for m in models['items']:
modelId = m['id']
headers = {'Authorization': 'Bearer ' + access_token}
url = base_url + '/modelRepository/models/' + modelId
r = requests.get(url,headers = headers)
models['items'][i]['properties'] = {}
for property in json.loads(r.text)['properties']:
models['items'][i]['properties'][property['name']]=property['value']
i = i + 1

當完成上述程式碼之後,就能夠取得 SAS Model Manager 中模型的屬性設定,此時我們就能夠建立有關 Github 儲存庫相關的參數設定,像是模型相關的 Github 存取憑證、儲存庫名稱和資料夾名稱設定為 SAS Model Manager 中模型的屬性,但是為何要這樣做呢?因為 SAS Model Manager 已經提供簡單易用的界面進行操作,並且能夠針對不同的模型分別進行屬性設定。

再來下載 Github 中的儲存庫中的 Python 檔案,我們主要能夠透過撰寫以下程式碼進行實作,分別為:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from github import Github
g = Github('<Github Access Token>')
gitAccountName = '<Github Account Name>'
github_lists = []
id = 0
for repo in g.get_user().get_repos():
project_repos.append({'name':repo.name})
github_lists.append({'repo_name':repo.name,'folders':[]})
repo = g.get_repo(account + "/" + repo.name)
contents = repo.get_contents("")
folders = []
while contents:
file_content = contents.pop(0)
if file_content.type == "dir":
folders.append(file_content.path)
github_lists[id]['folders'] = folders
id = id + 1

當完成上述程式碼之後,就能夠取得 Github 儲存庫中對應所有資料夾的名稱,此時我們就能夠將 SAS Model Manager 中模型的名稱和 Github 儲存庫中資料夾的名稱進行對應,以利將 Github 儲存庫資料夾中的相關檔案上傳至 SAS Model Manager 模型中,以利後續進行模型管理的生命週期。

最後上傳 Python 檔案至 SAS Model Manager 專案中,我們主要能夠透過 SAS Viya 的 REST API 和 PyGithub 套件撰寫以下程式碼進行實作,分別為:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
projectName = '<Project Name>'
modelName = '<Model Name>'
gitRepoName = '<Github Repository Name>'
gitFolderName = '<Github Folder Name>'
gitAccountName = '<Github Account Name>'
repo = g.get_repo( gitAccountName + '/' + gitRepoName )
contents = repo.get_contents('')
while contents:
file_content = contents.pop(0)
if file_content.type == 'dir':
contents.extend(repo.get_contents(file_content.path))
else:
if gitFolderName in file_content.path and '.py' in file_content.path:
url = base_url + '/modelRepository/projects'
headers = {'Accept': 'application/vnd.sas.collection+json','Authorization': 'Bearer ' + access_token}
r = requests.get(url, headers=headers)
json_object = json.loads(r.text)
projectId = ''
for item in json_object['items']:
if item['name'] == projectName:
projectId = item['id']
url = base_url + '/modelRepository/models'
headers = {'Accept': '','Authorization': 'Bearer ' + access_token}
r = requests.get(url, params={}, headers=headers)
json_object = json.loads(r.text)
modelId = ''
for item in json_object['items']:
if item['name'] == modelName:
modelId = item['id']
url = base_url + '/modelRepository/models/' + modelId + '/contents?name=' + file_content.name
headers = {'Content-Type': 'application/octet-stream','Authorization': 'Bearer ' + access_token}
r = requests.post(url, data=file_content.decoded_content, headers=headers)

其中透過 PyGithub 套件取出的檔案內容主要需針對 github.ContentFile 透過 decoded_content 才能夠取得檔案的原始內容,並且再來透過 REST API 的 POST 方法宣告 Content Type 為 application/octet-stream 將檔案的原始內容上傳 Python 檔案至 SAS Model Manager 專案對應的模型中。

總結雖然我們能夠透過 Python 程式碼整合 SAS Viya 分析平台所提供的 REST API 開發應用程式,但是還有許多部份需要透過專業能力進行調整,像是程式碼如何進行維護、效能如何進行優化、… 等。

相關資源

⬅️ Go back