簡體   English   中英

使用SDK在Azure函數中將Azure Blob存儲到JSON

[英]Azure blob storage to JSON in azure function using SDK

我正在嘗試創建一個計時器觸發azure函數,該函數從blob中獲取數據,對其進行聚合,然后將這些聚合放入cosmosDB中。 我以前曾嘗試在azure函數中使用綁定來將blob用作輸入,但我被告知是不正確的(請參見此線程: Azure函數python命名參數沒有值 )。

我現在正在使用SDK,並且遇到以下問題:

import sys, os.path
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), 'myenv/Lib/site-packages')))
import json
import pandas as pd
from azure.storage.blob import BlockBlobService 

data = BlockBlobService(account_name='accountname', account_key='accountkey')
container_name = ('container')
generator = data.list_blobs(container_name)

for blob in generator:
print("{}".format(blob.name))
json = json.loads(data.get_blob_to_text('container', open(blob.name)))


df = pd.io.json.json_normalize(json)
print(df)

這會導致錯誤:

IOError: [Errno 2] No such file or directory: 'test.json'

我意識到這可能是絕對路徑問題,但是我不確定這在Azure存儲中如何工作。 關於如何規避這一點的任何想法?


通過執行以下操作使其“起作用”:

for blob in generator:
loader = data.get_blob_to_text('kvaedevdystreamanablob',blob.name,if_modified_since=delta)
json = json.loads(loader.content)

這適用於一個json文件,即我在存儲中只有一個json文件,但是當添加更多文件時,出現此錯誤:

ValueError: Expecting object: line 1 column 21907 (char 21906)

即使我將if_modified_since添加為僅吸收一個blob, if_modified_since發生這種情況。 如果我知道有什么會更新。 隨時歡迎您的幫助。


另一個更新:我的數據通過流分析進入,然后到達Blob。 我選擇將數據作為數組輸入,這就是發生錯誤的原因。 當流終止時,blob不會立即將]追加到json中的EOF行,因此json文件無效。 現在將嘗試在流分析中使用逐行而不是數組。

弄清楚了。 最后,這是一個非常簡單的解決方案:

我必須確保Blob中的每個json條目少於1024個字符,否則它將創建新行,從而使讀取行成為問題。

遍歷每個blob文件,讀取並添加到列表的代碼如下:

data = BlockBlobService(account_name='accname', account_key='key')
generator = data.list_blobs('collection')

dataloaded = []
for blob in generator:
loader = data.get_blob_to_text('collection',blob.name)
trackerstatusobjects = loader.content.split('\n')
for trackerstatusobject in trackerstatusobjects:
    dataloaded.append(json.loads(trackerstatusobject))

由此,您可以添加到數據框並執行您想做的任何事情:)希望這在有人偶然遇到類似問題時有所幫助。

暫無
暫無

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

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